147 lines
6.1 KiB
Markdown
147 lines
6.1 KiB
Markdown
# Добавление и использование драйверов NXP SDK
|
||
|
||
Руководство по добавлению новых драйверов из SDK в проект и их использованию в BSP и firmware.
|
||
|
||
---
|
||
|
||
## Структура sdk/
|
||
|
||
```bash
|
||
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` содержит:
|
||
|
||
```cmake
|
||
target_sources(... fsl_flexcan.c)
|
||
# зависит от driver_common
|
||
```
|
||
|
||
Это подскажет какие ещё таргеты нужно добавить в зависимости.
|
||
|
||
### Шаг 2 — Добавить таргет в sdk/CMakeLists.txt
|
||
|
||
Открываешь `sdk/CMakeLists.txt` и добавляешь через макрос `add_sdk_driver`:
|
||
|
||
```cmake
|
||
# Простой драйвер без дополнительных зависимостей
|
||
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):
|
||
|
||
```cmake
|
||
# bsp/CMakeLists.txt
|
||
target_link_libraries(bsp_board PUBLIC
|
||
sdk_device
|
||
sdk_clock # ← добавил
|
||
sdk_common # ← добавил
|
||
)
|
||
```
|
||
|
||
`PUBLIC` — транзитивно подтянется во все firmware таргеты которые линкуют `bsp_board`.
|
||
|
||
**В firmware** — если драйвер нужен только конкретному проекту:
|
||
|
||
```cmake
|
||
# 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
|
||
|
||
```bash
|
||
PUBLIC — используй в bsp_board и sdk таргетах
|
||
(зависимость экспортируется транзитивно)
|
||
|
||
PRIVATE — используй в firmware таргетах
|
||
(зависимость только для этого бинаря)
|
||
```
|
||
|
||
**Пример транзитивной цепочки:**
|
||
|
||
```bash
|
||
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
|
||
|
||
```cmake
|
||
# 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)
|
||
```
|