modules: hal_nxp: mcux: Add MCUX SDK NG glue layer readme

Add the readme to show the implementation.

Signed-off-by: Jason Yu <zejiang.yu@nxp.com>
This commit is contained in:
Jason Yu 2025-05-19 10:54:14 +08:00 committed by Daniel DeGrasse
commit ede6186759
2 changed files with 216 additions and 1 deletions

View file

@ -2,7 +2,9 @@
# #
# SPDX-License-Identifier: Apache-2.0 # SPDX-License-Identifier: Apache-2.0
# Expose the driver header include path, so that the shim driver can use them. # SDK driver headers are also used out of hal_nxp module, for example
# <zephyr>/soc/nxp/imxrt/imxrt118x/soc.c includes fsl_clock.h, fsl_pmu.h.
# So expose the driver header include path, make the shim driver can use them.
get_target_property(MCUXSDK_INCLUDE_DIRS ${MCUX_SDK_PROJECT_NAME} INTERFACE_INCLUDE_DIRECTORIES) get_target_property(MCUXSDK_INCLUDE_DIRS ${MCUX_SDK_PROJECT_NAME} INTERFACE_INCLUDE_DIRECTORIES)
if(NOT MCUXSDK_INCLUDE_DIRS STREQUAL MCUXSDK_INCLUDE_DIRS-NOTFOUND) if(NOT MCUXSDK_INCLUDE_DIRS STREQUAL MCUXSDK_INCLUDE_DIRS-NOTFOUND)
zephyr_include_directories(${MCUXSDK_INCLUDE_DIRS}) zephyr_include_directories(${MCUXSDK_INCLUDE_DIRS})

View file

