lift_indicator_suite/sdk/README.md
Ezra Maccabee ce717ce9dd # 3
СБорка базового проекта
2026-03-06 15:27:39 +03:00

6.1 KiB
Raw Permalink Blame History

Добавление и использование драйверов 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)