| .. | ||
| boards/evkbimxrt1050 | ||
| CMSIS | ||
| components | ||
| devices/MIMXRT1052 | ||
| docs | ||
| middleware | ||
| rtos/freertos/freertos-kernel | ||
| tools/cmake_toolchain_files | ||
| .clang-tidy | ||
| CMakeLists.txt | ||
| COPYING-BSD-3 | ||
| LA_OPT_NXP_Software_License.txt | ||
| MIMXRT1052xxxxB_manifest_v3_15.xml | ||
| README.md | ||
| sdk_tree.txt | ||
| SW-Content-Register.txt | ||
Добавление и использование драйверов NXP SDK
Руководство по добавлению новых драйверов из SDK в проект и их использованию в BSP и firmware.
Структура sdk/
sdk/
├── CMakeLists.txt # все SDK таргеты
├── CMSIS/
│ └── Include/
└── devices/
└── MIMXRT1052/
├── system_MIMXRT1052.c
├── drivers/ # здесь живут все драйверы
│ ├── fsl_flexcan.c / .h
│ ├── fsl_lpuart.c / .h
│ └── ...
└── utilities/
Как добавить новый драйвер
Шаг 1 — Найти исходник драйвера
В SDK смотришь devices/MIMXRT1052/drivers/. Каждый драйвер — пара .c + .h файлов.
Если нужен FlexCAN — это fsl_flexcan.c + fsl_flexcan.h.
Для сложных драйверов (USDHC, SEMC) загляни в NXP-овский cmake файл рядом с драйвером — там указаны зависимости. Например файл driver_flexcan.cmake содержит:
target_sources(... fsl_flexcan.c)
# зависит от driver_common
Это подскажет какие ещё таргеты нужно добавить в зависимости.
Шаг 2 — Добавить таргет в sdk/CMakeLists.txt
Открываешь sdk/CMakeLists.txt и добавляешь через макрос add_sdk_driver:
# Простой драйвер без дополнительных зависимостей
add_sdk_driver(flexcan fsl_flexcan.c)
# Драйвер с зависимостью от другого SDK таргета
add_sdk_driver(flexcan fsl_flexcan.c)
target_link_libraries(sdk_flexcan PUBLIC sdk_clock)
Макрос add_sdk_driver(ИМЯ ФАЙЛ) автоматически:
- Создаёт таргет
sdk_ИМЯ - Добавляет
fsl_ИМЯ.cкак источник - Прокидывает
devices/MIMXRT1052/driversкак PUBLIC include - Линкует
sdk_deviceкак PUBLIC зависимость
Шаг 3 — Использовать в BSP или firmware
В BSP — если драйвер нужен для инициализации платы (clock, gpio, common):
# bsp/CMakeLists.txt
target_link_libraries(bsp_board PUBLIC
sdk_device
sdk_clock # ← добавил
sdk_common # ← добавил
)
PUBLIC — транзитивно подтянется во все firmware таргеты которые линкуют bsp_board.
В firmware — если драйвер нужен только конкретному проекту:
# firmware/test/CMakeLists.txt
target_link_libraries(firmware_test PRIVATE
bsp_board # транзитивно даёт sdk_device, sdk_clock, sdk_common
sdk_flexcan # ← добавил только здесь — нужен только тестовой прошивке
sdk_lpuart
)
PRIVATE — драйвер линкуется только в этот бинарь, не экспортируется наружу.
Справочник таргетов sdk/
| Таргет | Файл | Когда нужен |
|---|---|---|
sdk_device |
system_MIMXRT1052.c |
Всегда (базовый) |
sdk_common |
fsl_common.c |
Всегда (базовые утилиты) |
sdk_clock |
fsl_clock.c |
Всегда (тактирование) |
sdk_gpio |
fsl_gpio.c |
Кнопки, светодиоды, дискретные входы |
sdk_lpuart |
fsl_lpuart.c |
UART1, RS_RX в режиме UART |
sdk_flexcan |
fsl_flexcan.c |
CAN |
sdk_usdhc |
fsl_usdhc.c |
uSD слот |
sdk_semc |
fsl_semc.c |
SDRAM (обычно не нужен — DCD) |
sdk_flexspi |
fsl_flexspi.c |
QSPI Flash (обычно не нужен — FDCB) |
sdk_lcdifv2 |
fsl_lcdifv2.c |
LCD интерфейс |
sdk_pwm |
fsl_pwm.c |
FlexPWM (VOLUME, подсветка) |
sdk_adc |
fsl_adc.c |
ADC |
Правила использования PUBLIC / PRIVATE
PUBLIC — используй в bsp_board и sdk таргетах
(зависимость экспортируется транзитивно)
PRIVATE — используй в firmware таргетах
(зависимость только для этого бинаря)
Пример транзитивной цепочки:
firmware_test
└── bsp_board (PRIVATE)
├── sdk_device (PUBLIC) ← подтягивается в firmware_test автоматически
├── sdk_clock (PUBLIC) ← подтягивается в firmware_test автоматически
└── sdk_common (PUBLIC) ← подтягивается в firmware_test автоматически
Благодаря этому в firmware_test/CMakeLists.txt не нужно явно прописывать sdk_device, sdk_clock, sdk_common — они приходят через bsp_board.
Пример: добавить поддержку I2C (LPI2C) для BM8563
# 1. sdk/CMakeLists.txt — добавляешь таргет
add_sdk_driver(lpi2c fsl_lpi2c.c)
# 2. bsp/CMakeLists.txt — если I2C нужен для инициализации платы
target_link_libraries(bsp_board PUBLIC sdk_lpi2c)
# ИЛИ firmware/app/CMakeLists.txt — если только в боевой прошивке
target_link_libraries(firmware_app PRIVATE sdk_lpi2c)