@ -0,0 +1,213 @@
# MCUX SDK and Zephyr Integration
This document describes how NXP MCUX SDK code integrates with Zephyr.
Currently, MCUX SDK NG (Next Generation) is primarily used.
Some SOCs supported by Zephyr are not supported by MCUX SDK NG,
these SOCs still use MCUX SDK NG drivers. MCUX SDK provides source code,
and this glue layer provides Kconfig and CMake files to select and
configure MCUX source code.
## Folder Structure
```
mcux
├── CMakeLists.txt # CMake entry point for MCUX SDK glue layer
├── Kconfig.mcux # Kconfig options for configuring MCUX SDK
├── mcux-sdk
│ └── CMakeLists.txt # CMake entry for SOCs not supported by SDK NG
└── mcux-sdk-ng
├── basic.cmake # Basic settings and functions for MCUX SDK NG
├── fixup.cmake # Fixes to ensure MCUX SDK NG works with Zephyr
├── CMakeLists.txt # CMake entry for MCUX SDK NG supported SOCs
├── components # Files for MCUX SDK NG components
├── device # Files for MCUX SDK NG device
├── drivers # Files for MCUX SDK NG drivers
└── middleware # Files for MCUX SDK NG middleware
```
## Architecture
### MCUX SDK NG CMake Architecture
MCUX SDK NG code is located in the folder:
*<zephyr_workspace>/modules/hal/nxp/mcux/mcux-sdk-ng*.
#### Adding Contents to Project
MCUX SDK's code is modularized and controlled by separate CMake files.
A typical MCUX SDK NG driver CMake file looks like this:
```cmake
if(CONFIG_MCUX_COMPONENT_driver.acmp)
mcux_add_source(SOURCES fsl_acmp.c fsl_acmp.h)
mcux_add_include(INCLUDES .)
endif()
```
When the variable `CONFIG_MCUX_COMPONENT_driver.acmp` is enabled, the driver source
files `fsl_acmp.c` and `fsl_acmp.h` are added to the project, along with
their include path.
The functions `mcux_add_source` and `mcux_add_include` are defined in MCUX SDK NG
CMake extensions, located in the folder
*<zephyr_workspace>/modules/hal/nxp/mcux/mcux-sdk-ng/cmake*.
These functions provide additional features, such as adding contents
based on specific conditions.
Here's an example:
```cmake
if (CONFIG_MCUX_COMPONENT_driver.fro_calib)
mcux_add_source( SOURCES fsl_fro_calib.h )
mcux_add_library(
LIBS ../iar/iar_lib_fro_calib_cm33_core0.a
TOOLCHAINS iar)
mcux_add_library(
LIBS ../arm/keil_lib_fro_calib_cm33_core0.lib
TOOLCHAINS mdk)
mcux_add_library(
LIBS ../gcc/libfro_calib_hardabi.a
TOOLCHAINS armgcc)
mcux_add_include( INCLUDES . )
endif()
```
In this example, different libraries are added to the project based on
the selected toolchain.
#### Device Level CMake Files
Here are example folder structures for two SOCs: MIMXRT633S (single-core) and
MIMXRT685S (dual-core with 'cm33' and 'hifi4' cores).
```
RT600/
├── MIMXRT633S
│ ├── CMakeLists.txt # CMake entry for MIMXRT633S
│ ├── variable.cmake
│ ├── drivers/ # SOC specific drivers
│ ├── arm/ # Files for ARM toolchains (MDK)
│ ├── gcc/ # Files for armgcc
│ ├── iar/ # Files for IAR
│ ├── MIMXRT633S.h # SOC header
│ ├── system_MIMXRT633S.c
│ └── system_MIMXRT633S.h
└── MIMXRT685S
├── CMakeLists.txt
├── variable.cmake
├── drivers/
├── arm/
├── gcc/
├── iar/
├── xtensa/
├── cm33 # CMake files for cm33 core
│ ├── CMakeLists.txt
│ └── variable.cmake
├── hifi4 # CMake files for hifi4 core
│ ├── CMakeLists.txt
│ └── variable.cmake
├── MIMXRT685S_cm33.h
├── MIMXRT685S_dsp.h
├── system_MIMXRT685S_cm33.c
├── system_MIMXRT685S_cm33.h
├── system_MIMXRT685S_dsp.c
└── system_MIMXRT685S_dsp.h
```
Key differences between single-core and dual-core SOC folders:
1. Dual-core SOCs have separate folders for each core (cm33, hifi4)
2. Dual-core SOCs have separate header and system files for
each core with distinct suffixes (MIMXRT685S_cm33.h, MIMXRT685S_dsp.h)
Each SOC provides a "variable.cmake" file allowing upper layer CMake files
to determine appropriate names for different SOCs or cores. Upper layer
CMake files only need to provide `DEVICE` (SOC name, e.g., `MIMXRT685S`)
and `core_id` (subfolder name like `cm33`, `hifi4`; empty for single-core SOCs).
**NOTE**:
In MCUX SDK NG, `core_id` and `core_id_suffix_name` are distinct concepts.
Take RT685S as an example:
- `core_id`: matches subfolder names (`cm33`, `hifi4`)
- `core_id_suffix_name`: matches header file suffixes (`cm33`, `dsp`)
While these are typically identical, some exceptions exist due to
historical reasons (e.g., RT685 HIFI4). Future SOCs will maintain
consistency between these names.
### Integration with Zephyr
#### MCUX SDK NG Glue Layer
- [basic.cmake](./mcux-sdk-ng/basic.cmake): Provides basic settings and functions for MCUX SDK NG,
including necessary CMake extensions and additional function definitions.
- CMake Files for MCUX SDK NG code selection:
- [device.cmake](./mcux-sdk-ng/device/device.cmake)
- [components.cmake](./mcux-sdk-ng/components/components.cmake)
- [drivers.cmake](./mcux-sdk-ng/drivers/drivers.cmake)
- [middleware.cmake](./mcux-sdk-ng/middleware/middleware.cmake)
Each file manages its corresponding MCUX SDK NG code. Example content:
```cmake
set_variable_ifdef(CONFIG_SENSOR_MCUX_ACMP CONFIG_MCUX_COMPONENT_driver.acmp)
```
When `CONFIG_SENSOR_MCUX_ACMP` is enabled, the ACMP driver is added to the project.
- [fixup.cmake](./mcux-sdk-ng/fixup.cmake): Contains fixes for MCUX SDK NG
compatibility with Zephyr.
To use MCUX SDK NG code, include these files in the top-level CMakeLists.txt:
```cmake
include(basic.cmake)
include(middleware/middleware.cmake)
include(components/components.cmake)
include(drivers/drivers.cmake)
include(device/device.cmake)
include(fixup.cmake)
```
#### MCUX SDK NG Device Level Code
MCUX SDK NG device CMake files require `DEVICE` and `core_id`.
Zephyr's `CONFIG_SOC` corresponds to MCUX SDK's `DEVICE`, while
`CONFIG_MCUX_CORE_SUFFIX` corresponds to MCUX SDK's `core_id_suffix_name`.
Since these are typically identical, the glue layer converts
`CONFIG_MCUX_CORE_SUFFIX` to `core_id` before passing it to
MCUX SDK NG CMake. Exceptions are handled through hard-coding
in the glue layer.
This functionality is implemented in
[device/device.cmake](./mcux-sdk-ng/device/device.cmake).
#### MCUX SDK NG Unsupported SOCs
These SOCs utilize MCUX SDK NG code for latest features and bug fixes,
along with device-specific code like header files.
Their [CMakeLists.txt](./mcux-sdk/CMakeLists.txt) typically follows this pattern:
```cmake
include(basic.cmake)
include(middleware/middleware.cmake)
include(components/components.cmake)
include(drivers/drivers.cmake)
# ...
# Device specific settings
# ...
include(fixup.cmake)
```
For these SOCs, `basic.cmake` and `fixup.cmake` are required,
while other CMake files (`middleware.cmake`, `components.cmake`, `drivers.cmake`)
are optional.