From 3ec4aad771af41d4fd1488d079744e5ff37a4c18 Mon Sep 17 00:00:00 2001 From: Ezra Maccabee Date: Wed, 6 May 2026 11:13:46 +0300 Subject: [PATCH] # bsp_sd: on process --- bsp/CMakeLists.txt | 22 + bsp/generated/sdmmc_config.c | 150 ++ bsp/generated/sdmmc_config.h | 80 + bsp/qspi_flash/README.md | 201 +- bsp/sd/CMakeLists.txt | 10 + bsp/sd/README.md | 130 ++ bsp/sd/include/bsp/sd.h | 35 + bsp/sd/src/sd.c | 93 + firmware/test/CMakeLists.txt | 6 +- firmware/test/PLAN.md | 714 +++---- firmware/test/fatfs/CMakeLists.txt | 29 + firmware/test/fatfs/include/ffconf.h | 78 + firmware/test/fatfs/src/diskio.c | 62 + firmware/test/src/main.c | 54 + port/CMakeLists.txt | 1 + port/README.md | 4 +- port/fatfs/CMakeLists.txt | 1 + port/fatfs/sd/CMakeLists.txt | 19 + port/fatfs/sd/include/port/fatfs/diskio_sd.h | 20 + port/fatfs/sd/src/diskio_sd.c | 37 + project_tree.txt | 300 +++ sdk/CMakeLists.txt | 72 +- sdk/middleware/fatfs/source/diskio.h | 104 +- sdk/sdk_tree.txt | 1738 ++++++++++++++++++ 24 files changed, 3327 insertions(+), 633 deletions(-) create mode 100644 bsp/generated/sdmmc_config.c create mode 100644 bsp/generated/sdmmc_config.h create mode 100644 bsp/sd/CMakeLists.txt create mode 100644 bsp/sd/README.md create mode 100644 bsp/sd/include/bsp/sd.h create mode 100644 bsp/sd/src/sd.c create mode 100644 firmware/test/fatfs/CMakeLists.txt create mode 100644 firmware/test/fatfs/include/ffconf.h create mode 100644 firmware/test/fatfs/src/diskio.c create mode 100644 port/fatfs/CMakeLists.txt create mode 100644 port/fatfs/sd/CMakeLists.txt create mode 100644 port/fatfs/sd/include/port/fatfs/diskio_sd.h create mode 100644 port/fatfs/sd/src/diskio_sd.c create mode 100644 project_tree.txt create mode 100644 sdk/sdk_tree.txt diff --git a/bsp/CMakeLists.txt b/bsp/CMakeLists.txt index 5943fbe..38b1aaf 100644 --- a/bsp/CMakeLists.txt +++ b/bsp/CMakeLists.txt @@ -18,6 +18,7 @@ add_subdirectory(button) add_subdirectory(usb_cdc) add_subdirectory(sdram) add_subdirectory(qspi_flash) +add_subdirectory(sd) # Подавляем предупреждения при компиляции собственных .c файлов библиотеки target_compile_options(bsp_board PRIVATE -w) @@ -31,6 +32,27 @@ target_compile_definitions(bsp_board PUBLIC CPU_MIMXRT1052CVJ5B) # sdk_device PUBLIC — транзитивно подтянется во все firmware таргеты target_link_libraries(bsp_board PUBLIC sdk_device sdk_clock sdk_common sdk_lpuart) + +# ----------------------------------------------------------------------------- +# bsp_sdmmc_config — board-level конфигурация SDMMC (BOARD_SD_Config и пр.) +# Отдельный таргет, чтобы sdk_sdmmc_sd не тянулся во все бинарники через +# bsp_board. Линкуется только теми, кто реально работает с SD: bsp_usd → +# bsp_sdmmc_config +# ----------------------------------------------------------------------------- +add_library(bsp_sdmmc_config STATIC generated/sdmmc_config.c) + +target_include_directories(bsp_sdmmc_config PUBLIC generated) + +target_compile_definitions(bsp_sdmmc_config PUBLIC SD_ENABLED) + +target_link_libraries( + bsp_sdmmc_config + PUBLIC bsp_board # board.h, pin_mux.h, clock_config.h, fsl_gpio.h + PUBLIC sdk_sdmmc_sd # fsl_sd.h, fsl_sdmmc_host.h, sdmmchost_t +) + +target_compile_options(bsp_sdmmc_config PRIVATE -w) + # ------------------------------------------------------------------ # Boot-стратегии — INTERFACE # ------------------------------------------------------------------ diff --git a/bsp/generated/sdmmc_config.c b/bsp/generated/sdmmc_config.c new file mode 100644 index 0000000..fe08625 --- /dev/null +++ b/bsp/generated/sdmmc_config.c @@ -0,0 +1,150 @@ +/* + * sdmmc_config.c — board-level реализация SDMMC для MIMXRT1052CVJ5B. + */ + +#define SD_ENABLED /* нужен для fsl_sd.h, до включений */ + +#include "sdmmc_config.h" + +#include "fsl_iomuxc.h" + +/* --------------------------------------------------------------------------- + * Статические объекты хоста (не экспортируются) + * ------------------------------------------------------------------------- */ + +/* DMA-дескрипторы: некэшируемая секция, выравнивание по требованию USDHC. */ +AT_NONCACHEABLE_SECTION_ALIGN( + static uint32_t s_dma_buf[BOARD_SDMMC_HOST_DMA_DESCRIPTOR_BUFFER_SIZE], + SDMMCHOST_DMA_DESCRIPTOR_BUFFER_ALIGN_SIZE); + +static sdmmchost_t s_host; +static sd_detect_card_t s_cd; +static sd_io_voltage_t s_io_voltage = { + .type = BOARD_SDMMC_SD_IO_VOLTAGE_TYPE, + .func = NULL, /* управление через регистры USDHC, не через внешний LDO */ +}; + +/* --------------------------------------------------------------------------- + * Внутренние функции + * ------------------------------------------------------------------------- */ + +/* + * Возвращает частоту источника USDHC1. + * + * BOARD_BootClockRUN() уже настроил SysPll и PFD0 → не трогаем PLL. + * Просто возвращаем известное значение из clock_config.h. + */ +static uint32_t get_usdhc1_src_clock_hz(void) +{ + return BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT; /* 198 000 000 Hz */ +} + +/* + * Управление питанием карты: GPIO1[19] (SdPwr), active-high. + */ +static void sd_power_control(bool enable) +{ + GPIO_PinWrite(BOARD_SDMMC_SD_PWR_GPIO_BASE, BOARD_SDMMC_SD_PWR_GPIO_PIN, enable ? 1U : 0U); +} + +/* + * Инициализация GPIO питания карты как выход, начальное состояние — выкл. + * Вызывается однократно из BOARD_SD_Config(). + */ +static void sd_power_init(void) +{ + const gpio_pin_config_t cfg = { + .direction = kGPIO_DigitalOutput, + .outputLogic = 0U, /* питание выключено при старте */ + .interruptMode = kGPIO_NoIntmode, + }; + GPIO_PinInit(BOARD_SDMMC_SD_PWR_GPIO_BASE, BOARD_SDMMC_SD_PWR_GPIO_PIN, &cfg); +} + +/* + * Динамическая настройка пад-конфигурации линий SD в зависимости от частоты. + * Вызывается SDMMC стеком при смене скорости (HS, SDR50, SDR104). + * + * speed/strength подобраны по таблице EVK — для данной платы проверить + * при трассировке > 50 MHz. + */ +static void sd_pin_config(uint32_t freq) +{ + uint32_t speed; + uint32_t strength; + + if (freq <= 50000000U) + { + speed = 0U; + strength = 7U; + } + else if (freq <= 100000000U) + { + speed = 2U; + strength = 7U; + } + else + { + speed = 3U; + strength = 7U; + } + + const uint32_t pad = IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK | + IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK | + IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | + IOMUXC_SW_PAD_CTL_PAD_PUS(1) /* 47k pull-up */ + | IOMUXC_SW_PAD_CTL_PAD_DSE(strength); + + const uint32_t clk_pad = IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK | + IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | + IOMUXC_SW_PAD_CTL_PAD_PUS(0) /* no pull on CLK */ + | IOMUXC_SW_PAD_CTL_PAD_DSE(strength); + + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_00_USDHC1_CMD, pad); + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_01_USDHC1_CLK, clk_pad); + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_02_USDHC1_DATA0, pad); + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_03_USDHC1_DATA1, pad); + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_04_USDHC1_DATA2, pad); + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_05_USDHC1_DATA3, pad); +} + +/* --------------------------------------------------------------------------- + * Публичный API + * ------------------------------------------------------------------------- */ + +#ifdef SD_ENABLED +void BOARD_SD_Config(void *card, sd_cd_t cd, uint32_t host_irq_priority, void *user_data) +{ + assert(card != NULL); + + /* --- host --- */ + s_host.dmaDesBuffer = s_dma_buf; + s_host.dmaDesBufferWordsNum = BOARD_SDMMC_HOST_DMA_DESCRIPTOR_BUFFER_SIZE; + s_host.enableCacheControl = BOARD_SDMMC_HOST_CACHE_CONTROL; + + sd_card_t *sd = (sd_card_t *) card; + + sd->host = &s_host; + sd->host->hostController.base = BOARD_SDMMC_SD_HOST_BASEADDR; + sd->host->hostController.sourceClock_Hz = get_usdhc1_src_clock_hz(); + + /* --- card detect: HostCD, GPIO-прерывание не нужно --- */ + s_cd.cdDebounce_ms = BOARD_SDMMC_SD_CD_DEBOUNCE_MS; + s_cd.type = BOARD_SDMMC_SD_CD_TYPE; /* kSD_DetectCardByHostCD */ + s_cd.cardDetected = NULL; /* SDK читает PRSSTAT самостоятельно */ + s_cd.callback = cd; /* обычно NULL из bsp_sd */ + s_cd.userData = user_data; + + sd->usrParam.cd = &s_cd; + sd->usrParam.pwr = sd_power_control; + sd->usrParam.ioStrength = sd_pin_config; + sd->usrParam.ioVoltage = &s_io_voltage; + sd->usrParam.maxFreq = BOARD_SDMMC_SD_HOST_SUPPORT_SDR104_FREQ; + + /* --- GPIO питания --- */ + sd_power_init(); + + /* --- приоритет прерывания хоста --- */ + NVIC_SetPriority(BOARD_SDMMC_SD_HOST_IRQ, host_irq_priority); +} +#endif /* SD_ENABLED */ \ No newline at end of file diff --git a/bsp/generated/sdmmc_config.h b/bsp/generated/sdmmc_config.h new file mode 100644 index 0000000..f055d2b --- /dev/null +++ b/bsp/generated/sdmmc_config.h @@ -0,0 +1,80 @@ +/* + * sdmmc_config.h — board-level конфигурация SDMMC для MIMXRT1052CVJ5B. + * + * SD_CD : GPIO_B1_12 → USDHC1.usdhc_cd_b (периферийный сигнал, не GPIO). + * Детект через USDHC_GetPresentStatusFlags → kSD_DetectCardByHostCD. + * GPIO-прерывание на CD не нужно. + * + * SD_PWR: GPIO_AD_B1_03 → GPIO1[19] (SdPwr). + * Active-high: 1 = питание включено. + */ + +#ifndef BSP_SDMMC_CONFIG_H +#define BSP_SDMMC_CONFIG_H + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" +#include "fsl_sdmmc_common.h" +#include "fsl_sdmmc_host.h" + +#ifdef SD_ENABLED +#include "fsl_sd.h" +#endif + +/* --------------------------------------------------------------------------- + * Host controller + * ------------------------------------------------------------------------- */ +#define BOARD_SDMMC_SD_HOST_BASEADDR USDHC1 +#define BOARD_SDMMC_SD_HOST_IRQ USDHC1_IRQn +#define BOARD_SDMMC_SD_HOST_IRQ_PRIORITY 5U + +/* --------------------------------------------------------------------------- + * Card detect + * CD_B подключён как периферийный сигнал USDHC1 — детект через регистр + * PRSSTAT, а не через GPIO. Прерывание и callback на CD не используются. + * ------------------------------------------------------------------------- */ +#define BOARD_SDMMC_SD_CD_TYPE kSD_DetectCardByHostCD +#define BOARD_SDMMC_SD_CD_DEBOUNCE_MS 100U + +/* --------------------------------------------------------------------------- + * Card power — GPIO1[19] (GPIO_AD_B1_03, SdPwr), active-high + * ------------------------------------------------------------------------- */ +#define BOARD_SDMMC_SD_PWR_GPIO_BASE GPIO1 +#define BOARD_SDMMC_SD_PWR_GPIO_PIN 19U + +/* --------------------------------------------------------------------------- + * IO voltage — управляется хостом (LDO внутри USDHC) + * ------------------------------------------------------------------------- */ +#define BOARD_SDMMC_SD_IO_VOLTAGE_TYPE kSD_IOVoltageCtrlByHost + +/* --------------------------------------------------------------------------- + * DMA и кэш + * ------------------------------------------------------------------------- */ +#define BOARD_SDMMC_HOST_DMA_DESCRIPTOR_BUFFER_SIZE 32U +#define BOARD_SDMMC_DATA_BUFFER_ALIGN_SIZE 32U +#define BOARD_SDMMC_HOST_CACHE_CONTROL kSDMMCHOST_CacheControlRWBuffer + +/* --------------------------------------------------------------------------- + * Максимальная частота (SDR104) + * ------------------------------------------------------------------------- */ +#define BOARD_SDMMC_SD_HOST_SUPPORT_SDR104_FREQ 200000000U + +#if defined(__cplusplus) +extern "C" +{ +#endif + +#ifdef SD_ENABLED + /* + * Конфигурирует sd_card_t: host, CD, power, IO voltage, частота. + * cd и userData передаются NULL из bsp_sd — CD управляется хостом. + */ + void BOARD_SD_Config(void *card, sd_cd_t cd, uint32_t host_irq_priority, void *user_data); +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* BSP_SDMMC_CONFIG_H */ \ No newline at end of file diff --git a/bsp/qspi_flash/README.md b/bsp/qspi_flash/README.md index 95882f1..94f5e30 100644 --- a/bsp/qspi_flash/README.md +++ b/bsp/qspi_flash/README.md @@ -23,23 +23,38 @@ ### Проблема -Прошивка исполняется XIP из того же Flash через FlexSPI AHB-интерфейс. -CPU непрерывно читает инструкции через AHB, который маршрутизируется по -LUT-слоту 0. Любая IP-команда FlexSPI прерывает AHB-путь на время -выполнения команды. Если в момент IP-команды CPU попытается фетчить -инструкцию из Flash — HardFault. +Прошивка исполняется XIP из Flash через FlexSPI AHB-интерфейс. +CPU непрерывно фетчит инструкции из Flash по AHB — через LUT-слот 0. +Любая IP-команда FlexSPI блокирует AHB-путь на время выполнения. +Если в этот момент CPU попытается фетчить инструкцию из Flash — **HardFault**. -### Решение +### Решение: ITCM + IRQ lock -Все функции, обращающиеся к регистрам FlexSPI (IPCMD, IPCR0/1, RFDR, TFDR, -LUT, INTR, …), размещены в **ITCM** через `AT_QUICKACCESS_SECTION_CODE`. -Инструкции этих функций загружаются в ITCM при старте и CPU не обращается -к Flash во время их выполнения. +Все функции, обращающиеся к регистрам FlexSPI, размещены в **ITCM** +(`0x00000000`) через `AT_QUICKACCESS_SECTION_CODE`. ITCM подключён к CPU +по выделенной шине (не AHB), поэтому фетч инструкций из ITCM не конкурирует +с IP-командами FlexSPI. -AHB prefetch отключается (`AHBCR.PREFETCHEN = 0`) перед каждой серией -IP-транзакций и восстанавливается после (`qspi_ahb_disable` / `qspi_ahb_enable`). -Это дополнительно предотвращает спекулятивные AHB-чтения Flash во время -IP-команд. +Дополнительно, каждая публичная операция выполняется под **IRQ lock** +(`qspi_irq_lock` / `qspi_irq_unlock` с `__get_PRIMASK()` + `DSB` + `ISB`): +это гарантирует, что прерывание не застанет FlexSPI в середине IP-транзакции. +IRQ unlock восстанавливает предыдущий `PRIMASK`, не включает IRQ безусловно — +вызов из уже заблокированного контекста корректен. + +AHB prefetch отключается (`AHBCR.PREFETCHEN = 0`) перед серией IP-транзакций +и восстанавливается после. + +### Обязательный дефайн в CMakeLists потребителя + +```cmake +target_compile_definitions(firmware_test PRIVATE + __STARTUP_INITIALIZE_RAMFUNCTION # ← обязательно + __STARTUP_CLEAR_BSS) +``` + +Без `__STARTUP_INITIALIZE_RAMFUNCTION` startup-файл NXP SDK не копирует +`CodeQuickAccess` секцию из Flash в ITCM. В ITCM остаются нули. Первый же +вызов любой ITCM-функции вызывает **HardFault**. --- @@ -47,55 +62,68 @@ IP-команд. ### Почему не Enter 4-Byte Mode (0xB7) -FDCB задаёт XIP слот 0 с 24-bit адресацией для **всех** чипов. Если -переключить чип в 4-byte mode командой 0xB7, следующий AHB-фетч -инструкции из Flash пойдёт через слот 0 с 24-bit адресом, а чип теперь -ждёт 32-bit — **HardFault**. +FDCB фиксирует XIP-слот 0 в режиме 24-bit адресации на всех чипах. +Переключение чипа командой 0xB7 сломало бы XIP — AHB продолжал бы +посылать 24-bit адреса, чип ждал бы 32-bit → **HardFault**. ### Dedicated 4-byte address opcodes -W25Q256/512 имеют отдельный набор opcodes, принимающих 32-bit адрес -**независимо от текущего режима адресации чипа**: +W25Q256/512 принимают 32-bit адрес через отдельный набор opcodes — без +изменения режима адресации чипа: -| Операция | 3-byte opcode (W25Q64/128) | 4-byte opcode (W25Q256/512) | -|-------------------|----------------------------|-----------------------------| -| Sector Erase 4KB | `0x20` | `0x21` | -| Block Erase 32KB | `0x52` | `0x5C` | -| Block Erase 64KB | `0xD8` | `0xDC` | -| Quad Page Program | `0x32` | `0x34` | -| Quad Output Read | `0x6B` | `0x6C` | +| Операция | W25Q64/128 (3-byte) | W25Q256/512 (4-byte) | +|-------------------|---------------------|----------------------| +| Sector Erase 4KB | `0x20` | `0x21` | +| Block Erase 32KB | `0x52` | `0x5C` | +| Block Erase 64KB | `0xD8` | `0xDC` | +| Quad Page Program | `0x32` | `0x34` | +| IP Quad Out Read | `0x6B` | `0x6C` | -Слот 0 (XIP) **не изменяется**. Чип остаётся в 24-bit режиме. XIP работает -непрерывно на всех чипах. +Слот 0 (XIP) **не изменяется**. XIP работает непрерывно на всех чипах. --- ## LUT-слоты -| Слот | Константа | Команда | Зависит от чипа | -|------|----------------|----------------------------|-----------------| -| 0 | (XIP, FDCB) | Quad Read | Нет (не трогаем)| -| 1 | LSEQ_READ_SR1 | Read SR1 (0x05) | Нет | -| 2 | LSEQ_WR_EN | Write Enable (0x06) | Нет | -| 3 | LSEQ_ERASE_4K | Sector Erase (0x20/0x21) | Да | -| 4 | LSEQ_PP_QUAD | Quad Page Prog (0x32/0x34) | Да | -| 5 | LSEQ_JEDEC | Read JEDEC (0x9F) | Нет | -| 6 | LSEQ_READ_SR2 | Read SR2 (0x35) | Нет | -| 7 | LSEQ_WR_SR2 | Write SR2 (0x31) | Нет | -| 8 | LSEQ_READ_SR3 | Read SR3 (0x15) | Нет | -| 9 | LSEQ_ERASE_32K | Block Erase 32KB (0x52/0x5C)| Да | -| 10 | LSEQ_ERASE_64K | Block Erase 64KB (0xD8/0xDC)| Да | -| 11 | LSEQ_IP_READ | Quad Out Read (0x6B/0x6C) | Да | +| Слот | Константа | Команда | Зависит от чипа | +|------|----------------|-----------------------------|-----------------| +| 0 | (XIP, FDCB) | Quad Read | Нет (не трогаем)| +| 1 | LSEQ_READ_SR1 | Read SR1 (0x05) | Нет | +| 2 | LSEQ_WR_EN | Write Enable (0x06) | Нет | +| 3 | LSEQ_ERASE_4K | Sector Erase (0x20/0x21) | Да | +| 4 | LSEQ_PP_QUAD | Quad Page Prog (0x32/0x34) | Да | +| 5 | LSEQ_JEDEC | Read JEDEC (0x9F) | Нет | +| 6 | LSEQ_READ_SR2 | Read SR2 (0x35) | Нет | +| 7 | LSEQ_WR_SR2 | Write SR2 (0x31) | Нет | +| 8 | LSEQ_READ_SR3 | Read SR3 (0x15) | Нет | +| 9 | LSEQ_ERASE_32K | Block Erase 32KB (0x52/0x5C)| Да | +| 10 | LSEQ_ERASE_64K | Block Erase 64KB (0xD8/0xDC)| Да | +| 11 | LSEQ_IP_READ | Quad Out Read (0x6B/0x6C) | Да | + +Слоты 1–11 обновляются в `bsp_qspi_init()` под конкретный чип. +Слот 0 никогда не изменяется BSP-кодом. + +--- + +## Watermark FIFO + +Размер watermark-юнита читается из регистров `IPRXFCR.RXWMRK` и +`IPTXFCR.TXWMRK` в рантайме — не зашит константой. Это гарантирует +корректную работу если FDCB или SDK изменили настройки watermark по +умолчанию. --- ## Публичный API +Все публичные функции размещены в ITCM (`AT_QUICKACCESS_SECTION_CODE`) и +выполняются под IRQ lock. + ```c -/* Инициализация — первый вызов */ +/* Инициализация — вызвать до bsp_tick_init() и любой другой функции модуля */ bsp_status_t bsp_qspi_init(void); -/* Чтение JEDEC ID */ +/* Чтение JEDEC ID (0x9F) */ bsp_status_t bsp_qspi_read_jedec_id(bsp_qspi_jedec_t *p_jedec); /* Стирание */ @@ -103,72 +131,85 @@ bsp_status_t bsp_qspi_erase_sector(uint32_t addr); /* 4KB, ~45 мс */ bsp_status_t bsp_qspi_erase_block_32k(uint32_t addr); /* 32KB, ~120 мс */ bsp_status_t bsp_qspi_erase_block_64k(uint32_t addr); /* 64KB, ~150 мс */ -/* Запись одной страницы */ +/* Запись одной страницы (256 байт) */ bsp_status_t bsp_qspi_write_page(uint32_t addr, const uint8_t *p_data); /* ~3 мс */ -/* Чтение произвольного числа байт (через IP-команду, не AHB) */ +/* Чтение через IP-команду (не AHB/XIP) */ bsp_status_t bsp_qspi_read(uint32_t addr, uint8_t *p_buf, size_t size); -/* Размер Flash — доступен после init */ +/* Размер Flash — доступен после bsp_qspi_init() */ uint32_t bsp_qspi_flash_size(void); ``` ---- - -## Выбор операции стирания для массовой очистки - -| Объём очистки | Рекомендуемая операция | Примерное время | -|------------------|------------------------|-----------------| -| < 32 KB | `erase_sector` (4KB) | пропорционально | -| 32 KB — 1 MB | `erase_block_32k` | 120 мс / 32KB | -| > 1 MB | `erase_block_64k` | 150 мс / 64KB | - -Пример: очистка 4 MB через 64KB блоки = 64 операции × 150 мс ≈ **9.6 с** -против 1024 × 45 мс ≈ **46 с** через 4KB секторы. +Все функции возвращают `BSP_OK` при успехе или `BSP_ERR_HW` при ошибке +FlexSPI / неверном аргументе. `BSP_ERR_HW` должен присутствовать в +`bsp/common/include/bsp/status.h`. --- -## Порядок вызова +## Порядок инициализации + +`bsp_qspi_init()` должна вызываться **до** `bsp_tick_init()`: ```c -/* 1. Инициализация (один раз) */ -if (bsp_qspi_init() != BSP_OK) { /* обработка ошибки */ } - -/* 2. Операции */ -bsp_qspi_erase_sector(addr); /* блокирует ~45 мс */ - - -bsp_qspi_write_page(addr, buf); /* блокирует ~3 мс */ - -bsp_qspi_read(addr, buf, 256); /* быстро */ +/* main.c */ +board_hw_init(); +bsp_qspi_init(); /* ← сначала QSPI, до SysTick */ +bsp_tick_init(); /* ← потом SysTick */ +bsp_usb_cdc_init(); ``` +Причина: `bsp_qspi_init()` и все ITCM-функции выполняются под полным +IRQ lock. Если SysTick уже запущен и прерывание сработает в момент +IP-команды — возможен AHB stall. Порядок инициализации устраняет эту +гонку при первом запуске. + +--- + +## Выбор операции стирания + +| Объём очистки | Рекомендация | Время | +|---------------|------------------------|-----------------| +| < 32 KB | `erase_sector` (4KB) | пропорционально | +| 32 KB — 1 MB | `erase_block_32k` | ~120 мс / 32KB | +| > 1 MB | `erase_block_64k` | ~150 мс / 64KB | + +Пример: 4 MB через 64KB = 64 × 150 мс ≈ **9.6 с** +против 1024 × 45 мс ≈ **46 с** через 4KB. + --- ## CMake ```cmake -# bsp/qspi/CMakeLists.txt -target_link_libraries(bsp_qspi +# bsp/qspi_flash/CMakeLists.txt +target_link_libraries(bsp_qspi_flash PUBLIC bsp_status PRIVATE bsp_board sdk_flexspi ) ``` -Потребители (например, `firmware_test`) линкуют `bsp_qspi`: +Потребитель (`firmware_test`): ```cmake -target_link_libraries(firmware_test PRIVATE ... bsp_qspi) +target_link_libraries(firmware_test PRIVATE + bsp_qspi_flash + ... +) + +target_compile_definitions(firmware_test PRIVATE + __STARTUP_INITIALIZE_RAMFUNCTION # обязательно для ITCM-функций + __STARTUP_CLEAR_BSS +) ``` --- ## Известные ограничения -- `bsp_qspi_write_page()` записывает строго одну страницу (256 байт). - Запись через границу страницы не поддерживается — вызывающий код - обязан выровнять адрес. +- `bsp_qspi_write_page()` — строго одна страница (256 байт). Адрес обязан + быть выровнен на `BSP_QSPI_PAGE_SIZE`. Запись через границу страницы не + поддерживается. - Нет timeout в `qspi_wait_not_busy()`. Зависание из-за дефектного чипа потребует watchdog reset. Для диагностической прошивки это приемлемо. -- Chip Erase (0xC7) не реализован — слишком деструктивно для XIP-прошивки. - Используй `erase_block_64k` в цикле по всему адресному пространству. \ No newline at end of file +- Chip Erase (0xC7) не реализован — слишком деструктивно при XIP-исполнении. diff --git a/bsp/sd/CMakeLists.txt b/bsp/sd/CMakeLists.txt new file mode 100644 index 0000000..1bad078 --- /dev/null +++ b/bsp/sd/CMakeLists.txt @@ -0,0 +1,10 @@ +add_library(bsp_sd STATIC src/sd.c) + +target_include_directories(bsp_sd PUBLIC include) + +target_link_libraries( + bsp_sd + PUBLIC bsp_status # bsp_status_t + PRIVATE bsp_sdmmc_config # BOARD_SD_Config, sdmmc_config.h тащит sdk_sdmmc_sd + # транзитивно +) diff --git a/bsp/sd/README.md b/bsp/sd/README.md new file mode 100644 index 0000000..01689e9 --- /dev/null +++ b/bsp/sd/README.md @@ -0,0 +1,130 @@ +# bsp_sd — SD host-контроллер (USDHC1) + +Модуль инициализирует SD host-контроллер и проверяет наличие карты. +Файловой системой не занимается — это ответственность `bsp_usd` (поверх) или +приложения напрямую. + +## Место в архитектуре + +Каждый слой знает только о слое ниже — зависимости не пересекают границы. + +```bash +firmware_test / tft_app +│ +▼ +bsp_usd ← монтирование FatFS, тест R/W +│ +├──► firmware_test_fatfs ← ff.c + fsl_sd_disk + diskio (bare-metal ffconf) +│ tft_app_fatfs ← ff.c + fsl_sd_disk + diskio (FreeRTOS ffconf) +│ │ +│ ▼ +│ port/fatfs/sd ← diskio_sd.c: microsd_disk_* → fsl_sd_disk +│ │ +▼ ▼ +bsp_sd ← этот модуль: host init / deinit / card detect +│ +▼ +bsp/generated/sdmmc_config ← board-level: BOARD_SD_Config, GPIO питания, pad config +│ +▼ +sdk_sdmmc_sd ← NXP: fsl_sd, fsl_sdmmc_common, fsl_sdmmc_host (non-blocking) +│ +▼ +sdk_usdhc ← NXP HAL: fsl_usdhc + +``` + +--- + +## Аппаратный контекст + +| Сигнал | Пин MCU | Конфигурация | +|----------|-----------------|---------------------------------------------------| +| CLK | GPIO_SD_B0_01 | USDHC1_CLK, периферийный режим | +| CMD | GPIO_SD_B0_00 | USDHC1_CMD, периферийный режим | +| D0–D3 | GPIO_SD_B0_02–05| USDHC1_DATA0–3, периферийный режим | +| CD_B | GPIO_B1_12 | USDHC1_CD_B — детект через USDHC PRSSTAT | +| SdPwr | GPIO_AD_B1_03 | GPIO1[19], active-high, управляется SDK через BSP | + +**CD_B** подключён как периферийный сигнал USDHC1, а не как GPIO. Детект карты +читается через `USDHC_GetPresentStatusFlags` → `kUSDHC_CardInsertedFlag`. +GPIO-прерывание на CD не используется (`kSD_DetectCardByHostCD`). + +**SdPwr** инициализируется в `BOARD_SD_Config()` как GPIO-выход, выключен при старте. +SDK включает питание автоматически в процессе `SD_HostInit()` через callback. + +--- + +## API + +### `bsp_sd_init(void)` + +Конфигурирует SDMMC host однократно (`BOARD_SD_Config`) и запускает +host-контроллер (`SD_HostInit`). + +Повторный вызов без `bsp_sd_deinit` — no-op, возвращает `BSP_OK`. + +Возвращает: + +- `BSP_OK` — host готов к работе; +- `BSP_ERR_INIT` — `SD_HostInit` вернул ошибку. + +### `bsp_sd_deinit(void)` + +Останавливает host-контроллер и отключает питание карты. +Безопасен при вызове до `init` или повторно после `deinit`. + +Возвращает: + +- `BSP_OK` — всегда. + +### `bsp_sd_is_inserted(void)` + +Читает регистр `USDHC1 PRSSTAT`. Не требует предварительного `bsp_sd_init()` — +включает тактирование USDHC1 самостоятельно через `CLOCK_EnableClock`. + +Возвращает: + +- `true` — карта вставлена; +- `false` — карта отсутствует. + +--- + +## Разделение ответственности: bsp_sd vs sdmmc_config vs port_fatfs_sd + +| Слой | Что делает | Где живёт | +|-----------------------|---------------------------------------------------------|------------------------| +| `sdmmc_config` | Константы платы, `BOARD_SD_Config`, GPIO питания, pads | `bsp/generated/` | +| `bsp_sd` | `SD_HostInit/Deinit`, идемпотентность, card detect | `bsp/sd/` | +| `port_fatfs_sd` | `microsd_disk_*` → `fsl_sd_disk` (FatFS diskio glue) | `port/fatfs/sd/` | +| `firmware_test_fatfs` | `ff.c` + `fsl_sd_disk` + `diskio.c` (bare-metal ffconf)| `firmware/test/fatfs/` | +| `tft_app_fatfs` | `ff.c` + `fsl_sd_disk` + `diskio.c` (FreeRTOS ffconf) | `firmware/tft_app/fatfs/` (будущее) | + +**Почему `ff.c` и `fsl_sd_disk.c` не компилируются один раз как общая библиотека:** +оба включают `ff.h` → `ffconf.h`, который разный для `firmware_test` (bare-metal, +`FF_FS_REENTRANT=0`) и `tft_app` (FreeRTOS, `FF_FS_REENTRANT=1`, `FF_VOLUMES=3`). +Общий только `port_fatfs_sd` — он не включает `ff.h` напрямую. + +--- + +## Зависимости + +```cmake +target_link_libraries(bsp_sd + PUBLIC bsp_status # bsp_status_t + PRIVATE bsp_sdmmc_config # BOARD_SD_Config, sdmmc_config.h, sdk_sdmmc_sd +) +``` + +`sdk_sdmmc_sd` — транзитивно через `bsp_sdmmc_config`. +`sdk_usdhc` — транзитивно через `sdk_sdmmc_sd`. + +--- + +## Ограничения + +- Модуль рассчитан на одну карту (USDHC1, `g_sd` — единственный дескриптор). +- `bsp_sd_is_inserted()` читает аппаратный регистр без дебаунса. При + механическом детекте возможны ложные срабатывания в момент вставки/извлечения — + добавляй дебаунс в вызывающем коде если нужно. +- Hot-swap не поддерживается: `bsp_sd_deinit()` + `bsp_sd_init()` между сессиями. diff --git a/bsp/sd/include/bsp/sd.h b/bsp/sd/include/bsp/sd.h new file mode 100644 index 0000000..2fc8ac4 --- /dev/null +++ b/bsp/sd/include/bsp/sd.h @@ -0,0 +1,35 @@ +/* + * bsp_sd — инициализация SD host-контроллера и детект карты. + * + * Модуль управляет только железом (USDHC host, питание карты). + * Монтирование файловой системы — в bsp_usd поверх этого модуля. + */ + +#ifndef BSP_SD_H +#define BSP_SD_H + +#include "bsp/status.h" + +#include + +/* + * Инициализировать SD host-контроллер. + * Вызывать до любых операций с картой. + * Повторный вызов без deinit возвращает BSP_OK (идемпотентен). + */ +bsp_status_t bsp_sd_init(void); + +/* + * Деинициализировать SD host-контроллер и отключить питание карты. + * Безопасен при вызове до init или после deinit. + */ +bsp_status_t bsp_sd_deinit(void); + +/* + * Проверить физическое наличие карты через регистр USDHC PRSSTAT. + * Не требует предварительного вызова bsp_sd_init(). + * Включает тактирование USDHC1 на время чтения регистра. + */ +bool bsp_sd_is_inserted(void); + +#endif /* BSP_SD_H */ \ No newline at end of file diff --git a/bsp/sd/src/sd.c b/bsp/sd/src/sd.c new file mode 100644 index 0000000..b86ee35 --- /dev/null +++ b/bsp/sd/src/sd.c @@ -0,0 +1,93 @@ +/* + * bsp_sd — реализация. + */ + +#include "bsp/sd.h" + +#include "fsl_clock.h" +#include "fsl_sd.h" +#include "sdmmc_config.h" /* BOARD_SD_Config, BOARD_SDMMC_SD_HOST_BASEADDR */ + +/* --------------------------------------------------------------------------- + * Глобальный дескриптор карты — нужен SDK-стеку (передаётся по указателю + * в BOARD_SD_Config и sd_disk_initialize через g_sd). + * Объявлен без static — fsl_sd_disk.c ссылается на него как extern sd_card_t g_sd. + * ------------------------------------------------------------------------- */ +extern sd_card_t g_sd; + +/* --------------------------------------------------------------------------- + * Состояние модуля + * ------------------------------------------------------------------------- */ +static bool g_s_host_configured = false; +static bool g_s_initialized = false; + +/* --------------------------------------------------------------------------- + * Внутренние функции + * ------------------------------------------------------------------------- */ + +/* + * Конфигурирует SDMMC host однократно. + * Повторный вызов — no-op: BOARD_SD_Config не идемпотентен сам по себе + * (переинициализирует GPIO питания), поэтому защищаем флагом. + */ +static void ensure_host_configured(void) +{ + if (g_s_host_configured) + { + return; + } + /* cd=NULL, userData=NULL: CD управляется хостом через PRSSTAT */ + BOARD_SD_Config(&g_sd, NULL, BOARD_SDMMC_SD_HOST_IRQ_PRIORITY, NULL); + g_s_host_configured = true; +} + +/* --------------------------------------------------------------------------- + * Публичный API + * ------------------------------------------------------------------------- */ + +bsp_status_t bsp_sd_init(void) +{ + if (g_s_initialized) + { + return BSP_OK; + } + + ensure_host_configured(); /* только BOARD_SD_Config — заполняет g_sd */ + + /* + * Полный init (host + card) происходит в sd_disk_initialize → SD_Init, + * который вызывается из f_mount → disk_initialize. + */ + + g_s_initialized = true; + return BSP_OK; +} + +bsp_status_t bsp_sd_deinit(void) +{ + if (!g_s_initialized) + { + return BSP_OK; + } + + SD_HostDeinit(&g_sd); + SD_SetCardPower(&g_sd, false); + + g_s_initialized = false; + return BSP_OK; +} + +bool bsp_sd_is_inserted(void) +{ + /* + * CD_B подключён как периферийный сигнал USDHC1, поэтому детект — + * через регистр PRSSTAT, а не GPIO. + * + * USDHC1 может быть ещё не тактирован в момент вызова (до init), + * поэтому явно включаем clock. После init clock уже включён SDK-стеком, + * повторный вызов CLOCK_EnableClock безвреден. + */ + CLOCK_EnableClock(kCLOCK_Usdhc1); + uint32_t prsstat = USDHC_GetPresentStatusFlags(BOARD_SDMMC_SD_HOST_BASEADDR); + return (prsstat & (uint32_t) kUSDHC_CardInsertedFlag) != 0U; +} \ No newline at end of file diff --git a/firmware/test/CMakeLists.txt b/firmware/test/CMakeLists.txt index f77a5c5..9fcebc1 100644 --- a/firmware/test/CMakeLists.txt +++ b/firmware/test/CMakeLists.txt @@ -3,6 +3,8 @@ set(TARGET_NAME firmware_test) +add_subdirectory(fatfs) + add_executable( ${TARGET_NAME} src/main.c @@ -38,7 +40,9 @@ target_link_libraries( bsp_boot_xip bsp_usb_cdc bsp_sdram - bsp_qspi_flash) + bsp_qspi_flash + bsp_sd + firmware_test_fatfs) # ----------------------------------------------------------------------------- # Linker script diff --git a/firmware/test/PLAN.md b/firmware/test/PLAN.md index 0640a64..90e5f5d 100644 --- a/firmware/test/PLAN.md +++ b/firmware/test/PLAN.md @@ -1,8 +1,6 @@ # firmware_test — Plan of Development -> Документ для нового треда. Содержит все принятые решения, текущий статус и -> пошаговый план дальнейшей разработки. -> Версия: 0.2 | Обновлён после реализации скелета + bsp_usb_cdc. +> Версия: 0.4 | Обновлён после завершения Этапов 1–3 (bsp_sdram + bsp_qspi_flash). --- @@ -12,548 +10,282 @@ Запускается через BootROM (USB SDP), без предварительной прошивки загрузчика. **Стенд:** -- Хост подключается через USB CDC ACM (J2) — единственный канал -- Тесты с внешними сигналами управляются через M5StampPLC (реле, оптовходы) -- Отдельный компьютер-сервер запускает pytest +- Хост подключается через USB CDC ACM — единственный канал firmware_test +- Тесты с внешними сигналами управляются через M5StampPLC +- Сервер запускает `tools/hil/` (разработка) или `tools/production/` (производство) --- -## Статус на момент создания документа +## Текущий статус -| Компонент | Статус | Примечание | -|---|---|---| -| `bsp_usb_cdc` | ✅ Готов | HIL тест пройден (`05_test_usb_cdc.py`) | -| `firmware_test` скелет | ✅ Готов | `main.c` + `cli.c` + PING работает | -| Host-тест CLI | ✅ Готов | `test_cli.c`, 8 тестов, зелёные | -| `bsp_sdram` | ⬜ Не начат | | -| `bsp_qspi` | ⬜ Не начат | | -| `bsp_usd` | ⬜ Не начат | | -| Протокол v2 | ⬜ Не начат | Эволюция от cmd/ok к event-driven | -| Test runner | ⬜ Не начат | | -| Provisioning | ⬜ Не начат | | +| Компонент | Статус | Примечание | +|----------------------------|--------|------------| +| `bsp_usb_cdc` | ✅ | HIL тест пройден | +| firmware_test скелет | ✅ | `main.c` + `cli.c` | +| Протокол v2 + test_runner | ✅ | JSON-lines event-driven | +| `bsp_sdram` + `test_sdram` | ✅ | 4 фазы: addr/data/seq/retention | +| `bsp_qspi_flash` | ✅ | W25Q64/128/256/512, ITCM, IRQ lock | +| `test_qspi` | ✅ | JEDEC + erase + rw + addr range | +| `bsp_usd` | ⬜ | Этап 4 | +| `test_usd` | ⬜ | Этап 4 | +| Display test | ⬜ | Этап 5 | +| Button test | ⬜ | Этап 5 | +| CAN test | ⬜ | Этап 6 (bsp_can ✅) | +| UART TTL test | ⬜ | Этап 6 (bsp_uart_host ✅) | +| UART ISO test | ⬜ | Этап 6 | +| Opto test | ⬜ | Этап 6 (bsp_opto ✅) | +| Provisioning | ⬜ | Этап 7 | -### Закрытые архитектурные решения +--- + +## Закрытые архитектурные решения > Не пересматривать без явного запроса. -- **[DECISION] Транспорт:** USB CDC ACM — единственный канал. UART не используется в firmware_test. -- **[DECISION] Парсинг JSON:** без cJSON, строковый `strstr`. Входящее поле всегда `"cmd"` / `"type"`. -- **[DECISION] SDRAM и DCD:** SEMC инициализируется DCD до `main()`. `bsp_sdram_init()` только верифицирует. -- **[DECISION] SDRAM тест — не HIL ELF:** тест прогоняется командами через firmware_test, не отдельным ELF. -- **[DECISION] IR и RTC:** не реализуются. +- **Транспорт:** USB CDC ACM — единственный канал. UART не используется в firmware_test. +- **Парсинг JSON:** без cJSON, строковый `strstr`. Входящее поле всегда `"type"` / `"cmd"`. +- **SDRAM и DCD:** SEMC инициализируется DCD до `main()`. `bsp_sdram_init()` только верифицирует. +- **SDRAM тест:** прогоняется командами через firmware_test, не отдельным HIL ELF. +- **QSPI-функции в ITCM:** `AT_QUICKACCESS_SECTION_CODE` + `__STARTUP_INITIALIZE_RAMFUNCTION` в CMakeLists. +- **QSPI IRQ lock:** `__get_PRIMASK()` + DSB/ISB. Публичные API под полным lock. +- **W25Q256/512:** dedicated 4-byte opcodes, без Enter 4-Byte Mode (0xB7). +- **Порядок init в main.c:** `bsp_qspi_init()` до `bsp_tick_init()`. +- **IR и RTC:** не реализуются. +- **Производственный runner:** Вариант D — отдельный `tools/production/` без pytest. --- -## Протокол v2 — решение, требующее принятия в новом треде +## Этап 4 — `bsp_usd` + `test_usd` -Текущий скелет использует упрощённый протокол: -```json -{"cmd":"PING"} → {"ok":true,"result":"PONG"} +### Аппаратный контекст + +| Параметр | Значение | +|---|---| +| Интерфейс | USDHC (SDIO) | +| Карта | microSD, вставляется оператором перед тестом | +| Файловая система | FatFS (SDK middleware) | +| Детект карты | GPIO (CD pin) или опрос через USDHC status | + +### BSP API (предварительно) + +```c +/* bsp/usd/include/bsp/usd.h */ + +typedef enum { + BSP_USD_OK = 0, + BSP_USD_ERR_NO_CARD, /* карта не вставлена */ + BSP_USD_ERR_INIT, /* USDHC или FatFS init failed */ + BSP_USD_ERR_MOUNT, /* f_mount() failed */ + BSP_USD_ERR_RW, /* read/write/compare failed */ +} bsp_usd_status_t; + +bsp_usd_status_t bsp_usd_init(void); +bsp_usd_status_t bsp_usd_is_card_present(void); +bsp_usd_status_t bsp_usd_test_rw(void); /* write + read + compare тестового файла */ +void bsp_usd_deinit(void); ``` -TODO.md описывает расширенный протокол с типами событий: -```json -{"type":"session_start","fw":"0.1.0","target":"IMXRT1052","uptime_ms":0} -{"type":"test_begin","id":"sdram","name":"SDRAM 32MB","critical":true} -{"type":"test_result","id":"sdram","status":"pass","ms":312} -{"type":"summary","passed":7,"failed":0,"overall":"pass"} +### test_usd — шаги + +| Шаг | Действие | Время | +|---|---|---| +| 1: Card detect | `bsp_usd_is_card_present()` | < 1 мс | +| 2: Mount | `f_mount()` — FAT/exFAT | < 200 мс | +| 3: Write | Записать 4 KB тестовый файл | < 500 мс | +| 4: Read + Compare | Прочитать и сравнить побайтово | < 200 мс | +| 5: Unmount | `f_unmount()` | < 50 мс | + +### Интерактивность + +Тест помечен `requires_hil = false`, `pre_confirm_prompt = "Вставьте microSD и нажмите OK"`. +test_runner ждёт `{"type":"confirm","id":"usd_insert","confirmed":true}` до вызова `run()`. +Отказ или таймаут 30 с → `TEST_STATUS_SKIP`. + +### Файлы + ``` - -**Вопросы для обсуждения в треде:** - -1. Переходить ли на v2 сразу или итерационно (сначала SDRAM с cmd/ok, потом рефакторинг)? -2. Как обрабатывать `confirm_request` (display test) в cli.c — отдельный тип входящего сообщения? -3. `session_start` — посылать ли при каждом `READY` или только по команде `START_SESSION`? - -**Рекомендация:** реализовать v2 до добавления первого теста, иначе рефакторинг CLI затронет уже написанные тест-модули. - ---- - -## Структура файлов — целевое состояние -``` -firmware/test/ +bsp/usd/ ├── CMakeLists.txt ├── README.md -└── src/ - ├── main.c # ✅ готов - ├── cli.h / cli.c # ✅ готов (v1), требует эволюции до v2 - ├── protocol.h / protocol.c # ⬜ новый: сериализация ответов - ├── test_runner.h / .c # ⬜ новый: реестр + sequencer - ├── provisioning.h / .c # ⬜ новый: chip UID + provision_ack - └── tests/ - ├── test_sdram.h / .c # ⬜ - ├── test_qspi.h / .c # ⬜ - ├── test_usd.h / .c # ⬜ - ├── test_display.h / .c # ⬜ интерактивный (кнопки) - ├── test_can.h / .c # ⬜ HIL (M5StampPLC) - ├── test_uart.h / .c # ⬜ HIL TTL + ISO - └── test_opto.h / .c # ⬜ HIL (M5StampPLC) +├── include/bsp/usd.h +└── src/usd.c -bsp/ -├── sdram/ # ⬜ CMakeLists.txt + sdram.c (структура есть) -├── qspi/ # ⬜ новый модуль -└── usd/ # ⬜ новый модуль +firmware/test/src/tests/test_usd.c ``` +### CMake + +```cmake +# bsp/usd/CMakeLists.txt +target_link_libraries(bsp_usd + PUBLIC bsp_status + PRIVATE bsp_board sdk_usdhc middleware_fatfs +) +``` + +### Открытые вопросы перед реализацией + +- [ ] Есть ли `sdk_usdhc` таргет в `sdk/CMakeLists.txt`? +- [ ] Карта вставлена постоянно или оператор вставляет каждый раз? +- [ ] Нужен ли Card Detect GPIO или только USDHC status? +- [ ] Файловая система: FAT32 или exFAT (размер карт)? + --- -## Матрица тестов +## Этап 5 — Display + Button (интерактивные) -| ID | Название | Тип | Critical | HIL (M5) | HIL ELF | BSP | Статус | -|---|---|---|---|---|---|---|---| -| — | PING | cmd | — | — | — | — | ✅ | -| `sdram` | SDRAM 32MB | self | ✅ | ❌ | ❌ | `bsp_sdram` | ⬜ | -| `qspi` | QSPI Flash | self | ✅ | ❌ | ❌ | `bsp_qspi` | ⬜ | -| `usd` | uSD (SDIO) | self | ✅ | ❌ | ❌ | `bsp_usd` | ⬜ | -| `display` | Display RGB888 | interactive | ❌ | ❌ | ❌ | существующий BSP | ⬜ | -| `can` | CAN | HIL | ❌ | ✅ | ❌ | `bsp_can` ✅ | ⬜ | -| `uart_ttl` | UART TTL | HIL | ❌ | ✅ | ❌ | `bsp_uart_host` ✅ | ⬜ | -| `uart_iso` | UART ISO +24V | HIL | ❌ | ✅ | ❌ | уточнить | ⬜ | -| `opto` | Opto-in +24V | HIL | ❌ | ✅ | ❌ | `bsp_opto` ✅ | ⬜ | +### test_display -**Колонка "HIL ELF":** отдельная RAM-прошивка через pyOCD. Для firmware_test тестов — не нужна, тесты идут через USB CDC. +| Параметр | Значение | +|---|---| +| Critical | ❌ | +| HIL | ❌ | +| Confirm | Внутри `run()` — 4 отдельных confirm | -**Колонка "HIL (M5)":** нужна ли M5StampPLC для управления внешними сигналами. +Шаги: заливка Red → confirm → Green → confirm → Blue → confirm → White → confirm. +Каждый шаг посылает `confirm_request`, ждёт `confirm` с таймаутом 15 с. +Итог = AND всех четырёх подтверждений. ---- +`detail` при FAIL содержит ID первого непрошедшего шага: `"display_blue not confirmed"`. -## Пошаговый план +### test_buttons -### Этап 0 — Вопросы, требующие ответа до кода +| Параметр | Значение | +|---|---| +| Critical | ❌ | +| HIL | ❌ | +| Confirm | prompt only (детект через bsp_button) | -Обсудить в начале треда: +Шаги: Test_But_1 → Test_But_2. Таргет посылает `confirm_request` как инструкцию +оператору, детектирует нажатие через `bsp_button` — JSON confirm не нужен. +Таймаут 10 с на каждую кнопку. -- Протокол v2: переходить сейчас или после SDRAM? -- `uart_iso`: есть отдельный BSP модуль или это тот же `bsp_uart_host` с другими параметрами? -- `usd`: карта вставлена постоянно на плате или оператор вставляет перед тестом? -- QSPI: какой конкретно чип (W25Q128?), есть ли уже sdk_flexspi таргет в CMake? +### Аппаратный контекст кнопок ---- - -### Этап 1 — Протокол v2 + Test runner скелет - -**Цель:** эволюция cli.c → protocol.c + test_runner.c. После этого этапа добавление каждого теста — одна строка в реестре. - -**Файлы:** -``` -firmware/test/src/ -├── cli.c ← упрощается: только IO (read/write/buffer) -├── protocol.h/.c ← новый: сериализация всех типов сообщений -├── test_module.h ← новый: интерфейс тест-модуля -└── test_runner.h/.c ← новый: реестр + sequencer -``` - -**Интерфейс тест-модуля (`test_module.h`):** -```c -typedef enum { TEST_STATUS_PASS = 0, TEST_STATUS_FAIL, TEST_STATUS_SKIP } test_status_t; - -typedef struct { - test_status_t status; - uint32_t duration_ms; - char detail[96]; -} test_result_t; - -typedef struct { - const char *id; - const char *name; - bool critical; - bool requires_hil; - void (*init)(void); - test_result_t (*run)(void); - void (*deinit)(void); -} test_module_t; -``` - -**Сериализация (protocol.h):** функции `protocol_send_session_start()`, -`protocol_send_test_begin()`, `protocol_send_test_result()`, -`protocol_send_summary()`, `protocol_send_confirm_request()` — все через `cli_send()`. - -**Команды хоста v2:** - -| Входящий тип | Поле | Действие | +| Кнопка | Пин MCU | GPIO | |---|---|---| -| `cmd` | `"run_all"` | Запустить все тесты по реестру | -| `cmd` | `"run"` + `"id"` | Запустить один тест | -| `cmd` | `"ping"` | `{"type":"pong"}` | -| `confirm` | `"id"` + `"confirmed"` | Ответ оператора на display тест | - -**Host-тесты:** расширить `test_cli.c` + добавить `test_protocol.c` (Категория A). +| Test_But_1 | GPIO_B1_14 | GPIO2[30] | +| Test_But_2 | GPIO_B1_15 | GPIO2[31] | --- -### Этап 2 — `bsp_sdram` +## Этап 6 — CAN + UART + Opto (HIL, M5StampPLC) + +Все три теста `requires_hil = true`. Запускаются только при наличии стенда. +BSP для всех трёх уже готов. + +### test_can + +M5StampPLC отправляет CAN-фрейм → плата принимает → сравниваем ID и payload. + +**Шаги:** +1. M5 → `{"cmd":"can_send","id":0x100,"data":[0xDE,0xAD,0xBE,0xEF]}` (через `confirm_request`) +2. Таргет: `uart_cmd("CAN_RECV 500")` → `"100 DEADBEEF"` или `"TIMEOUT"` +3. Ответный: таргет посылает → M5 `can_recv` → верификация + +### test_uart_ttl + +M5 loopback через UART TTL → echo-верификация. + +### test_uart_iso + +M5 RLY2 → RS_RX оптовход (BSP_OPTO_CH_RS) → детект ACTIVE/INACTIVE. +Использует `bsp_opto` с `rs_as_gpio=true`. + +### test_opto + +M5 RLY3/RLY4 → EXT_IN1/IN2 → детект ACTIVE/INACTIVE через `bsp_opto`. + +**Параметры стенда (из HIL_BENCH.md):** +``` +RLY2 → RS_RX (BSP_OPTO_CH_RS) GPIO1[23] +RLY3 → EXT_IN1 (BSP_OPTO_CH_IN1) GPIO1[22] +RLY4 → EXT_IN2 (BSP_OPTO_CH_IN2) GPIO1[21] +``` + +### HIL pytest для Этапа 6 + +Тесты firmware_test через USB CDC — отдельные от существующих HIL ELF тестов: + +``` +tools/hil/ +├── conftest.py ← добавить фикстуру firmware_cdc (USB CDC клиент) +├── 06_test_firmware_can.py ← M5 + USB CDC +├── 06_test_firmware_uart.py +└── 06_test_firmware_opto.py +``` + +Фикстура `firmware_cdc` открывает CDC порт firmware_test (прошит в Flash), +посылает JSON команды, читает события. Аналог `uart_cmd` для USB CDC. + +--- + +## Этап 7 — Provisioning + +### Что нужно + +1. Читать `OCOTP_UNIQUE_ID` (или `OCOTP_MAC0/1`) через SDK fsl_ocotp. +2. Посылать `{"type":"provision_ready","chip_uid":"AABB..."}` после `summary`. +3. Ждать `{"type":"cmd","cmd":"provision_ack"}` от хоста. +4. Записывать статус в Flash (первый сектор после прошивки, вне XIP). + +### BSP (предварительно) -API уже описан в `firmware_test_plan.md` (закрытое решение): ```c -bsp_sdram_status_t bsp_sdram_init(void); -bsp_sdram_status_t bsp_sdram_test_fast(bsp_sdram_result_t *result); -bsp_sdram_status_t bsp_sdram_test_full(bsp_sdram_result_t *result); +/* bsp/provisioning/include/bsp/provisioning.h */ +bsp_status_t bsp_prov_read_uid(uint8_t *p_uid, size_t len); /* 8 байт из OCOTP */ ``` -**Файлы:** -``` -bsp/sdram/ -├── CMakeLists.txt ← создать -├── include/bsp/sdram.h ← по spec из firmware_test_plan.md -└── src/sdram.c -``` +### Открытые вопросы -**Тест модуль firmware_test:** -``` -firmware/test/src/tests/test_sdram.c -``` - -Команды через реестр: `run` + `id: "sdram"`. Отдельной HIL ELF нет. - -**HIL pytest (`tools/hil/test_sdram.py`):** подключается к firmware_test через USB CDC. -Фикстура `cdc_firmware_test` — firmware_test прошит в Flash, pytest открывает CDC порт. - -**Just рецепты:** `hil-sdram` (без `--slow`), `hil-sdram-full` (с `@pytest.mark.slow`). +- [ ] Что именно записывать как "пройдено": флаг в Flash или только отправить UID? +- [ ] Нужна ли защита от повторного provisioning (write-once)? --- -### Этап 3 — `bsp_qspi` + QSPI тест +## Матрица тестов — итоговая -**Аппаратный контекст:** W25Q64FVSSIG (из схемы, 8MB SPI NOR Flash), интерфейс FlexSPI. - -**API:** -```c -bsp_qspi_status_t bsp_qspi_init(void); -bsp_qspi_status_t bsp_qspi_read_jedec_id(uint8_t *manufacturer, uint16_t *device_id); -bsp_qspi_status_t bsp_qspi_test(bsp_qspi_result_t *result); /* erase sector + write + verify */ -``` - -**Что проверяет тест:** - -1. JEDEC ID совпадает с ожидаемым для W25Q64 (`0xEF`, `0x4017`) -2. Erase тестового сектора (последний сектор, чтобы не трогать прошивку) -3. Write + Read + Compare 256 байт - -**Нет HIL ELF, нет M5.** Тест полностью самостоятельный. - -**Вопрос перед началом:** проверить есть ли `sdk_flexspi` таргет в `sdk/CMakeLists.txt`. - ---- - -### Этап 4 — `bsp_usd` + uSD тест - -**Аппаратный контекст:** SDMMC (uSD слот), интерфейс USDHC. SDK таргет `sdk_usdhc` есть в матрице. - -**Стратегия:** использовать FatFS из SDK middleware (уже vendored в `middleware/fatfs/`). - -**API:** -```c -bsp_usd_status_t bsp_usd_init(void); /* USDHC init + mount FAT */ -bsp_usd_status_t bsp_usd_test(bsp_usd_result_t *result); /* write + read + verify */ -bsp_usd_status_t bsp_usd_deinit(void); /* unmount */ -``` - -**Поведение при отсутствии карты:** `TEST_STATUS_SKIP` (критически важно для -производственного прогона — карта может быть не вставлена). - -**Вопрос:** карта вставлена постоянно или оператор вставляет? Если оператор — нужен `confirm_request` перед тестом. - ---- - -### Этап 5 — Display тест (интерактивный) - -**Что проверяем:** RGB888 интерфейс + подсветка + реакция оператора через кнопки. - -**Последовательность:** -``` -firmware → LCD: залить R (красный) -firmware → хост: {"type":"confirm_request","id":"display_red","timeout_ms":15000} -оператор: нажать кнопку PASS (Test_But_1) или FAIL (Test_But_2) -firmware → хост: {"type":"confirm_ack","id":"display_red","confirmed":true/false} -повторить для G, B, W -итоговый результат = AND всех подтверждений -``` - -**Особенности:** - -- Одновременно тестируются кнопки (`bsp_button` уже есть с HIL тестами) -- Таймаут 15 с → `TEST_STATUS_SKIP` -- Маркер `@pytest.mark.interactive` в pytest — не входит в `hil-run` - -**HIL pytest:** `tools/hil/test_display.py` с `_operator_prompt()` через `/dev/tty`. - ---- - -### Этап 6 — HIL тесты: CAN, UART, Opto в firmware_test - -Эти BSP модули уже реализованы и имеют отдельные HIL ELF тесты. -Задача этапа — **интегрировать их в firmware_test** как тест-модули, -запускаемые через протокол v2. - -#### 6.1 CAN (`bsp_can` ✅) - -- Стенд: M5StampPLC подключён к CAN шине платы через интерфейсную плату -- Тест: M5 посылает CAN фрейм → плата принимает → сравниваем - -#### 6.2 UART TTL (`bsp_uart_host` ✅) - -- Стенд: M5 UART ↔ UART TTL платы (loopback или echo) -- Уточнить: какой UART порт на плате (LPUART1 занят MCU-Link, какой свободен?) - -#### 6.3 UART ISO - -- Уточнить наличие отдельного BSP модуля или это конфигурация `bsp_uart_host` -- +24V уровни через интерфейсную плату - -#### 6.4 Opto (`bsp_opto` ✅) - -- Стенд: M5 реле → оптовходы EXT_IN1, EXT_IN2, RS_RX -- Логика уже отработана в `02_test_opto.py` (HIL ELF) -- Переиспользовать: тот же M5 агент, другой транспорт (USB CDC вместо UART) - -**Важно для всех HIL тестов этапа 6:** pytest для firmware_test использует -`cdc_firmware_test` фикстуру (USB CDC), а не `uart_` (UART + pyOCD). -M5StampPLC управляет сигналами так же, как в существующих HIL ELF тестах. - ---- - -### Этап 7 — Provisioning - -**Источник UID:** OCOTP регистры через `OCOTP_GetFuseData()` (NXP HAL). -```c -void provisioning_run(provision_info_t *out); -``` - -**Поток:** -``` -firmware → хост: {"type":"provision_ready","chip_uid":"A3F2...","fw":"0.1.0"} -хост → БД: uid ↔ fw_version (логика на хосте) -хост → firmware: {"type":"cmd","cmd":"provision_ack","fw":"1.0.0","bootloader":"1.0.0"} -firmware → хост: {"type":"provision_done","recorded":true} -``` - -**Запускается только при `overall == pass`.** В pytest отдельная фикстура -`provision_firmware_test`. +| ID | Название | Тип | Critical | HIL (M5) | BSP | Статус | +|-------------|----------------|-------------|----------|----------|------------------|--------| +| — | PING | cmd | — | ❌ | — | ✅ | +| `sdram` | SDRAM 32MB | self | ✅ | ❌ | `bsp_sdram` ✅ | ✅ | +| `qspi` | QSPI Flash | self | ✅ | ❌ | `bsp_qspi_flash` ✅ | ✅ | +| `usd` | uSD (SDIO) | interactive | ✅ | ❌ | `bsp_usd` ⬜ | ⬜ | +| `display` | Display RGB888 | interactive | ❌ | ❌ | существующий BSP | ⬜ | +| `buttons` | Test_But_1/2 | interactive | ❌ | ❌ | `bsp_button` ✅ | ⬜ | +| `can` | CAN loopback | HIL | ❌ | ✅ | `bsp_can` ✅ | ⬜ | +| `uart_ttl` | UART TTL | HIL | ❌ | ✅ | `bsp_uart_host`✅| ⬜ | +| `uart_iso` | UART ISO +24V | HIL | ❌ | ✅ | `bsp_opto` ✅ | ⬜ | +| `opto` | Opto-in EXT | HIL | ❌ | ✅ | `bsp_opto` ✅ | ⬜ | --- ## Зависимости между этапами -``` -Этап 1 (протокол v2 + runner) - ├── Этап 2 (bsp_sdram) - │ └── HIL: test_sdram.py - ├── Этап 3 (bsp_qspi) - │ └── HIL: test_qspi.py - ├── Этап 4 (bsp_usd) - │ └── HIL: test_usd.py - ├── Этап 5 (display, interactive) - │ └── HIL: test_display.py (@pytest.mark.interactive) - └── Этап 6 (CAN + UART + Opto) - └── HIL: test_can.py, test_uart.py, test_opto.py -Этап 7 (provisioning) → зависит от всех предыдущих +``` +✅ Этап 1 (протокол v2 + runner) +✅ Этап 2 (bsp_sdram + test_sdram) +✅ Этап 3 (bsp_qspi_flash + test_qspi) +⬜ Этап 4 (bsp_usd + test_usd) ← ТЕКУЩИЙ +⬜ Этап 5 (display + buttons) +⬜ Этап 6 (CAN + UART + Opto, HIL) +⬜ Этап 7 (provisioning) +⬜ Этап 8 (tools/production/ TUI runner) ← параллельно с 6-7 ``` --- -## BSP модули — итог +## Хостовое ПО производственного прогона (Этап 8) -| BSP | Статус | Нужен HIL ELF | Нужен в firmware_test | -|---|---|---|---| -| `bsp_usb_cdc` | ✅ | ✅ (есть) | ✅ (есть) | -| `bsp_led` | ✅ | ❌ | ✅ | -| `bsp_tick` | ✅ | ❌ | ✅ | -| `bsp_button` | ✅ | ✅ (есть) | ✅ (display тест) | -| `bsp_opto` | ✅ | ✅ (есть) | ✅ этап 6 | -| `bsp_can` | ✅ | ✅ (есть) | ✅ этап 6 | -| `bsp_uart_host` | ✅ | ✅ (есть) | ✅ этап 6 | -| `bsp_sdram` | ⬜ | ❌ | ✅ этап 2 | -| `bsp_qspi` | ⬜ | ❌ | ✅ этап 3 | -| `bsp_usd` | ⬜ | ❌ | ✅ этап 4 | +**Решение принято (Вариант D):** отдельное приложение `tools/production/`, +без pytest, с TUI (Textual). ---- +Подробная архитектура описана в предыдущей версии плана (v0.2, раздел +"Открытый вопрос: ПО на стороне хоста"). -## Контекст для нового треда — что передать -``` -Системный промпт: тот же (роль + правила). +### Открытые вопросы (перед Этапом 8) -Приложить файлы: - - firmware_test_plan.md (обновлённый) - - usb_cdc.md - - firmware/test/src/main.c (текущий) - - firmware/test/src/cli.h/.c (текущий) - - firmware/test/CMakeLists.txt (текущий) - - tests/host/CMakeLists.txt - - tests/host/cli/test_cli.c - - этот план (PLAN.md) - -Первый вопрос нового треда: - "Начинаем Этап 1 — протокол v2 и test_runner. - Ответы на открытые вопросы: [...]" -``` - ---- - -## Открытый вопрос: ПО на стороне хоста для производственного прогона - -### Контекст и разделение ответственности - -Принципиально важно разделить два окружения: - -| Окружение | Кто запускает | Инструмент | Что тестирует | -|---|---|---|---| -| **Разработка** | Разработчик, локальный ПК | pytest (`just host::hil-*`) | Отдельные BSP модули через HIL ELF + UART | -| **Производство / Сервис** | Оператор, сервер | ??? | Плата целиком через firmware_test + USB CDC | - -Это два **принципиально разных** use case с разными требованиями к UX, -надёжности и изоляции. Смешивать их в одном pytest-прогоне нельзя. - ---- - -### Почему "просто pytest" недостаточно для производства - -Производственный прогон отличается от HIL тестов разработчика по нескольким осям: - -**Оператор — не разработчик.** Он не читает pytest output в терминале. -Ему нужно видеть: какой тест сейчас идёт, прошёл или нет, что делать дальше -(вставить карту, посмотреть на дисплей, нажать кнопку). - -**Последовательность фиксирована.** Прогон всегда идёт по реестру: -flash → READY → run_all → summary → provisioning. Никакого выбора тестов. - -**Результат — не лог, а запись в БД.** `chip_uid` + результат + версия прошивки -должны сохраняться. pytest ничего не знает о БД. - -**Интерактивные тесты** (display) требуют управляемого диалога с оператором, -а не `input()` в терминале с флагом `-s`. - ---- - -### Варианты хостового ПО — анализ - -#### Вариант A: pytest + плагины + HTML отчёт - -Обернуть весь прогон в pytest, добавить `pytest-html` для отчётов, -интерактивные тесты через `@pytest.mark.interactive` с `-s`. - -**Плюсы:** минимум нового кода, знакомый инструмент. - -**Минусы:** оператор смотрит в терминал; интерактивность через `/dev/tty` хрупкая; -provisioning (запись в БД) — костыль в фикстуре; нет живого статуса -"тест N из M идёт X секунд". Для производства неприемлемо. - -#### Вариант B: TUI — Python + Textual / Rich - -Самостоятельное Python-приложение с текстовым интерфейсом. -Управляет всем: flash через spsdk, M5StampPLC, USB CDC, provisioning, БД. -pytest не используется как runner — только как библиотека для assert-логики -(или вообще не используется). - -**Плюсы:** полный контроль над UX; живой прогресс; чёткие диалоги оператора; -нативная запись в БД; изолировано от HIL тестов разработчика полностью. - -**Минусы:** значительный объём разработки хостового ПО; -нужен отдельный репозиторий или директория `tools/production/`. - -#### Вариант C: pytest как backend, TUI/GUI как frontend - -pytest запускается программно через `pytest.main()` или subprocess, -результаты передаются через JSON reporter (`pytest-json-report`) в -отдельное GUI/TUI приложение которое их отображает. - -**Плюсы:** переиспользуем pytest инфраструктуру (фикстуры, параллелизм). - -**Минусы:** архитектурно сложно; интерактивные тесты всё равно требуют -кастомного канала; два процесса вместо одного. - -#### Вариант D: pytest только для разработки, отдельный runner для производства - -**Разработка:** pytest (`just host::hil-*`) — тесты отдельных BSP модулей -через HIL ELF. Остаётся как есть. - -**Производство:** отдельное Python-приложение (`tools/production/run.py`) -без pytest. Использует те же низкоуровневые библиотеки -(`pyserial`, `spsdk`, M5 агент) но со своим runner-ом и TUI. - -Тест-логика на стороне прошивки (в `test_runner.c`) — единственная -точка истины. Хостовое ПО только отправляет команды и интерпретирует события. - -**Это рекомендуемый вариант** — наиболее чистое разделение. - ---- - -### Рекомендуемая архитектура (Вариант D, детально) -``` -tools/ -├── hil/ # СУЩЕСТВУЮЩИЙ — разработчик, локальный ПК -│ ├── conftest.py # pytest фикстуры -│ ├── 01_test_uart.py # HIL тесты отдельных BSP модулей -│ ├── 02_test_opto.py -│ └── ... -│ -└── production/ # НОВЫЙ — производство / сервис - ├── pyproject.toml # отдельное окружение uv - ├── run.py # точка входа: python run.py - ├── runner/ - │ ├── flasher.py # spsdk: flash firmware_test.elf - │ ├── cdc_client.py # USB CDC: send cmd, recv events - │ ├── m5_client.py # переиспользовать tools/hil/m5/ - │ ├── test_sequence.py # порядок: flash→READY→run_all→provision - │ └── db.py # запись chip_uid + результатов - └── ui/ - ├── tui.py # Textual TUI: живой прогресс + диалоги - └── report.py # HTML / JSON отчёт после прогона -``` - -**Поток производственного прогона:** -``` -Оператор запускает: python tools/production/run.py - │ - ├── flasher.py: spsdk → flash firmware_test.elf → Reset - ├── cdc_client: ждёт {"type":"session_start",...} - ├── TUI: показывает "Подключение... ОК" - │ - ├── cdc_client: → {"type":"cmd","cmd":"run_all"} - │ - ├── [цикл событий] - │ ├── {"type":"test_begin","id":"sdram"} → TUI: "SDRAM... ⏳" - │ ├── {"type":"test_result","id":"sdram","status":"pass"} → TUI: "SDRAM ✅ 47ms" - │ ├── {"type":"confirm_request","id":"display_red"} → - │ │ TUI: диалог оператора "Экран красный? [PASS/FAIL]" - │ │ cdc_client: → {"type":"confirm","id":"display_red","confirmed":true} - │ └── ... - │ - ├── {"type":"summary","overall":"pass"} → TUI: финальный результат - ├── {"type":"provision_ready","chip_uid":"..."} → - │ db.py: записать в БД - │ cdc_client: → {"type":"cmd","cmd":"provision_ack",...} - └── TUI: "Плата принята ✅ | UID: A3F2..." | печать этикетки? -``` - ---- - -### Изоляция от HIL тестов разработчика - -| Аспект | HIL тесты (разработка) | Production runner | -|---|---|---| -| Инструмент | pytest | Самостоятельный Python runner | -| Директория | `tools/hil/` | `tools/production/` | -| Окружение uv | `tools/hil/pyproject.toml` | `tools/production/pyproject.toml` | -| Just рецепты | `just host::hil-*` | `just host::production-run` | -| Прошивка | HIL ELF в RAM (pyOCD) | firmware_test в Flash (spsdk) | -| Транспорт | UART CLI (pyserial) | USB CDC JSON-lines | -| UX | Терминал / pytest output | TUI (Textual) | -| БД | Нет | Да | -| M5StampPLC | Да (реле для сигналов) | Да (те же реле) | -| CI | Да (автоматический) | Нет | - -Общий код (M5 агент, низкоуровневый spsdk wrapper) можно вынести в -`tools/shared/` и подключать как локальный пакет в обоих `pyproject.toml`. - ---- - -### Открытые вопросы для обсуждения - -- [ ] **TUI библиотека:** Textual (современный, богатый) или Rich (проще, достаточно)? - Или вообще минималистичный вывод без TUI фреймворка на первой итерации? -- [ ] **БД:** SQLite локально на сервере или REST API на внешний сервис? -- [ ] **Этикетка:** нужна ли автоматическая печать после provisioning? -- [ ] **Несколько стендов:** один сервер управляет несколькими платами параллельно - или всегда одна плата? -- [ ] **Первая итерация:** допустимо ли начать с простого `run.py` без TUI - (plain print + input) и добавить TUI позже? +- [ ] TUI: Textual или Rich или plain print на первой итерации? +- [ ] БД: SQLite локально или REST API? +- [ ] Несколько стендов параллельно или всегда один? +- [ ] Этикетка: нужна ли автоматическая печать после provisioning? \ No newline at end of file diff --git a/firmware/test/fatfs/CMakeLists.txt b/firmware/test/fatfs/CMakeLists.txt new file mode 100644 index 0000000..eced683 --- /dev/null +++ b/firmware/test/fatfs/CMakeLists.txt @@ -0,0 +1,29 @@ +# firmware_test_fatfs — FatFS, скомпилированный с bare-metal ffconf.h. +# +# ff.c, fsl_sd_disk.c, diskio_sd.c включают ff.h → ffconf.h. Все три +# компилируются здесь, чтобы видели один и тот же ffconf.h из +# ${CMAKE_CURRENT_SOURCE_DIR}/include. +# +# tft_app заведёт свой аналогичный таргет с FreeRTOS ffconf.h — эти два таргета +# никак не пересекаются. + +add_library( + firmware_test_fatfs STATIC + ${SDK_FATFS_FF_SRC} # sdk/middleware/fatfs/source/ff.c + ${SDK_FATFS_SD_DISK_SRC} # sdk/middleware/fatfs/source/fsl_sd_disk/fsl_sd_disk.c + ${PORT_FATFS_SD_SRC} # port/fatfs/sd/src/diskio_sd.c + src/diskio.c) + +# include/ первым — ffconf.h отсюда должен перекрыть любой шаблонный +target_include_directories( + firmware_test_fatfs + PUBLIC include # ffconf.h, виден потребителям (bsp_usd, test_usd) + PRIVATE src) + +target_link_libraries( + firmware_test_fatfs + PUBLIC port_fatfs_sd # diskio_sd.h, ff.h, fsl_sd_disk.h, bsp_sd + PRIVATE bsp_sdmmc_config) # SD_ENABLED транзитивно из bsp_sd, но явно для + # ясности + +target_compile_options(firmware_test_fatfs PRIVATE -w) diff --git a/firmware/test/fatfs/include/ffconf.h b/firmware/test/fatfs/include/ffconf.h new file mode 100644 index 0000000..5aaad96 --- /dev/null +++ b/firmware/test/fatfs/include/ffconf.h @@ -0,0 +1,78 @@ +/* + * ffconf.h — конфигурация FatFS для firmware_test (bare-metal, только SD). + * + * Ключевые отличия от tft_app: + * FF_FS_REENTRANT = 0 — нет RTOS, нет мьютексов + * FF_VOLUMES = 3 — 0: зарезервирован, 1: зарезервирован, 2: SD + * FF_MAX_SS = 512 — SD всегда 512 байт/сектор, ioctl не нужен + */ + +#ifndef _FFCONF_H_ +#define _FFCONF_H_ + +#define FFCONF_DEF 80286 + +/*---------------------------------------------------------------------------/ +/ MSDK adaptation +/---------------------------------------------------------------------------*/ +#define SD_DISK_ENABLE 1 + +/*---------------------------------------------------------------------------/ +/ Function Configurations +/---------------------------------------------------------------------------*/ +#define FF_FS_READONLY 0 +#define FF_FS_MINIMIZE 0 +#define FF_USE_FIND 0 +#define FF_USE_MKFS 0 /* f_mkfs не нужна — карта уже отформатирована */ +#define FF_USE_FASTSEEK 0 +#define FF_USE_EXPAND 0 +#define FF_USE_CHMOD 0 +#define FF_USE_LABEL 0 +#define FF_USE_FORWARD 0 +#define FF_USE_STRFUNC 0 +#define FF_PRINT_LLI 0 +#define FF_PRINT_FLOAT 0 +#define FF_STRF_ENCODE 3 + +/*---------------------------------------------------------------------------/ +/ Locale +/---------------------------------------------------------------------------*/ +#define FF_CODE_PAGE 437 /* U.S. — минимальный, имена файлов ASCII */ + +#define FF_USE_LFN 0 /* только 8.3 — достаточно для FWTEST.TMP */ +#define FF_MAX_LFN 255 +#define FF_LFN_UNICODE 0 +#define FF_LFN_BUF 255 +#define FF_SFN_BUF 12 +#define FF_FS_RPATH 0 /* относительные пути не нужны */ + +/*---------------------------------------------------------------------------/ +/ Drive/Volume Configurations +/---------------------------------------------------------------------------*/ +#define FF_VOLUMES 3 /* 0: зарезервирован, 1: зарезервирован, 2: SD */ +#define FF_STR_VOLUME_ID 0 +#define FF_MULTI_PARTITION 0 + +#define FF_MIN_SS 512 +#define FF_MAX_SS 512 /* SD: всегда 512, GET_SECTOR_SIZE не нужен */ + +#define FF_LBA64 0 +#define FF_MIN_GPT 0x10000000 +#define FF_USE_TRIM 0 + +/*---------------------------------------------------------------------------/ +/ System Configurations +/---------------------------------------------------------------------------*/ +#define FF_FS_TINY 0 +#define FF_FS_EXFAT 0 /* exFAT требует LFN — оба отключены */ +#define FF_FS_NORTC 1 +#define FF_NORTC_MON 1 +#define FF_NORTC_MDAY 1 +#define FF_NORTC_YEAR 2024 +#define FF_FS_NOFSINFO 0 +#define FF_FS_LOCK 0 + +#define FF_FS_REENTRANT 0 /* bare-metal: нет RTOS, нет мьютексов */ + /* FF_FS_TIMEOUT и FF_SYNC_t не нужны */ + +#endif /* _FFCONF_H_ */ \ No newline at end of file diff --git a/firmware/test/fatfs/src/diskio.c b/firmware/test/fatfs/src/diskio.c new file mode 100644 index 0000000..40e2be6 --- /dev/null +++ b/firmware/test/fatfs/src/diskio.c @@ -0,0 +1,62 @@ +/* + * diskio.c — FatFS diskio диспетчер для firmware_test. + * + * FF_VOLUMES=1: единственный диск "0:/" = SDDISK. + * W25Q и RAM-диск отсутствуют — нет зависимости на bsp_qspi_flash. + */ + +#include "diskio.h" + +#include "port/fatfs/diskio_sd.h" + +#define SDDISK 2U + +DSTATUS disk_initialize(BYTE pdrv) +{ + if (pdrv == SDDISK) + { + return microsd_disk_initialize(pdrv); + } + + return STA_NOINIT; +} + +DSTATUS disk_status(BYTE pdrv) +{ + if (pdrv == SDDISK) + { + return microsd_disk_status(pdrv); + } + + return STA_NOINIT; +} + +DRESULT disk_read(BYTE pdrv, BYTE *buff, LBA_t sector, UINT count) +{ + if (pdrv == SDDISK) + { + return microsd_disk_read(pdrv, buff, sector, count); + } + + return RES_PARERR; +} + +DRESULT disk_write(BYTE pdrv, const BYTE *buff, LBA_t sector, UINT count) +{ + if (pdrv == SDDISK) + { + return microsd_disk_write(pdrv, buff, sector, count); + } + + return RES_PARERR; +} + +DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff) +{ + if (pdrv == SDDISK) + { + return microsd_disk_ioctl(pdrv, cmd, buff); + } + + return RES_PARERR; +} \ No newline at end of file diff --git a/firmware/test/src/main.c b/firmware/test/src/main.c index 52503fb..efef25f 100644 --- a/firmware/test/src/main.c +++ b/firmware/test/src/main.c @@ -19,9 +19,11 @@ */ #include "board.h" #include "bsp/led.h" +#include "bsp/sd.h" #include "bsp/tick.h" #include "bsp/usb_cdc.h" #include "cli.h" +#include "ff.h" #include "protocol.h" #include "test_runner.h" @@ -51,6 +53,7 @@ int main(void) bsp_delay(CONNECT_BLINK_MS); } +#if 0 bsp_led_on(LED_APP); cli_init(); @@ -62,4 +65,55 @@ int main(void) cli_process(); test_runner_process(); } +#endif + static FATFS s_fs; + const char *step = "card_detect"; + bool passed = false; + + if (!bsp_sd_is_inserted()) + { + /* нет карты — пропускаем, это не ошибка стека */ + bsp_usb_cdc_write((const uint8_t *) "The card is not inserted.\r\n", 27); + goto sd_smoke_done; + } + + step = "sd_init"; + if (bsp_sd_init() != BSP_OK) + { + goto sd_smoke_fail; + } + + step = "f_mount"; + FRESULT res = f_mount(&s_fs, "2:/", 1); + if (res != FR_OK) + { + bsp_sd_deinit(); + goto sd_smoke_fail; + } + + /* всё ок */ + res = f_unmount("2:/"); + if (res != FR_OK) + { + bsp_sd_deinit(); + goto sd_smoke_fail; + } + bsp_sd_deinit(); + passed = true; + + bsp_usb_cdc_write((const uint8_t *) "The test passed.\r\n", 18); + goto sd_smoke_done; + +sd_smoke_fail: +{ + /* маленький буфер: step не длиннее 16 символов */ + bsp_usb_cdc_write((const uint8_t *) "The test failed.\r\n", 18); +} + (void) passed; + +sd_smoke_done: + while (1) + { + bsp_usb_cdc_poll(); + } } \ No newline at end of file diff --git a/port/CMakeLists.txt b/port/CMakeLists.txt index a4a91bc..9b2baa6 100644 --- a/port/CMakeLists.txt +++ b/port/CMakeLists.txt @@ -2,3 +2,4 @@ if(BUILD_TESTS_HOST) return() endif() add_subdirectory(log) +add_subdirectory(fatfs) diff --git a/port/README.md b/port/README.md index f89547f..fe2e972 100644 --- a/port/README.md +++ b/port/README.md @@ -39,8 +39,8 @@ port/ ├── CMakeLists.txt ├── README.md ← этот файл └── log/ ← UART-адаптер для utils/log +├── fatfs/ ← diskio поверх bsp_sd / bsp_qspi # Планируется: -├── fatfs/ ← diskio поверх bsp_sdio / bsp_qspi └── freertos/ ← heap_4.c, configASSERT, vApplicationHooks ``` @@ -49,7 +49,7 @@ port/ ## Соглашения **Именование таргетов:** `port_<что>_<транспорт>` — например `port_log_uart`, -`port_fatfs_sdio`. Позволяет иметь несколько адаптеров для одной библиотеки. +`port_fatfs_sd`. Позволяет иметь несколько адаптеров для одной библиотеки. **Include-путь:** `#include "port/<модуль>.h"` — публичные заголовки всегда в `port/<модуль>/include/port/`. diff --git a/port/fatfs/CMakeLists.txt b/port/fatfs/CMakeLists.txt new file mode 100644 index 0000000..c02337f --- /dev/null +++ b/port/fatfs/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(sd) diff --git a/port/fatfs/sd/CMakeLists.txt b/port/fatfs/sd/CMakeLists.txt new file mode 100644 index 0000000..41d2dc0 --- /dev/null +++ b/port/fatfs/sd/CMakeLists.txt @@ -0,0 +1,19 @@ +# port_fatfs_sd — INTERFACE: не компилирует diskio_sd.c сам. +# +# Причина: diskio_sd.c включает diskio.h → ff.h → ffconf.h, который разный у +# firmware_test (bare-metal) и tft_app (FreeRTOS). Каждый бинарник компилирует +# diskio_sd.c в свой FatFS-таргет сам, используя PORT_FATFS_SD_SRC. + +add_library(port_fatfs_sd INTERFACE) + +target_include_directories(port_fatfs_sd INTERFACE include) + +target_link_libraries( + port_fatfs_sd + INTERFACE sdk_fatfs_headers # ff.h, fsl_sd_disk.h + SDK_FATFS_*_SRC + bsp_sd) # g_sd, bsp_sd_is_inserted() + +set(PORT_FATFS_SD_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/src/diskio_sd.c + CACHE INTERNAL + "port_fatfs_sd: путь к diskio_sd.c (компилировать per-binary)") diff --git a/port/fatfs/sd/include/port/fatfs/diskio_sd.h b/port/fatfs/sd/include/port/fatfs/diskio_sd.h new file mode 100644 index 0000000..2ebaebf --- /dev/null +++ b/port/fatfs/sd/include/port/fatfs/diskio_sd.h @@ -0,0 +1,20 @@ +/* + * diskio_sd — реализация FatFS diskio-интерфейса для microSD через fsl_sd_disk. + * + * Функции microsd_disk_* вызываются диспетчером diskio.c каждого бинарника. + * Никогда не вызывать напрямую из прикладного кода. + */ + +#ifndef PORT_FATFS_DISKIO_SD_H +#define PORT_FATFS_DISKIO_SD_H + +#include "diskio.h" /* DSTATUS, DRESULT, BYTE, LBA_t, UINT */ +#include "ff.h" + +DSTATUS microsd_disk_initialize(BYTE pdrv); +DSTATUS microsd_disk_status(BYTE pdrv); +DRESULT microsd_disk_read(BYTE pdrv, BYTE *buff, LBA_t sector, UINT count); +DRESULT microsd_disk_write(BYTE pdrv, const BYTE *buff, LBA_t sector, UINT count); +DRESULT microsd_disk_ioctl(BYTE pdrv, BYTE cmd, void *buff); + +#endif /* PORT_FATFS_DISKIO_SD_H */ \ No newline at end of file diff --git a/port/fatfs/sd/src/diskio_sd.c b/port/fatfs/sd/src/diskio_sd.c new file mode 100644 index 0000000..e06428e --- /dev/null +++ b/port/fatfs/sd/src/diskio_sd.c @@ -0,0 +1,37 @@ +/* + * diskio_sd — тонкая обёртка fsl_sd_disk → FatFS diskio для microSD. + * + * fsl_sd_disk.c из SDK уже реализует sd_disk_* поверх fsl_sd / USDHC. + * Наша задача — только пробросить вызовы и изолировать номер диска: + * sd_disk_* всегда работают с диском 0 внутри себя, pdrv мы передаём + * для соблюдения сигнатуры, но fsl_sd_disk игнорирует его значение. + */ + +#include "port/fatfs/diskio_sd.h" + +#include "fsl_sd_disk.h" + +DSTATUS microsd_disk_initialize(BYTE pdrv) +{ + return sd_disk_initialize(pdrv); +} + +DSTATUS microsd_disk_status(BYTE pdrv) +{ + return sd_disk_status(pdrv); +} + +DRESULT microsd_disk_read(BYTE pdrv, BYTE *buff, LBA_t sector, UINT count) +{ + return sd_disk_read(pdrv, buff, sector, count); +} + +DRESULT microsd_disk_write(BYTE pdrv, const BYTE *buff, LBA_t sector, UINT count) +{ + return sd_disk_write(pdrv, buff, sector, count); +} + +DRESULT microsd_disk_ioctl(BYTE pdrv, BYTE cmd, void *buff) +{ + return sd_disk_ioctl(pdrv, cmd, buff); +} \ No newline at end of file diff --git a/project_tree.txt b/project_tree.txt new file mode 100644 index 0000000..4cec5a5 --- /dev/null +++ b/project_tree.txt @@ -0,0 +1,300 @@ +. +├── bootstrap.sh +├── bsp +│   ├── button +│   │   ├── CMakeLists.txt +│   │   ├── include +│   │   ├── README.md +│   │   └── src +│   ├── can +│   │   ├── CMakeLists.txt +│   │   ├── include +│   │   ├── mocks +│   │   ├── README.md +│   │   └── src +│   ├── CMakeLists.txt +│   ├── common +│   │   ├── CMakeLists.txt +│   │   └── include +│   ├── display +│   │   ├── CMakeLists.txt +│   │   ├── include +│   │   ├── README.md +│   │   └── src +│   ├── generated +│   │   ├── board +│   │   ├── board.c +│   │   ├── board.h +│   │   ├── clock_config.c +│   │   ├── clock_config.h +│   │   ├── pin_mux.c +│   │   ├── pin_mux.h +│   │   ├── README.md +│   │   ├── startup +│   │   ├── syscalls.c +│   │   └── TFT_Board.mex +│   ├── led +│   │   ├── CMakeLists.txt +│   │   ├── include +│   │   ├── README.md +│   │   └── src +│   ├── opto +│   │   ├── CMakeLists.txt +│   │   ├── include +│   │   ├── README.md +│   │   └── src +│   ├── qspi_flash +│   │   ├── CMakeLists.txt +│   │   ├── include +│   │   ├── README.md +│   │   ├── REFACTORING.md +│   │   └── src +│   ├── README.md +│   ├── sdram +│   │   ├── CMakeLists.txt +│   │   ├── include +│   │   ├── README.md +│   │   └── src +│   ├── tick +│   │   ├── CMakeLists.txt +│   │   ├── include +│   │   ├── README.md +│   │   └── src +│   ├── uart_host +│   │   ├── CMakeLists.txt +│   │   ├── include +│   │   ├── mocks +│   │   ├── README.md +│   │   └── src +│   └── usb_cdc +│   ├── CMakeLists.txt +│   ├── include +│   ├── README.md +│   └── src +├── cmake +│   ├── linker +│   │   ├── MIMXRT1052xxxxx_flexspi_nor_sdram.ld +│   │   ├── MIMXRT1052xxxxx_flexspi_nor.ld +│   │   ├── MIMXRT1052xxxxx_ram.ld +│   │   ├── MIMXRT1052xxxxx_sdram_txt.ld +│   │   └── MIMXRT1052xxxxx_sdram.ld +│   ├── toolchain_arm.cmake +│   └── toolchain_host.cmake +├── CMakeLists.txt +├── CMakePresets.json +├── docs +│   ├── DEV_ARCH.md +│   ├── hardware +│   │   ├── board +│   │   ├── m5stamPLC +│   │   ├── MCULINKINSERT.pdf +│   │   └── tft_displays +│   ├── HOW_TO_DEBUG.md +│   ├── HOW_TO_FLASH.md +│   ├── mimxrt1052 +│   │   ├── BOOT_FLAGS.md +│   │   ├── HAB_GUIDE.md +│   │   ├── manufacturing_user's_guide.pdf +│   │   └── mcu_rm.pdf +│   └── testing +│   ├── hil +│   ├── host +│   └── PROTOCOL.md +├── firmware +│   ├── bootloader +│   ├── test +│   │   ├── CMakeLists.txt +│   │   ├── PLAN.md +│   │   ├── README.md +│   │   └── src +│   └── tft_app +├── just +│   ├── build.just +│   ├── ci_workflow.md +│   ├── ci.just +│   └── host.just +├── Justfile +├── lib +│   ├── CMakeLists.txt +│   ├── fff +│   │   ├── buildandtest +│   │   ├── CMakeLists.txt +│   │   ├── examples +│   │   ├── fakegen.rb +│   │   ├── fff.h +│   │   ├── LICENSE +│   │   ├── README.md +│   │   └── test +│   ├── SEGGER +│   │   ├── RTT +│   │   └── wrapper +│   └── Unity +│   ├── auto +│   ├── CMakeLists.txt +│   ├── docs +│   ├── examples +│   ├── extras +│   ├── library.json +│   ├── LICENSE.txt +│   ├── meson_options.txt +│   ├── meson.build +│   ├── platformio-build.py +│   ├── README.md +│   ├── src +│   ├── test +│   └── unityConfig.cmake +├── port +│   ├── CMakeLists.txt +│   ├── log +│   │   ├── CMakeLists.txt +│   │   ├── include +│   │   ├── README.md +│   │   └── src +│   └── README.md +├── project_tree.txt +├── pyocd_debug.yaml +├── pyocd.yaml +├── README.md +├── sdk +│   ├── boards +│   │   └── evkbimxrt1050 +│   ├── CMakeLists.txt +│   ├── CMSIS +│   │   ├── Core +│   │   ├── Driver +│   │   ├── DSP +│   │   ├── LICENSE.txt +│   │   ├── NN +│   │   └── RTOS2 +│   ├── components +│   │   ├── audio +│   │   ├── button +│   │   ├── codec +│   │   ├── common_task +│   │   ├── crc +│   │   ├── display +│   │   ├── exception_handling +│   │   ├── flash +│   │   ├── gpio +│   │   ├── i2c +│   │   ├── internal_flash +│   │   ├── led +│   │   ├── lists +│   │   ├── log +│   │   ├── mem_manager +│   │   ├── messaging +│   │   ├── mx25r_flash +│   │   ├── osa +│   │   ├── panic +│   │   ├── phy +│   │   ├── pmic +│   │   ├── reset +│   │   ├── rng +│   │   ├── rtt +│   │   ├── sensor +│   │   ├── serial_manager +│   │   ├── silicon_id +│   │   ├── spi +│   │   ├── timer +│   │   ├── timer_manager +│   │   ├── touch +│   │   ├── uart +│   │   ├── video +│   │   └── wifi_bt_module +│   ├── COPYING-BSD-3 +│   ├── devices +│   │   └── MIMXRT1052 +│   ├── docs +│   │   └── readme.md +│   ├── LA_OPT_NXP_Software_License.txt +│   ├── middleware +│   │   ├── audio_voice +│   │   ├── cjson +│   │   ├── dhara +│   │   ├── fatfs +│   │   ├── freemaster +│   │   ├── libjpeg +│   │   ├── littlefs +│   │   ├── mcuboot_opensource +│   │   ├── pkcs11 +│   │   ├── pngdec +│   │   ├── sdmmc +│   │   ├── tfm +│   │   ├── tinycbor +│   │   └── usb +│   ├── MIMXRT1052xxxxB_manifest_v3_15.xml +│   ├── README.md +│   ├── rtos +│   │   └── freertos +│   ├── sdk_tree.txt +│   ├── SW-Content-Register.txt +│   └── tools +│   └── cmake_toolchain_files +├── tests +│   ├── CMakeLists.txt +│   ├── host +│   │   ├── button +│   │   ├── can +│   │   ├── cli +│   │   ├── CMakeLists.txt +│   │   ├── led +│   │   ├── log +│   │   ├── mocks +│   │   ├── opto +│   │   ├── prio_queue +│   │   ├── protocol +│   │   ├── README.md +│   │   ├── ring_buffer +│   │   ├── runner +│   │   ├── timeout +│   │   └── uart_host +│   └── target +│   ├── CMakeLists.txt +│   ├── hil_button +│   ├── hil_can +│   ├── hil_opto +│   ├── hil_usb_cdc +│   └── host_uart +├── tools +│   ├── hil +│   │   ├── __pycache__ +│   │   ├── 01_test_uart.py +│   │   ├── 02_test_opto.py +│   │   ├── 03_test_can.py +│   │   ├── 04_test_button.py +│   │   ├── 05_test_usb_cdc.py +│   │   ├── conftest.py +│   │   ├── env_config.py +│   │   ├── load_and_run.py +│   │   ├── m5 +│   │   ├── pyocd_utils.py +│   │   ├── pyproject.toml +│   │   ├── README.md +│   │   └── uv.lock +│   ├── host +│   │   ├── dcd +│   │   ├── flash_swd.py +│   │   ├── flash_usb.py +│   │   ├── hab +│   │   ├── pyproject.toml +│   │   ├── README.md +│   │   └── uv.lock +│   ├── production +│   └── shared +└── utils + ├── CMakeLists.txt + ├── log + │   ├── log.c + │   ├── log.h + │   └── README.md + ├── prio_queue + │   ├── prio_queue.c + │   ├── prio_queue.h + │   └── README.md + ├── README.md + └── ring_buffer + ├── README.md + ├── ring_buffer.c + └── ring_buffer.h + +174 directories, 124 files diff --git a/sdk/CMakeLists.txt b/sdk/CMakeLists.txt index f4338ed..82d66a8 100644 --- a/sdk/CMakeLists.txt +++ b/sdk/CMakeLists.txt @@ -33,7 +33,12 @@ target_compile_definitions(sdk_device PUBLIC CPU_MIMXRT1052CVJ5B) # ----------------------------------------------------------------------------- # Утилиты — базовые вещи, нужны большинству драйверов # ----------------------------------------------------------------------------- -add_sdk_driver(common fsl_common.c) +add_library(sdk_common STATIC devices/MIMXRT1052/drivers/fsl_common.c + devices/MIMXRT1052/drivers/fsl_common_arm.c) +target_include_directories(sdk_common PUBLIC devices/MIMXRT1052/drivers) +target_compile_definitions( + sdk_common PUBLIC SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY=600000000U) +target_link_libraries(sdk_common PUBLIC sdk_device) add_sdk_driver(clock fsl_clock.c) # clock зависит от common @@ -50,6 +55,7 @@ add_sdk_driver(lpi2c fsl_lpi2c.c) add_sdk_driver(pwm fsl_pwm.c) add_sdk_driver(adc fsl_adc.c) add_sdk_driver(elcdif fsl_elcdif.c) +add_sdk_driver(cache fsl_cache.c) # Драйверы которые зависят от clock target_link_libraries(sdk_lpuart PUBLIC sdk_clock) @@ -101,15 +107,67 @@ target_link_libraries( sdk_usb_config sdk_osa_bm) target_compile_options(sdk_usb_device_ehci PRIVATE -w) -# --- sdk_usb_device_ch9: Chapter 9 standard requests --- -# add_library(sdk_usb_device_ch9 STATIC middleware/usb/device/usb_device_ch9.c) -# target_include_directories( sdk_usb_device_ch9 PUBLIC middleware/usb/device -# middleware/usb/device/class) target_link_libraries(sdk_usb_device_ch9 PUBLIC -# sdk_usb_device_ehci) target_compile_options(sdk_usb_device_ch9 PRIVATE -w) - # --- sdk_usb_phy: USB PHY --- add_library(sdk_usb_phy STATIC middleware/usb/phy/usb_phy.c) target_include_directories(sdk_usb_phy PUBLIC middleware/usb/phy) target_link_libraries(sdk_usb_phy PUBLIC sdk_device sdk_common sdk_usb_common sdk_usb_config sdk_osa_bm) target_compile_options(sdk_usb_phy PRIVATE -w) + +# ============================================================================= +# SDMMC middleware — SD-карта через USDHC, non-blocking (interrupt-driven). +# +# НЕ зависит от ffconf.h → безопасно компилировать один раз как общую +# статическую библиотеку. Оба бинарника (firmware_test, tft_app) линкуются к +# одному и тому же sdk_sdmmc_sd. +# +# ============================================================================= +add_library( + sdk_sdmmc_sd STATIC + middleware/sdmmc/sd/fsl_sd.c middleware/sdmmc/common/fsl_sdmmc_common.c + middleware/sdmmc/osa/fsl_sdmmc_osa.c + middleware/sdmmc/host/usdhc/non_blocking/fsl_sdmmc_host.c) + +target_include_directories( + sdk_sdmmc_sd + PUBLIC middleware/sdmmc/sd middleware/sdmmc/common middleware/sdmmc/osa + middleware/sdmmc/host/usdhc/non_blocking middleware/sdmmc/host/usdhc) + +target_link_libraries(sdk_sdmmc_sd PUBLIC sdk_usdhc sdk_osa_bm sdk_cache + sdk_common) + +# Подавляем предупреждения SDK — они нам не принадлежат. +target_compile_options(sdk_sdmmc_sd PRIVATE -w) + +# ============================================================================= +# FatFS — только заголовки и переменные с путями к исходникам. +# +# ff.c и fsl_sd_disk.c НЕ компилируются здесь, потому что оба включают ff.h → +# ffconf.h, который разный у firmware_test (bare-metal) и tft_app (FreeRTOS). +# Каждый бинарник сам добавляет их в свои sources. +# +# Использование в CMakeLists.txt бинарника: +# target_link_libraries(my_fatfs_target PRIVATE sdk_fatfs_headers) +# target_sources(my_fatfs_target PRIVATE ${SDK_FATFS_FF_SRC} +# ${SDK_FATFS_SD_DISK_SRC}) +# ============================================================================= +add_library(sdk_fatfs_headers INTERFACE) +target_include_directories( + sdk_fatfs_headers INTERFACE middleware/fatfs/source + middleware/fatfs/source/fsl_sd_disk) +# Транзитивно тащим SDMMC: fsl_sd_disk.c вызывает SD_*() из sdk_sdmmc_sd. +target_link_libraries(sdk_fatfs_headers INTERFACE sdk_sdmmc_sd) + +# Пути к исходникам, которые должны компилироваться per-binary. CACHE INTERNAL — +# видны во всём дереве, не переопределяются. +set(SDK_FATFS_FF_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/middleware/fatfs/source/ff.c + CACHE INTERNAL + "FatFS: путь к ff.c (компилировать per-binary с нужным ffconf.h)") + +set(SDK_FATFS_SD_DISK_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/middleware/fatfs/source/fsl_sd_disk/fsl_sd_disk.c + CACHE + INTERNAL + "FatFS: путь к fsl_sd_disk.c (компилировать per-binary с нужным ffconf.h)" +) diff --git a/sdk/middleware/fatfs/source/diskio.h b/sdk/middleware/fatfs/source/diskio.h index 8b3b224..ae0652c 100644 --- a/sdk/middleware/fatfs/source/diskio.h +++ b/sdk/middleware/fatfs/source/diskio.h @@ -5,78 +5,78 @@ #ifndef _DISKIO_DEFINED #define _DISKIO_DEFINED +#include "ff.h" #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif /* Definitions of physical drive number for each drive */ -#define RAMDISK 0 /* Example: ram disk to physical drive 0 */ -#define USBDISK 1 /* usb disk to physical drive 1 */ -#define SDDISK 2 /* sd disk to physical drive 2 */ -#define MMCDISK 3 /* mmc disk to physical drive 3 */ -#define SDSPIDISK 4 /* sdspi disk to physical drive 4 */ -#define NANDDISK 5 /* nand disk to physical drive 5 */ +#define RAMDISK 0 /* Example: ram disk to physical drive 0 */ +#define USBDISK 1 /* usb disk to physical drive 1 */ +#define SDDISK 2 /* sd disk to physical drive 2 */ +#define MMCDISK 3 /* mmc disk to physical drive 3 */ +#define SDSPIDISK 4 /* sdspi disk to physical drive 4 */ +#define NANDDISK 5 /* nand disk to physical drive 5 */ -/* Status of Disk Functions */ -typedef BYTE DSTATUS; + /* Status of Disk Functions */ + typedef BYTE DSTATUS; -/* Results of Disk Functions */ -typedef enum { - RES_OK = 0, /* 0: Successful */ - RES_ERROR, /* 1: R/W Error */ - RES_WRPRT, /* 2: Write Protected */ - RES_NOTRDY, /* 3: Not Ready */ - RES_PARERR /* 4: Invalid Parameter */ -} DRESULT; + /* Results of Disk Functions */ + typedef enum + { + RES_OK = 0, /* 0: Successful */ + RES_ERROR, /* 1: R/W Error */ + RES_WRPRT, /* 2: Write Protected */ + RES_NOTRDY, /* 3: Not Ready */ + RES_PARERR /* 4: Invalid Parameter */ + } DRESULT; + /*---------------------------------------*/ + /* Prototypes for disk control functions */ -/*---------------------------------------*/ -/* Prototypes for disk control functions */ + DSTATUS disk_initialize(BYTE pdrv); + DSTATUS disk_status(BYTE pdrv); + DRESULT disk_read(BYTE pdrv, BYTE *buff, LBA_t sector, UINT count); + DRESULT disk_write(BYTE pdrv, const BYTE *buff, LBA_t sector, UINT count); + DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff); + /* Disk Status Bits (DSTATUS) */ -DSTATUS disk_initialize (BYTE pdrv); -DSTATUS disk_status (BYTE pdrv); -DRESULT disk_read (BYTE pdrv, BYTE* buff, LBA_t sector, UINT count); -DRESULT disk_write (BYTE pdrv, const BYTE* buff, LBA_t sector, UINT count); -DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff); - - -/* Disk Status Bits (DSTATUS) */ - -#define STA_NOINIT 0x01 /* Drive not initialized */ -#define STA_NODISK 0x02 /* No medium in the drive */ -#define STA_PROTECT 0x04 /* Write protected */ - +#define STA_NOINIT 0x01 /* Drive not initialized */ +#define STA_NODISK 0x02 /* No medium in the drive */ +#define STA_PROTECT 0x04 /* Write protected */ /* Command code for disk_ioctrl fucntion */ /* Generic command (Used by FatFs) */ -#define CTRL_SYNC 0 /* Complete pending write process (needed at FF_FS_READONLY == 0) */ -#define GET_SECTOR_COUNT 1 /* Get media size (needed at FF_USE_MKFS == 1) */ -#define GET_SECTOR_SIZE 2 /* Get sector size (needed at FF_MAX_SS != FF_MIN_SS) */ -#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at FF_USE_MKFS == 1) */ -#define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at FF_USE_TRIM == 1) */ +#define CTRL_SYNC 0 /* Complete pending write process (needed at FF_FS_READONLY == 0) */ +#define GET_SECTOR_COUNT 1 /* Get media size (needed at FF_USE_MKFS == 1) */ +#define GET_SECTOR_SIZE 2 /* Get sector size (needed at FF_MAX_SS != FF_MIN_SS) */ +#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at FF_USE_MKFS == 1) */ +#define CTRL_TRIM \ + 4 /* Inform device that the data on the block of sectors is no longer used (needed at FF_USE_TRIM == 1) */ /* Generic command (Not used by FatFs) */ -#define CTRL_POWER 5 /* Get/Set power status */ -#define CTRL_LOCK 6 /* Lock/Unlock media removal */ -#define CTRL_EJECT 7 /* Eject media */ -#define CTRL_FORMAT 8 /* Create physical format on the media */ +#define CTRL_POWER 5 /* Get/Set power status */ +#define CTRL_LOCK 6 /* Lock/Unlock media removal */ +#define CTRL_EJECT 7 /* Eject media */ +#define CTRL_FORMAT 8 /* Create physical format on the media */ /* MMC/SDC specific ioctl command */ -#define MMC_GET_TYPE 10 /* Get card type */ -#define MMC_GET_CSD 11 /* Get CSD */ -#define MMC_GET_CID 12 /* Get CID */ -#define MMC_GET_OCR 13 /* Get OCR */ -#define MMC_GET_SDSTAT 14 /* Get SD status */ -#define ISDIO_READ 55 /* Read data form SD iSDIO register */ -#define ISDIO_WRITE 56 /* Write data to SD iSDIO register */ -#define ISDIO_MRITE 57 /* Masked write data to SD iSDIO register */ +#define MMC_GET_TYPE 10 /* Get card type */ +#define MMC_GET_CSD 11 /* Get CSD */ +#define MMC_GET_CID 12 /* Get CID */ +#define MMC_GET_OCR 13 /* Get OCR */ +#define MMC_GET_SDSTAT 14 /* Get SD status */ +#define ISDIO_READ 55 /* Read data form SD iSDIO register */ +#define ISDIO_WRITE 56 /* Write data to SD iSDIO register */ +#define ISDIO_MRITE 57 /* Masked write data to SD iSDIO register */ /* ATA/CF specific ioctl command */ -#define ATA_GET_REV 20 /* Get F/W revision */ -#define ATA_GET_MODEL 21 /* Get model name */ -#define ATA_GET_SN 22 /* Get serial number */ +#define ATA_GET_REV 20 /* Get F/W revision */ +#define ATA_GET_MODEL 21 /* Get model name */ +#define ATA_GET_SN 22 /* Get serial number */ #ifdef __cplusplus } diff --git a/sdk/sdk_tree.txt b/sdk/sdk_tree.txt new file mode 100644 index 0000000..c19d200 --- /dev/null +++ b/sdk/sdk_tree.txt @@ -0,0 +1,1738 @@ +. +├── boards +│   └── evkbimxrt1050 +│   ├── cmsis_driver_examples +│   │   ├── enet +│   │   ├── lpi2c +│   │   ├── lpspi +│   │   └── lpuart +│   ├── component_examples +│   │   ├── flash_component +│   │   └── log +│   ├── dcd.c +│   ├── dcd.h +│   ├── demo_apps +│   │   ├── bubble_peripheral +│   │   ├── ecompass +│   │   ├── hello_world +│   │   ├── hello_world_swo +│   │   ├── hello_world_virtual_com +│   │   ├── led_blinky +│   │   ├── lpspi_loopback +│   │   ├── new_project +│   │   ├── power_mode_switch +│   │   ├── pwm_fault +│   │   ├── sai +│   │   ├── sai_peripheral +│   │   ├── shell +│   │   ├── xbar_aoi +│   │   └── xbar_aoi_peripheral +│   ├── display_examples +│   │   └── sd_jpeg +│   ├── driver_examples +│   │   ├── adc +│   │   ├── adc_etc +│   │   ├── bee +│   │   ├── cache +│   │   ├── clockout +│   │   ├── cmp +│   │   ├── csi +│   │   ├── dcp +│   │   ├── edma +│   │   ├── elcdif +│   │   ├── enc +│   │   ├── enet +│   │   ├── ewm +│   │   ├── flexcan +│   │   ├── flexio +│   │   ├── flexram +│   │   ├── flexspi +│   │   ├── gpio +│   │   ├── gpt +│   │   ├── kpp +│   │   ├── lpi2c +│   │   ├── lpspi +│   │   ├── lpuart +│   │   ├── ocotp +│   │   ├── pit +│   │   ├── pwm +│   │   ├── pxp +│   │   ├── qtmr +│   │   ├── rtwdog +│   │   ├── sai +│   │   ├── semc +│   │   ├── snvs +│   │   ├── src +│   │   ├── tempmon +│   │   ├── trng +│   │   ├── wdog +│   │   └── xbara +│   ├── evkbimxrt1050.png +│   ├── fatfs_examples +│   │   ├── fatfs_ramdisk +│   │   └── fatfs_ramdisk_freertos +│   ├── freemaster_examples +│   │   ├── fmstr_any +│   │   ├── fmstr_can +│   │   ├── fmstr_pdbdm +│   │   ├── fmstr_rtt +│   │   ├── fmstr_uart +│   │   └── fmstr_usb_cdc +│   ├── freertos_driver_examples +│   │   ├── freertos_lpspi +│   │   ├── freertos_lpspi_b2b +│   │   └── freertos_lpuart +│   ├── freertos_examples +│   │   ├── freertos_event +│   │   ├── freertos_generic +│   │   ├── freertos_hello +│   │   ├── freertos_mutex +│   │   ├── freertos_queue +│   │   ├── freertos_sem +│   │   ├── freertos_sem_static +│   │   ├── freertos_swtimer +│   │   └── freertos_tickless +│   ├── littlefs_examples +│   │   └── littlefs_shell +│   ├── ota_examples +│   │   └── ota_mcuboot_basic +│   ├── project_template +│   │   ├── board_project_template.cmake +│   │   ├── board.c +│   │   ├── board.h +│   │   ├── clock_config.c +│   │   ├── clock_config.h +│   │   ├── peripherals.c +│   │   ├── peripherals.h +│   │   ├── pin_mux.c +│   │   └── pin_mux.h +│   ├── sdmmc_examples +│   │   ├── mmccard_freertos +│   │   ├── sdcard_fatfs +│   │   ├── sdcard_fatfs_freertos +│   │   ├── sdcard_freertos +│   │   ├── sdcard_interrupt +│   │   ├── sdcard_polling +│   │   └── sdio_freertos +│   ├── usb_examples +│   │   ├── usb_device_audio_generator +│   │   ├── usb_device_audio_generator_lite +│   │   ├── usb_device_audio_speaker +│   │   ├── usb_device_audio_speaker_lite +│   │   ├── usb_device_cdc_vcom +│   │   ├── usb_device_cdc_vcom_lite +│   │   ├── usb_device_cdc_vnic +│   │   ├── usb_device_cdc_vnic_lite +│   │   ├── usb_device_composite_cdc_msc +│   │   ├── usb_device_composite_cdc_msc_disk +│   │   ├── usb_device_composite_cdc_msc_disk_lite +│   │   ├── usb_device_composite_cdc_msc_lite +│   │   ├── usb_device_composite_cdc_vcom_cdc_vcom +│   │   ├── usb_device_composite_cdc_vcom_cdc_vcom_lite +│   │   ├── usb_device_composite_hid_audio_unified +│   │   ├── usb_device_composite_hid_audio_unified_lite +│   │   ├── usb_device_composite_hid_mouse_hid_keyboard +│   │   ├── usb_device_composite_hid_mouse_hid_keyboard_lite +│   │   ├── usb_device_dfu +│   │   ├── usb_device_dfu_lite +│   │   ├── usb_device_hid_generic +│   │   ├── usb_device_hid_generic_lite +│   │   ├── usb_device_hid_mouse +│   │   ├── usb_device_hid_mouse_lite +│   │   ├── usb_device_msc_disk +│   │   ├── usb_device_msc_disk_lite +│   │   ├── usb_device_msc_ramdisk +│   │   ├── usb_device_msc_ramdisk_lite +│   │   ├── usb_device_mtp +│   │   ├── usb_device_mtp_lite +│   │   ├── usb_device_phdc_weighscale +│   │   ├── usb_device_phdc_weighscale_lite +│   │   ├── usb_device_printer_virtual_plain_text +│   │   ├── usb_device_printer_virtual_plain_text_lite +│   │   ├── usb_device_video_virtual_camera +│   │   ├── usb_device_video_virtual_camera_lite +│   │   ├── usb_host_audio_recorder +│   │   ├── usb_host_audio_speaker +│   │   ├── usb_host_cdc +│   │   ├── usb_host_hid_generic +│   │   ├── usb_host_hid_mouse +│   │   ├── usb_host_hid_mouse_dual +│   │   ├── usb_host_hid_mouse_keyboard +│   │   ├── usb_host_msd_command +│   │   ├── usb_host_msd_fatfs +│   │   ├── usb_host_phdc_manager +│   │   ├── usb_host_printer_plain_text +│   │   ├── usb_host_video_camera +│   │   ├── usb_keyboard2mouse +│   │   ├── usb_pd_alt_mode_dp_host_om13790host +│   │   ├── usb_pd_charger_battery_om13790host +│   │   ├── usb_pd_om13790host +│   │   ├── usb_pd_sink_battery_om13790host +│   │   ├── usb_pd_source_charger_om13790host +│   │   ├── usb_pin_detect_hid_mouse +│   │   ├── usb_pin_detect_hid_msd +│   │   ├── usb_suspend_resume_device_hid_mouse +│   │   ├── usb_suspend_resume_device_hid_mouse_lite +│   │   └── usb_suspend_resume_host_hid_mouse +│   └── xip +│   ├── board_boot_header.cmake +│   ├── evkbimxrt1050_flexspi_nor_config.c +│   └── evkbimxrt1050_flexspi_nor_config.h +├── CMakeLists.txt +├── CMSIS +│   ├── Core +│   │   └── Include +│   │   ├── cmsis_clang.h +│   │   ├── cmsis_compiler.h +│   │   ├── cmsis_gcc.h +│   │   ├── CMSIS_Include_core_cm.cmake +│   │   ├── cmsis_version.h +│   │   ├── core_cm7.h +│   │   └── m-profile +│   ├── Driver +│   │   ├── CMSIS_Driver_Include_CAN.cmake +│   │   ├── CMSIS_Driver_Include_Ethernet_MAC.cmake +│   │   ├── CMSIS_Driver_Include_Ethernet_PHY.cmake +│   │   ├── CMSIS_Driver_Include_Ethernet.cmake +│   │   ├── CMSIS_Driver_Include_Flash.cmake +│   │   ├── CMSIS_Driver_Include_GPIO.cmake +│   │   ├── CMSIS_Driver_Include_I2C.cmake +│   │   ├── CMSIS_Driver_Include_MCI.cmake +│   │   ├── CMSIS_Driver_Include_NAND.cmake +│   │   ├── CMSIS_Driver_Include_SAI.cmake +│   │   ├── CMSIS_Driver_Include_SPI.cmake +│   │   ├── CMSIS_Driver_Include_USART.cmake +│   │   ├── CMSIS_Driver_Include_USB_Device.cmake +│   │   ├── CMSIS_Driver_Include_USB_Host.cmake +│   │   ├── CMSIS_Driver_Include_WiFi.cmake +│   │   ├── Include +│   │   │   ├── Driver_CAN.h +│   │   │   ├── Driver_Common.h +│   │   │   ├── Driver_ETH_MAC.h +│   │   │   ├── Driver_ETH_PHY.h +│   │   │   ├── Driver_ETH.h +│   │   │   ├── Driver_Flash.h +│   │   │   ├── Driver_I2C.h +│   │   │   ├── Driver_MCI.h +│   │   │   ├── Driver_NAND.h +│   │   │   ├── Driver_SAI.h +│   │   │   ├── Driver_SPI.h +│   │   │   ├── Driver_Storage.h +│   │   │   ├── Driver_USART.h +│   │   │   ├── Driver_USB.h +│   │   │   ├── Driver_USBD.h +│   │   │   ├── Driver_USBH.h +│   │   │   ├── Driver_WiFi.h +│   │   │   └── GPIO +│   │   └── VIO +│   │   ├── cmsis_vio.scvd +│   │   ├── Include +│   │   └── Source +│   ├── DSP +│   │   ├── CMSIS_DSP_Include.cmake +│   │   ├── CMSIS_DSP_Source.cmake +│   │   ├── Include +│   │   │   ├── arm_common_tables_f16.h +│   │   │   ├── arm_common_tables.h +│   │   │   ├── arm_const_structs_f16.h +│   │   │   ├── arm_const_structs.h +│   │   │   ├── arm_helium_utils.h +│   │   │   ├── arm_math_f16.h +│   │   │   ├── arm_math_memory.h +│   │   │   ├── arm_math_types_f16.h +│   │   │   ├── arm_math_types.h +│   │   │   ├── arm_math.h +│   │   │   ├── arm_mve_tables_f16.h +│   │   │   ├── arm_mve_tables.h +│   │   │   ├── arm_vec_math_f16.h +│   │   │   ├── arm_vec_math.h +│   │   │   └── dsp +│   │   ├── LICENSE +│   │   ├── PrivateInclude +│   │   │   ├── arm_sorting.h +│   │   │   ├── arm_vec_fft.h +│   │   │   └── arm_vec_filtering.h +│   │   └── Source +│   │   ├── BasicMathFunctions +│   │   ├── BayesFunctions +│   │   ├── CommonTables +│   │   ├── ComplexMathFunctions +│   │   ├── ControllerFunctions +│   │   ├── DistanceFunctions +│   │   ├── FastMathFunctions +│   │   ├── FilteringFunctions +│   │   ├── InterpolationFunctions +│   │   ├── MatrixFunctions +│   │   ├── QuaternionMathFunctions +│   │   ├── StatisticsFunctions +│   │   ├── SupportFunctions +│   │   ├── SVMFunctions +│   │   ├── TransformFunctions +│   │   └── WindowFunctions +│   ├── LICENSE.txt +│   ├── NN +│   │   ├── CMSIS_NN_Source.cmake +│   │   ├── Include +│   │   │   ├── arm_nn_math_types.h +│   │   │   ├── arm_nn_tables.h +│   │   │   ├── arm_nn_types.h +│   │   │   ├── arm_nnfunctions.h +│   │   │   ├── arm_nnsupportfunctions.h +│   │   │   └── Internal +│   │   ├── LICENSE +│   │   ├── README.md +│   │   └── Source +│   │   ├── ActivationFunctions +│   │   ├── BasicMathFunctions +│   │   ├── ConcatenationFunctions +│   │   ├── ConvolutionFunctions +│   │   ├── FullyConnectedFunctions +│   │   ├── LSTMFunctions +│   │   ├── NNSupportFunctions +│   │   ├── PoolingFunctions +│   │   ├── ReshapeFunctions +│   │   ├── SoftmaxFunctions +│   │   └── SVDFunctions +│   └── RTOS2 +│   ├── CMSIS_RTOS2_RTX_LIB.cmake +│   ├── CMSIS_RTOS2_RTX.cmake +│   ├── Include +│   │   ├── CMSIS_Device_API_OSTick.cmake +│   │   ├── CMSIS_Device_API_RTOS2.cmake +│   │   ├── cmsis_os2.h +│   │   └── os_tick.h +│   ├── RTX +│   │   ├── Config +│   │   ├── Include +│   │   ├── Library +│   │   ├── LICENSE +│   │   └── Source +│   └── Source +│   └── os_systick.c +├── components +│   ├── audio +│   │   ├── component_audio_sai_edma_adapter.MIMXRT1052.cmake +│   │   ├── fsl_adapter_audio.h +│   │   └── fsl_adapter_sai.c +│   ├── button +│   │   ├── component_button.MIMXRT1052.cmake +│   │   ├── fsl_component_button.c +│   │   └── fsl_component_button.h +│   ├── codec +│   │   ├── ak4497 +│   │   │   ├── driver_ak4497.MIMXRT1052.cmake +│   │   │   ├── fsl_ak4497.c +│   │   │   └── fsl_ak4497.h +│   │   ├── component_ak4497_adapter.MIMXRT1052.cmake +│   │   ├── component_codec_adapters.MIMXRT1052.cmake +│   │   ├── component_cs42448_adapter.MIMXRT1052.cmake +│   │   ├── component_cs42888_adapter.MIMXRT1052.cmake +│   │   ├── component_da7212_adapter.MIMXRT1052.cmake +│   │   ├── component_pcm186x_adapter.MIMXRT1052.cmake +│   │   ├── component_pcm512x_adapter.MIMXRT1052.cmake +│   │   ├── component_sgtl_adapter.MIMXRT1052.cmake +│   │   ├── component_tfa9896_adapter.MIMXRT1052.cmake +│   │   ├── component_tfa9xxx_adapter.MIMXRT1052.cmake +│   │   ├── component_wm8524_adapter.MIMXRT1052.cmake +│   │   ├── component_wm8904_adapter.MIMXRT1052.cmake +│   │   ├── component_wm8960_adapter.MIMXRT1052.cmake +│   │   ├── component_wm8962_adapter.MIMXRT1052.cmake +│   │   ├── cs42448 +│   │   │   ├── driver_cs42448.MIMXRT1052.cmake +│   │   │   ├── fsl_cs42448.c +│   │   │   └── fsl_cs42448.h +│   │   ├── cs42888 +│   │   │   ├── driver_cs42888.MIMXRT1052.cmake +│   │   │   ├── fsl_cs42888.c +│   │   │   └── fsl_cs42888.h +│   │   ├── da7212 +│   │   │   ├── driver_dialog7212.MIMXRT1052.cmake +│   │   │   ├── fsl_dialog7212.c +│   │   │   └── fsl_dialog7212.h +│   │   ├── driver_codec.MIMXRT1052.cmake +│   │   ├── fsl_codec_common.c +│   │   ├── fsl_codec_common.h +│   │   ├── i2c +│   │   │   ├── component_codec_i2c.MIMXRT1052.cmake +│   │   │   ├── fsl_codec_i2c.c +│   │   │   └── fsl_codec_i2c.h +│   │   ├── pcm186x +│   │   │   ├── driver_pcm186x.MIMXRT1052.cmake +│   │   │   ├── fsl_pcm186x.c +│   │   │   └── fsl_pcm186x.h +│   │   ├── pcm512x +│   │   │   ├── driver_pcm512x.MIMXRT1052.cmake +│   │   │   ├── fsl_pcm512x.c +│   │   │   └── fsl_pcm512x.h +│   │   ├── port +│   │   │   ├── ak4497 +│   │   │   ├── cs42448 +│   │   │   ├── cs42888 +│   │   │   ├── da7212 +│   │   │   ├── fsl_codec_adapter.c +│   │   │   ├── fsl_codec_adapter.h +│   │   │   ├── pcm186x +│   │   │   ├── pcm512x +│   │   │   ├── sgtl5000 +│   │   │   ├── tfa9896 +│   │   │   ├── tfa9xxx +│   │   │   ├── wm8524 +│   │   │   ├── wm8904 +│   │   │   ├── wm8960 +│   │   │   └── wm8962 +│   │   ├── sgtl5000 +│   │   │   ├── driver_sgtl5000.MIMXRT1052.cmake +│   │   │   ├── fsl_sgtl5000.c +│   │   │   └── fsl_sgtl5000.h +│   │   ├── tfa9896 +│   │   │   ├── driver_tfa9896.MIMXRT1052.cmake +│   │   │   ├── fsl_hal_registers.c +│   │   │   ├── fsl_tfa9896_buffer.h +│   │   │   ├── fsl_tfa9896.c +│   │   │   ├── fsl_tfa9896.h +│   │   │   └── MIMXRT595595-EVK_TFA9896_SW.pdf +│   │   ├── tfa9xxx +│   │   │   ├── driver_tfa9xxx_hal.MIMXRT1052.cmake +│   │   │   ├── driver_tfa9xxx.MIMXRT1052.cmake +│   │   │   ├── fsl_tfa9xxx_IMX.c +│   │   │   ├── fsl_tfa9xxx.c +│   │   │   ├── fsl_tfa9xxx.h +│   │   │   ├── README.md +│   │   │   ├── tfa_config_TFA9892N1.h +│   │   │   ├── tfa_config_TFA9894N1.h +│   │   │   ├── tfa_config_TFA9894N2.h +│   │   │   ├── tfa_device_hal.c +│   │   │   ├── tfa_device_hal.h +│   │   │   └── vas_tfa_drv +│   │   ├── wm8524 +│   │   │   ├── driver_wm8524.MIMXRT1052.cmake +│   │   │   ├── fsl_wm8524.c +│   │   │   └── fsl_wm8524.h +│   │   ├── wm8904 +│   │   │   ├── driver_wm8904.MIMXRT1052.cmake +│   │   │   ├── fsl_wm8904.c +│   │   │   └── fsl_wm8904.h +│   │   ├── wm8960 +│   │   │   ├── driver_wm8960.MIMXRT1052.cmake +│   │   │   ├── fsl_wm8960.c +│   │   │   └── fsl_wm8960.h +│   │   └── wm8962 +│   │   ├── driver_wm8962.MIMXRT1052.cmake +│   │   ├── fsl_wm8962.c +│   │   └── fsl_wm8962.h +│   ├── common_task +│   │   ├── component_common_task.cmake +│   │   ├── fsl_component_common_task.c +│   │   └── fsl_component_common_task.h +│   ├── crc +│   │   ├── component_software_crc_adapter.MIMXRT1052.cmake +│   │   ├── fsl_adapter_crc.h +│   │   └── fsl_adapter_software_crc.c +│   ├── display +│   │   ├── ili9341 +│   │   │   ├── driver_ili9341.MIMXRT1052.cmake +│   │   │   ├── fsl_ili9341.c +│   │   │   └── fsl_ili9341.h +│   │   ├── psp27801 +│   │   │   ├── driver_psp27801.MIMXRT1052.cmake +│   │   │   ├── fsl_psp27801.c +│   │   │   └── fsl_psp27801.h +│   │   ├── ssd1963 +│   │   │   ├── driver_ssd1963.MIMXRT1052.cmake +│   │   │   ├── fsl_ssd1963.c +│   │   │   └── fsl_ssd1963.h +│   │   └── st7796s +│   │   ├── driver_st7796s.MIMXRT1052.cmake +│   │   ├── fsl_st7796s.c +│   │   └── fsl_st7796s.h +│   ├── exception_handling +│   │   ├── cm7 +│   │   │   └── fsl_component_exception_handling.c +│   │   ├── component_exception_handling_cm7.MIMXRT1052.cmake +│   │   └── fsl_component_exception_handling.h +│   ├── flash +│   │   ├── component_flash_nand_flexspi.MIMXRT1052.cmake +│   │   ├── component_flash_nand_semc.MIMXRT1052.cmake +│   │   ├── component_flash_nor_flexspi.MIMXRT1052.cmake +│   │   ├── component_flash_nor_lpspi.MIMXRT1052.cmake +│   │   ├── mflash +│   │   │   ├── component_mflash_offchip.MIMXRT1052.cmake +│   │   │   ├── component_mflash_onchip.MIMXRT1052.cmake +│   │   │   ├── mflash_common.h +│   │   │   ├── mflash_file.c +│   │   │   ├── mflash_file.h +│   │   │   └── mimxrt1052 +│   │   ├── nand +│   │   │   ├── flexspi +│   │   │   ├── fsl_nand_flash.h +│   │   │   └── semc +│   │   └── nor +│   │   ├── flexspi +│   │   ├── fsl_nor_flash.h +│   │   └── lpspi +│   ├── gpio +│   │   ├── component_igpio_adapter.MIMXRT1052.cmake +│   │   ├── fsl_adapter_gpio.h +│   │   └── fsl_adapter_igpio.c +│   ├── i2c +│   │   ├── component_i2c_adapter_interface.MIMXRT1052.cmake +│   │   ├── component_lpi2c_adapter.MIMXRT1052.cmake +│   │   ├── fsl_adapter_i2c.h +│   │   ├── fsl_adapter_lpi2c.c +│   │   └── muxes +│   │   ├── component_at_least_one_i2c_mux_device_enabled.MIMXRT1052.cmake +│   │   ├── component_enable_pca9544.MIMXRT1052.cmake +│   │   ├── component_enable_pca9548.MIMXRT1052.cmake +│   │   ├── component_i2c_mux_pca954x.MIMXRT1052.cmake +│   │   ├── fsl_pca954x.c +│   │   └── fsl_pca954x.h +│   ├── internal_flash +│   │   ├── component_flash_adapter.MIMXRT1052.cmake +│   │   ├── component_mcxw_flash_adapter.MIMXRT1052.cmake +│   │   ├── fsl_adapter_flash.h +│   │   └── fsl_adapter_mcxw_flash.c +│   ├── led +│   │   ├── component_led.MIMXRT1052.cmake +│   │   ├── fsl_component_led.c +│   │   └── fsl_component_led.h +│   ├── lists +│   │   ├── component_lists.MIMXRT1052.cmake +│   │   ├── fsl_component_generic_list.c +│   │   └── fsl_component_generic_list.h +│   ├── log +│   │   ├── component_log_backend_debug_console_lite.MIMXRT1052.cmake +│   │   ├── component_log_backend_debug_console.MIMXRT1052.cmake +│   │   ├── component_log_backend_ringbuffer.MIMXRT1052.cmake +│   │   ├── component_log.MIMXRT1052.cmake +│   │   ├── fsl_component_log_backend_debugconsole.c +│   │   ├── fsl_component_log_backend_debugconsole.h +│   │   ├── fsl_component_log_backend_ringbuffer.c +│   │   ├── fsl_component_log_backend_ringbuffer.h +│   │   ├── fsl_component_log_config.h +│   │   ├── fsl_component_log.c +│   │   └── fsl_component_log.h +│   ├── mem_manager +│   │   ├── component_mem_manager_freertos.MIMXRT1052.cmake +│   │   ├── component_mem_manager_legacy.MIMXRT1052.cmake +│   │   ├── component_mem_manager_light.MIMXRT1052.cmake +│   │   ├── component_mem_manager.MIMXRT1052.cmake +│   │   ├── fsl_component_mem_manager_freertos.c +│   │   ├── fsl_component_mem_manager_light.c +│   │   ├── fsl_component_mem_manager.c +│   │   └── fsl_component_mem_manager.h +│   ├── messaging +│   │   ├── component_messaging.MIMXRT1052.cmake +│   │   ├── fsl_component_messaging.c +│   │   └── fsl_component_messaging.h +│   ├── mx25r_flash +│   │   ├── driver_mx25r_flash.MIMXRT1052.cmake +│   │   ├── mx25r_flash.c +│   │   └── mx25r_flash.h +│   ├── osa +│   │   ├── component_osa_bm.cmake +│   │   ├── component_osa_free_rtos.cmake +│   │   ├── component_osa_template_config.cmake +│   │   ├── component_osa.cmake +│   │   ├── config +│   │   │   └── fsl_os_abstraction_config.h +│   │   ├── fsl_os_abstraction_bm.c +│   │   ├── fsl_os_abstraction_bm.h +│   │   ├── fsl_os_abstraction_free_rtos.c +│   │   ├── fsl_os_abstraction_free_rtos.h +│   │   └── fsl_os_abstraction.h +│   ├── panic +│   │   ├── component_panic.MIMXRT1052.cmake +│   │   ├── fsl_component_panic.c +│   │   └── fsl_component_panic.h +│   ├── phy +│   │   ├── component_eth_phy_common.MIMXRT1052.cmake +│   │   ├── device +│   │   │   ├── phyaqr113c +│   │   │   ├── phyar8031 +│   │   │   ├── phydp8384x +│   │   │   ├── phygpy215 +│   │   │   ├── phyksz8041 +│   │   │   ├── phyksz8081 +│   │   │   ├── phylan8720a +│   │   │   ├── phylan8741 +│   │   │   ├── phyrtl8201 +│   │   │   ├── phyrtl8211f +│   │   │   ├── phytja1100 +│   │   │   ├── phytja1120 +│   │   │   ├── phyvsc8541 +│   │   │   └── phyyt8521 +│   │   └── fsl_phy.h +│   ├── pmic +│   │   ├── pf1550 +│   │   │   ├── driver_pf1550.MIMXRT1052.cmake +│   │   │   ├── fsl_pf1550_charger.c +│   │   │   ├── fsl_pf1550_charger.h +│   │   │   ├── fsl_pf1550.c +│   │   │   └── fsl_pf1550.h +│   │   ├── pf3000 +│   │   │   ├── driver_pf3000.MIMXRT1052.cmake +│   │   │   ├── fsl_pf3000.c +│   │   │   └── fsl_pf3000.h +│   │   └── pf5020 +│   │   ├── driver_pf5020.MIMXRT1052.cmake +│   │   ├── fsl_pf5020.c +│   │   └── fsl_pf5020.h +│   ├── reset +│   │   ├── component_reset_adapter.MIMXRT1052.cmake +│   │   ├── fsl_adapter_reset.c +│   │   └── fsl_adapter_reset.h +│   ├── rng +│   │   ├── component_rng_adapter_interface.MIMXRT1052.cmake +│   │   ├── component_rnga_adapter.MIMXRT1052.cmake +│   │   ├── component_software_rng_adapter.MIMXRT1052.cmake +│   │   ├── component_trng_adapter.MIMXRT1052.cmake +│   │   ├── fsl_adapter_rng.h +│   │   ├── fsl_adapter_rnga.c +│   │   ├── fsl_adapter_software_rng.c +│   │   └── fsl_adapter_trng.c +│   ├── rtt +│   │   ├── driver_rtt_template.MIMXRT1052.cmake +│   │   ├── driver_rtt.MIMXRT1052.cmake +│   │   ├── License.txt +│   │   ├── README.txt +│   │   ├── RTT +│   │   │   ├── SEGGER_RTT_ASM_ARMv7M.S +│   │   │   ├── SEGGER_RTT_printf.c +│   │   │   ├── SEGGER_RTT.c +│   │   │   └── SEGGER_RTT.h +│   │   ├── Syscalls +│   │   │   ├── SEGGER_RTT_Syscalls_GCC.c +│   │   │   ├── SEGGER_RTT_Syscalls_IAR.c +│   │   │   ├── SEGGER_RTT_Syscalls_KEIL.c +│   │   │   └── SEGGER_RTT_Syscalls_SES.c +│   │   └── template +│   │   └── SEGGER_RTT_Conf.h +│   ├── sensor +│   │   ├── fxas21002cq +│   │   │   ├── driver_fxas21002cq.MIMXRT1052.cmake +│   │   │   ├── fsl_fxas.c +│   │   │   └── fsl_fxas.h +│   │   ├── fxls8974cf +│   │   │   ├── driver_fxls8974cf.MIMXRT1052.cmake +│   │   │   ├── fsl_fxls.c +│   │   │   └── fsl_fxls.h +│   │   ├── fxos8700cq +│   │   │   ├── driver_fxos8700cq.MIMXRT1052.cmake +│   │   │   ├── fsl_fxos.c +│   │   │   └── fsl_fxos.h +│   │   ├── htu21d +│   │   │   ├── driver_htu21d.MIMXRT1052.cmake +│   │   │   ├── fsl_htu21d.c +│   │   │   └── fsl_htu21d.h +│   │   ├── icm42688p +│   │   │   ├── driver_icm42688p.MIMXRT1052.cmake +│   │   │   ├── fsl_icm42688p.c +│   │   │   └── fsl_icm42688p.h +│   │   ├── lsm6dso +│   │   │   ├── driver_lsm6dso.MIMXRT1052.cmake +│   │   │   ├── fsl_lsm.c +│   │   │   └── fsl_lsm.h +│   │   ├── max30101 +│   │   │   ├── driver_max30101.MIMXRT1052.cmake +│   │   │   ├── fsl_max.c +│   │   │   └── fsl_max.h +│   │   ├── mma8451q +│   │   │   ├── driver_mma8451q.MIMXRT1052.cmake +│   │   │   ├── fsl_mma.c +│   │   │   └── fsl_mma.h +│   │   ├── mma8652fc +│   │   │   ├── driver_mma8652fc.MIMXRT1052.cmake +│   │   │   ├── fsl_mma.c +│   │   │   └── fsl_mma.h +│   │   ├── nmh1000 +│   │   │   ├── driver_nmh1000.MIMXRT1052.cmake +│   │   │   ├── fsl_nmh1000.c +│   │   │   └── fsl_nmh1000.h +│   │   ├── p3t1755 +│   │   │   ├── driver_p3t1755.MIMXRT1052.cmake +│   │   │   ├── fsl_p3t1755.c +│   │   │   └── fsl_p3t1755.h +│   │   └── tsl2561 +│   │   ├── driver_tsl2561.MIMXRT1052.cmake +│   │   ├── fsl_tsl2561.c +│   │   └── fsl_tsl2561.h +│   ├── serial_manager +│   │   ├── component_serial_manager_spi.MIMXRT1052.cmake +│   │   ├── component_serial_manager_swo.MIMXRT1052.cmake +│   │   ├── component_serial_manager_uart.MIMXRT1052.cmake +│   │   ├── component_serial_manager_usb_cdc.MIMXRT1052.cmake +│   │   ├── component_serial_manager_virtual.MIMXRT1052.cmake +│   │   ├── component_serial_manager.MIMXRT1052.cmake +│   │   ├── fsl_component_serial_manager.c +│   │   ├── fsl_component_serial_manager.h +│   │   ├── fsl_component_serial_port_internal.h +│   │   ├── fsl_component_serial_port_spi.c +│   │   ├── fsl_component_serial_port_spi.h +│   │   ├── fsl_component_serial_port_swo.c +│   │   ├── fsl_component_serial_port_swo.h +│   │   ├── fsl_component_serial_port_uart.c +│   │   ├── fsl_component_serial_port_uart.h +│   │   ├── fsl_component_serial_port_usb.c +│   │   ├── fsl_component_serial_port_usb.h +│   │   ├── fsl_component_serial_port_virtual.c +│   │   ├── fsl_component_serial_port_virtual.h +│   │   └── usb_cdc_adapter +│   │   ├── usb_device_config.h +│   │   ├── usb_device_descriptor.c +│   │   └── usb_device_descriptor.h +│   ├── silicon_id +│   │   ├── component_silicon_id.MIMXRT1052.cmake +│   │   ├── fsl_silicon_id.c +│   │   ├── fsl_silicon_id.h +│   │   └── socs +│   │   ├── fsl_silicon_id_soc.h +│   │   ├── imx8 +│   │   ├── imx93 +│   │   ├── imxrt1170 +│   │   ├── imxrt1180 +│   │   ├── mcxn +│   │   ├── rt10xx +│   │   ├── rw610 +│   │   └── scfw +│   ├── spi +│   │   ├── component_lpspi_adapter.MIMXRT1052.cmake +│   │   ├── fsl_adapter_lpspi.c +│   │   └── fsl_adapter_spi.h +│   ├── timer +│   │   ├── component_gpt_adapter.MIMXRT1052.cmake +│   │   ├── component_pit_adapter.MIMXRT1052.cmake +│   │   ├── fsl_adapter_gpt.c +│   │   ├── fsl_adapter_pit.c +│   │   └── fsl_adapter_timer.h +│   ├── timer_manager +│   │   ├── component_timer_manager.MIMXRT1052.cmake +│   │   ├── fsl_component_timer_manager.c +│   │   └── fsl_component_timer_manager.h +│   ├── touch +│   │   ├── ektf2k +│   │   │   ├── driver_ektf2k.MIMXRT1052.cmake +│   │   │   ├── fsl_ektf2k.c +│   │   │   └── fsl_ektf2k.h +│   │   ├── ft3267 +│   │   │   ├── driver_ft3267.MIMXRT1052.cmake +│   │   │   ├── fsl_ft3267.c +│   │   │   └── fsl_ft3267.h +│   │   ├── ft5406 +│   │   │   ├── driver_ft5406.MIMXRT1052.cmake +│   │   │   ├── fsl_ft5406.c +│   │   │   └── fsl_ft5406.h +│   │   ├── ft5406_rt +│   │   │   ├── driver_ft5406_rt.MIMXRT1052.cmake +│   │   │   ├── fsl_ft5406_rt.c +│   │   │   └── fsl_ft5406_rt.h +│   │   ├── ft6x06 +│   │   │   ├── driver_ft6x06.MIMXRT1052.cmake +│   │   │   ├── fsl_ft6x06.c +│   │   │   └── fsl_ft6x06.h +│   │   ├── gt911 +│   │   │   ├── driver_gt911.MIMXRT1052.cmake +│   │   │   ├── fsl_gt911.c +│   │   │   └── fsl_gt911.h +│   │   └── tma525b +│   │   ├── driver_tma525b.MIMXRT1052.cmake +│   │   ├── fsl_tma525b.c +│   │   └── fsl_tma525b.h +│   ├── uart +│   │   ├── component_lpuart_adapter.MIMXRT1052.cmake +│   │   ├── component_lpuart_dma_adapter.MIMXRT1052.cmake +│   │   ├── fsl_adapter_lpuart.c +│   │   └── fsl_adapter_uart.h +│   ├── video +│   │   ├── camera +│   │   │   ├── device +│   │   │   ├── driver_camera-common.MIMXRT1052.cmake +│   │   │   ├── fsl_camera.h +│   │   │   └── receiver +│   │   ├── display +│   │   │   ├── adv7535 +│   │   │   ├── dbi +│   │   │   ├── dc +│   │   │   ├── driver_display-common.MIMXRT1052.cmake +│   │   │   ├── fbdev +│   │   │   ├── fsl_display.h +│   │   │   ├── it6161 +│   │   │   ├── it6263 +│   │   │   └── sn65dsi83 +│   │   ├── driver_video-common.MIMXRT1052.cmake +│   │   ├── fsl_video_common.c +│   │   ├── fsl_video_common.h +│   │   └── i2c +│   │   ├── driver_video-i2c.MIMXRT1052.cmake +│   │   ├── fsl_video_i2c.c +│   │   └── fsl_video_i2c.h +│   └── wifi_bt_module +│   ├── AzureWave +│   │   └── tx_pwr_limits +│   ├── component_wifi_bt_module_88W8987.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_aw_am457_usd.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_aw_am457ma.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_aw_am510_arduino.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_aw_am510_usd.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_aw_am510ma.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_aw_cm358_usd.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_aw_cm358ma.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_frdm_rw61x.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_murata_1xk_m2.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_murata_1xk_usd.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_murata_1zm_m2.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_murata_1zm_usd.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_murata_2dl_m2.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_murata_2dl_usd.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_murata_2el_m2.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_murata_2el_usd.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_murata_2ll_m2.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_rd_rw61x.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_ubx_jody_w2_usd.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_ubx_jody_w5_m2.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_ubx_jody_w5_usd.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_board_ubx_maya_w1_usd.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_bt_only_fw.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_config.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_IW416.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_IW61X.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_RW61X.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_tx_pwr_limits.MIMXRT1052.cmake +│   ├── component_wifi_bt_module_wifi_bt_combo_fw.MIMXRT1052.cmake +│   ├── incl +│   │   └── wifi_bt_module_config.h +│   ├── Murata +│   │   └── tx_pwr_limits +│   └── u-blox +│   └── tx_pwr_limits +├── COPYING-BSD-3 +├── devices +│   └── MIMXRT1052 +│   ├── all_lib_device.cmake +│   ├── cmsis_drivers +│   │   ├── driver_cmsis_enet.MIMXRT1052.cmake +│   │   ├── driver_cmsis_lpi2c.MIMXRT1052.cmake +│   │   ├── driver_cmsis_lpspi.MIMXRT1052.cmake +│   │   ├── driver_cmsis_lpuart.MIMXRT1052.cmake +│   │   ├── fsl_enet_cmsis.c +│   │   ├── fsl_enet_cmsis.h +│   │   ├── fsl_enet_phy_cmsis.c +│   │   ├── fsl_enet_phy_cmsis.h +│   │   ├── fsl_lpi2c_cmsis.c +│   │   ├── fsl_lpi2c_cmsis.h +│   │   ├── fsl_lpspi_cmsis.c +│   │   ├── fsl_lpspi_cmsis.h +│   │   ├── fsl_lpuart_cmsis.c +│   │   └── fsl_lpuart_cmsis.h +│   ├── device_CMSIS.MIMXRT1052.cmake +│   ├── device_startup.MIMXRT1052.cmake +│   ├── device_system.MIMXRT1052.cmake +│   ├── drivers +│   │   ├── driver_adc_12b1msps_sar.MIMXRT1052.cmake +│   │   ├── driver_adc_etc.MIMXRT1052.cmake +│   │   ├── driver_aipstz.MIMXRT1052.cmake +│   │   ├── driver_aoi.MIMXRT1052.cmake +│   │   ├── driver_bee.MIMXRT1052.cmake +│   │   ├── driver_cache_armv7_m7.MIMXRT1052.cmake +│   │   ├── driver_clock.MIMXRT1052.cmake +│   │   ├── driver_cmp.MIMXRT1052.cmake +│   │   ├── driver_common.MIMXRT1052.cmake +│   │   ├── driver_csi.MIMXRT1052.cmake +│   │   ├── driver_dcdc_1.MIMXRT1052.cmake +│   │   ├── driver_dcp.MIMXRT1052.cmake +│   │   ├── driver_dmamux.MIMXRT1052.cmake +│   │   ├── driver_edma.MIMXRT1052.cmake +│   │   ├── driver_elcdif.MIMXRT1052.cmake +│   │   ├── driver_enc.MIMXRT1052.cmake +│   │   ├── driver_enet.MIMXRT1052.cmake +│   │   ├── driver_ewm.MIMXRT1052.cmake +│   │   ├── driver_flexcan_edma.MIMXRT1052.cmake +│   │   ├── driver_flexcan.MIMXRT1052.cmake +│   │   ├── driver_flexio_i2c_master.MIMXRT1052.cmake +│   │   ├── driver_flexio_i2s_edma.MIMXRT1052.cmake +│   │   ├── driver_flexio_i2s.MIMXRT1052.cmake +│   │   ├── driver_flexio_spi_edma.MIMXRT1052.cmake +│   │   ├── driver_flexio_spi.MIMXRT1052.cmake +│   │   ├── driver_flexio_uart_edma.MIMXRT1052.cmake +│   │   ├── driver_flexio_uart.MIMXRT1052.cmake +│   │   ├── driver_flexio.MIMXRT1052.cmake +│   │   ├── driver_flexram_allocate.MIMXRT1052.cmake +│   │   ├── driver_flexram.MIMXRT1052.cmake +│   │   ├── driver_flexspi_edma.MIMXRT1052.cmake +│   │   ├── driver_flexspi.MIMXRT1052.cmake +│   │   ├── driver_gpc_1.MIMXRT1052.cmake +│   │   ├── driver_gpt.MIMXRT1052.cmake +│   │   ├── driver_igpio.MIMXRT1052.cmake +│   │   ├── driver_iomuxc.MIMXRT1052.cmake +│   │   ├── driver_kpp.MIMXRT1052.cmake +│   │   ├── driver_lpi2c_edma.MIMXRT1052.cmake +│   │   ├── driver_lpi2c_freertos.MIMXRT1052.cmake +│   │   ├── driver_lpi2c.MIMXRT1052.cmake +│   │   ├── driver_lpspi_edma.MIMXRT1052.cmake +│   │   ├── driver_lpspi_freertos.MIMXRT1052.cmake +│   │   ├── driver_lpspi.MIMXRT1052.cmake +│   │   ├── driver_lpuart_edma.MIMXRT1052.cmake +│   │   ├── driver_lpuart_freertos.MIMXRT1052.cmake +│   │   ├── driver_lpuart.MIMXRT1052.cmake +│   │   ├── driver_nic301.MIMXRT1052.cmake +│   │   ├── driver_ocotp.MIMXRT1052.cmake +│   │   ├── driver_pit.MIMXRT1052.cmake +│   │   ├── driver_pmu.MIMXRT1052.cmake +│   │   ├── driver_pwm.MIMXRT1052.cmake +│   │   ├── driver_pxp.MIMXRT1052.cmake +│   │   ├── driver_qtmr_1.MIMXRT1052.cmake +│   │   ├── driver_romapi.MIMXRT1052.cmake +│   │   ├── driver_rtwdog.MIMXRT1052.cmake +│   │   ├── driver_sai_edma.MIMXRT1052.cmake +│   │   ├── driver_sai.MIMXRT1052.cmake +│   │   ├── driver_semc.MIMXRT1052.cmake +│   │   ├── driver_snvs_hp.MIMXRT1052.cmake +│   │   ├── driver_snvs_lp.MIMXRT1052.cmake +│   │   ├── driver_spdif_edma.MIMXRT1052.cmake +│   │   ├── driver_spdif.MIMXRT1052.cmake +│   │   ├── driver_src.MIMXRT1052.cmake +│   │   ├── driver_tempmon.MIMXRT1052.cmake +│   │   ├── driver_trng.MIMXRT1052.cmake +│   │   ├── driver_tsc.MIMXRT1052.cmake +│   │   ├── driver_usdhc.MIMXRT1052.cmake +│   │   ├── driver_wdog01.MIMXRT1052.cmake +│   │   ├── driver_xbara.MIMXRT1052.cmake +│   │   ├── driver_xbarb.MIMXRT1052.cmake +│   │   ├── fsl_adc_etc.c +│   │   ├── fsl_adc_etc.h +│   │   ├── fsl_adc.c +│   │   ├── fsl_adc.h +│   │   ├── fsl_aipstz.c +│   │   ├── fsl_aipstz.h +│   │   ├── fsl_aoi.c +│   │   ├── fsl_aoi.h +│   │   ├── fsl_bee.c +│   │   ├── fsl_bee.h +│   │   ├── fsl_cache.c +│   │   ├── fsl_cache.h +│   │   ├── fsl_clock.c +│   │   ├── fsl_clock.h +│   │   ├── fsl_cmp.c +│   │   ├── fsl_cmp.h +│   │   ├── fsl_common_arm.c +│   │   ├── fsl_common_arm.h +│   │   ├── fsl_common.c +│   │   ├── fsl_common.h +│   │   ├── fsl_csi.c +│   │   ├── fsl_csi.h +│   │   ├── fsl_dcdc.c +│   │   ├── fsl_dcdc.h +│   │   ├── fsl_dcp.c +│   │   ├── fsl_dcp.h +│   │   ├── fsl_dmamux.c +│   │   ├── fsl_dmamux.h +│   │   ├── fsl_edma.c +│   │   ├── fsl_edma.h +│   │   ├── fsl_elcdif.c +│   │   ├── fsl_elcdif.h +│   │   ├── fsl_enc.c +│   │   ├── fsl_enc.h +│   │   ├── fsl_enet.c +│   │   ├── fsl_enet.h +│   │   ├── fsl_ewm.c +│   │   ├── fsl_ewm.h +│   │   ├── fsl_flexcan_edma.c +│   │   ├── fsl_flexcan_edma.h +│   │   ├── fsl_flexcan.c +│   │   ├── fsl_flexcan.h +│   │   ├── fsl_flexio_i2c_master.c +│   │   ├── fsl_flexio_i2c_master.h +│   │   ├── fsl_flexio_i2s_edma.c +│   │   ├── fsl_flexio_i2s_edma.h +│   │   ├── fsl_flexio_i2s.c +│   │   ├── fsl_flexio_i2s.h +│   │   ├── fsl_flexio_spi_edma.c +│   │   ├── fsl_flexio_spi_edma.h +│   │   ├── fsl_flexio_spi.c +│   │   ├── fsl_flexio_spi.h +│   │   ├── fsl_flexio_uart_edma.c +│   │   ├── fsl_flexio_uart_edma.h +│   │   ├── fsl_flexio_uart.c +│   │   ├── fsl_flexio_uart.h +│   │   ├── fsl_flexio.c +│   │   ├── fsl_flexio.h +│   │   ├── fsl_flexram_allocate.c +│   │   ├── fsl_flexram_allocate.h +│   │   ├── fsl_flexram.c +│   │   ├── fsl_flexram.h +│   │   ├── fsl_flexspi_edma.c +│   │   ├── fsl_flexspi_edma.h +│   │   ├── fsl_flexspi.c +│   │   ├── fsl_flexspi.h +│   │   ├── fsl_gpc.c +│   │   ├── fsl_gpc.h +│   │   ├── fsl_gpio.c +│   │   ├── fsl_gpio.h +│   │   ├── fsl_gpt.c +│   │   ├── fsl_gpt.h +│   │   ├── fsl_iomuxc.h +│   │   ├── fsl_kpp.c +│   │   ├── fsl_kpp.h +│   │   ├── fsl_lpi2c_edma.c +│   │   ├── fsl_lpi2c_edma.h +│   │   ├── fsl_lpi2c_freertos.c +│   │   ├── fsl_lpi2c_freertos.h +│   │   ├── fsl_lpi2c.c +│   │   ├── fsl_lpi2c.h +│   │   ├── fsl_lpspi_edma.c +│   │   ├── fsl_lpspi_edma.h +│   │   ├── fsl_lpspi_freertos.c +│   │   ├── fsl_lpspi_freertos.h +│   │   ├── fsl_lpspi.c +│   │   ├── fsl_lpspi.h +│   │   ├── fsl_lpuart_edma.c +│   │   ├── fsl_lpuart_edma.h +│   │   ├── fsl_lpuart_freertos.c +│   │   ├── fsl_lpuart_freertos.h +│   │   ├── fsl_lpuart.c +│   │   ├── fsl_lpuart.h +│   │   ├── fsl_nic301.h +│   │   ├── fsl_ocotp.c +│   │   ├── fsl_ocotp.h +│   │   ├── fsl_pit.c +│   │   ├── fsl_pit.h +│   │   ├── fsl_pmu.c +│   │   ├── fsl_pmu.h +│   │   ├── fsl_pwm.c +│   │   ├── fsl_pwm.h +│   │   ├── fsl_pxp.c +│   │   ├── fsl_pxp.h +│   │   ├── fsl_qtmr.c +│   │   ├── fsl_qtmr.h +│   │   ├── fsl_romapi.c +│   │   ├── fsl_romapi.h +│   │   ├── fsl_rtwdog.c +│   │   ├── fsl_rtwdog.h +│   │   ├── fsl_sai_edma.c +│   │   ├── fsl_sai_edma.h +│   │   ├── fsl_sai.c +│   │   ├── fsl_sai.h +│   │   ├── fsl_semc.c +│   │   ├── fsl_semc.h +│   │   ├── fsl_snvs_hp.c +│   │   ├── fsl_snvs_hp.h +│   │   ├── fsl_snvs_lp.c +│   │   ├── fsl_snvs_lp.h +│   │   ├── fsl_spdif_edma.c +│   │   ├── fsl_spdif_edma.h +│   │   ├── fsl_spdif.c +│   │   ├── fsl_spdif.h +│   │   ├── fsl_src.c +│   │   ├── fsl_src.h +│   │   ├── fsl_tempmon.c +│   │   ├── fsl_tempmon.h +│   │   ├── fsl_trng.c +│   │   ├── fsl_trng.h +│   │   ├── fsl_tsc.c +│   │   ├── fsl_tsc.h +│   │   ├── fsl_usdhc.c +│   │   ├── fsl_usdhc.h +│   │   ├── fsl_wdog.c +│   │   ├── fsl_wdog.h +│   │   ├── fsl_xbara.c +│   │   ├── fsl_xbara.h +│   │   ├── fsl_xbarb.c +│   │   └── fsl_xbarb.h +│   ├── fsl_device_registers.h +│   ├── gcc +│   │   ├── MIMXRT1052xxxxx_flexspi_nor_sdram.ld +│   │   ├── MIMXRT1052xxxxx_flexspi_nor.ld +│   │   ├── MIMXRT1052xxxxx_ram.ld +│   │   ├── MIMXRT1052xxxxx_sdram_txt.ld +│   │   ├── MIMXRT1052xxxxx_sdram.ld +│   │   └── startup_MIMXRT1052.S +│   ├── MIMXRT1052_COMMON.h +│   ├── MIMXRT1052_features.h +│   ├── MIMXRT1052.h +│   ├── MIMXRT1052.xml +│   ├── periph +│   │   ├── PERI_ADC_ETC.h +│   │   ├── PERI_ADC.h +│   │   ├── PERI_AIPSTZ.h +│   │   ├── PERI_AOI.h +│   │   ├── PERI_BEE.h +│   │   ├── PERI_CAN.h +│   │   ├── PERI_CCM_ANALOG.h +│   │   ├── PERI_CCM.h +│   │   ├── PERI_CM7_MCM.h +│   │   ├── PERI_CMP.h +│   │   ├── PERI_CSI.h +│   │   ├── PERI_CSU.h +│   │   ├── PERI_DCDC.h +│   │   ├── PERI_DCP.h +│   │   ├── PERI_DMA.h +│   │   ├── PERI_DMAMUX.h +│   │   ├── PERI_ENC.h +│   │   ├── PERI_ENET.h +│   │   ├── PERI_EWM.h +│   │   ├── PERI_FLEXIO.h +│   │   ├── PERI_FLEXRAM.h +│   │   ├── PERI_FLEXSPI.h +│   │   ├── PERI_GPC.h +│   │   ├── PERI_GPIO.h +│   │   ├── PERI_GPT.h +│   │   ├── PERI_I2S.h +│   │   ├── PERI_IOMUXC_GPR.h +│   │   ├── PERI_IOMUXC_SNVS_GPR.h +│   │   ├── PERI_IOMUXC_SNVS.h +│   │   ├── PERI_IOMUXC.h +│   │   ├── PERI_KPP.h +│   │   ├── PERI_LCDIF.h +│   │   ├── PERI_LPI2C.h +│   │   ├── PERI_LPSPI.h +│   │   ├── PERI_LPUART.h +│   │   ├── PERI_OCOTP.h +│   │   ├── PERI_PGC.h +│   │   ├── PERI_PIT.h +│   │   ├── PERI_PMU.h +│   │   ├── PERI_PWM.h +│   │   ├── PERI_PXP.h +│   │   ├── PERI_ROMC.h +│   │   ├── PERI_RTWDOG.h +│   │   ├── PERI_SEMC.h +│   │   ├── PERI_SNVS.h +│   │   ├── PERI_SPDIF.h +│   │   ├── PERI_SRC.h +│   │   ├── PERI_TEMPMON.h +│   │   ├── PERI_TMR.h +│   │   ├── PERI_TRNG.h +│   │   ├── PERI_TSC.h +│   │   ├── PERI_USB_ANALOG.h +│   │   ├── PERI_USB.h +│   │   ├── PERI_USBNC.h +│   │   ├── PERI_USBPHY.h +│   │   ├── PERI_USDHC.h +│   │   ├── PERI_WDOG.h +│   │   ├── PERI_XBARA.h +│   │   ├── PERI_XBARB.h +│   │   └── PERI_XTALOSC24M.h +│   ├── project_template +│   │   ├── board.c +│   │   ├── board.h +│   │   ├── clock_config.c +│   │   ├── clock_config.h +│   │   ├── device_project_template.MIMXRT1052.cmake +│   │   ├── peripherals.c +│   │   ├── peripherals.h +│   │   ├── pin_mux.c +│   │   └── pin_mux.h +│   ├── system_MIMXRT1052.c +│   ├── system_MIMXRT1052.h +│   ├── template +│   │   ├── device_RTE.MIMXRT1052.cmake +│   │   └── RTE_Device.h +│   ├── utilities +│   │   ├── debug_console +│   │   ├── debug_console_lite +│   │   ├── fsl_memcpy.S +│   │   ├── fsl_notifier.c +│   │   ├── fsl_notifier.h +│   │   ├── fsl_sbrk.c +│   │   ├── fsl_syscall_stub.c +│   │   ├── incbin +│   │   ├── shell +│   │   ├── str +│   │   ├── utilities_misc_utilities.MIMXRT1052.cmake +│   │   ├── utility_debug_console_lite.MIMXRT1052.cmake +│   │   ├── utility_debug_console_template_config.MIMXRT1052.cmake +│   │   ├── utility_debug_console.MIMXRT1052.cmake +│   │   ├── utility_notifier.MIMXRT1052.cmake +│   │   └── utility_str.MIMXRT1052.cmake +│   └── xip +│   ├── device_boot_header.MIMXRT1052.cmake +│   ├── fsl_flexspi_nor_boot.c +│   └── fsl_flexspi_nor_boot.h +├── docs +│   └── readme.md +├── LA_OPT_NXP_Software_License.txt +├── middleware +│   ├── audio_voice +│   │   └── maestro +│   │   ├── middleware_audio_voice_maestro_cci_enable.cmake +│   │   ├── middleware_audio_voice_maestro_cei_enable.cmake +│   │   ├── middleware_audio_voice_maestro_element_audio_proc_enable.cmake +│   │   ├── middleware_audio_voice_maestro_element_audio_sink_enable.cmake +│   │   ├── middleware_audio_voice_maestro_element_audio_src_enable.cmake +│   │   ├── middleware_audio_voice_maestro_element_decoder_enable.cmake +│   │   ├── middleware_audio_voice_maestro_element_encoder_enable.cmake +│   │   ├── middleware_audio_voice_maestro_element_file_sink_enable.cmake +│   │   ├── middleware_audio_voice_maestro_element_file_src_enable.cmake +│   │   ├── middleware_audio_voice_maestro_element_mem_sink_enable.cmake +│   │   ├── middleware_audio_voice_maestro_element_mem_src_enable.cmake +│   │   ├── middleware_audio_voice_maestro_element_netbuf_src_enable.cmake +│   │   ├── middleware_audio_voice_maestro_element_process_sink_enable.cmake +│   │   ├── middleware_audio_voice_maestro_file_utils_enable.cmake +│   │   ├── middleware_audio_voice_maestro.cmake +│   │   └── src +│   ├── cjson +│   │   ├── CHANGELOG.md +│   │   ├── cJSON_Utils.c +│   │   ├── cJSON_Utils.h +│   │   ├── cJSON.c +│   │   ├── cJSON.h +│   │   ├── LICENSE +│   │   ├── middleware_cjson.cmake +│   │   └── README.md +│   ├── dhara +│   │   ├── ChangeLogKSDK.txt +│   │   ├── dhara +│   │   │   ├── bytes.h +│   │   │   ├── error.c +│   │   │   ├── error.h +│   │   │   ├── journal.c +│   │   │   ├── journal.h +│   │   │   ├── map.c +│   │   │   ├── map.h +│   │   │   └── nand.h +│   │   ├── ecc +│   │   │   ├── bch.c +│   │   │   ├── bch.h +│   │   │   ├── gf13.c +│   │   │   ├── gf13.h +│   │   │   ├── hamming.c +│   │   │   └── hamming.h +│   │   ├── LICENSE +│   │   ├── middleware_dhara_dhara_ecc_bch.cmake +│   │   ├── middleware_dhara_dhara_ecc_hamming.cmake +│   │   └── middleware_dhara.cmake +│   ├── fatfs +│   │   ├── CHANGELOG.md +│   │   ├── documents +│   │   │   ├── 00index_e.html +│   │   │   ├── css_e.css +│   │   │   ├── doc +│   │   │   ├── res +│   │   │   └── updates.html +│   │   ├── LICENSE.txt +│   │   ├── middleware_fatfs_mmc.cmake +│   │   ├── middleware_fatfs_nand.cmake +│   │   ├── middleware_fatfs_ram.cmake +│   │   ├── middleware_fatfs_sd.cmake +│   │   ├── middleware_fatfs_sdspi.cmake +│   │   ├── middleware_fatfs_template_mmc.cmake +│   │   ├── middleware_fatfs_template_nand.cmake +│   │   ├── middleware_fatfs_template_ram.cmake +│   │   ├── middleware_fatfs_template_sd.cmake +│   │   ├── middleware_fatfs_template_sdspi.cmake +│   │   ├── middleware_fatfs_template_usb.cmake +│   │   ├── middleware_fatfs_usb.cmake +│   │   ├── middleware_fatfs.cmake +│   │   ├── README.md +│   │   ├── SBOM.spdx.json +│   │   ├── source +│   │   │   ├── 00history.txt +│   │   │   ├── 00readme.txt +│   │   │   ├── diskio.c +│   │   │   ├── diskio.h +│   │   │   ├── ff.c +│   │   │   ├── ff.h +│   │   │   ├── ffconf_template.h +│   │   │   ├── ffsystem.c +│   │   │   ├── ffunicode.c +│   │   │   ├── fsl_mmc_disk +│   │   │   ├── fsl_nand_disk +│   │   │   ├── fsl_ram_disk +│   │   │   ├── fsl_sd_disk +│   │   │   ├── fsl_sdspi_disk +│   │   │   └── fsl_usb_disk +│   │   └── template +│   │   ├── ffconf.h +│   │   ├── mmc +│   │   ├── nand +│   │   ├── ram +│   │   ├── sd +│   │   ├── sdspi +│   │   └── usb +│   ├── freemaster +│   │   ├── ChangeLogKSDK.txt +│   │   ├── middleware_fmstr_platform_56f800e.cmake +│   │   ├── middleware_fmstr_platform_gen32le.cmake +│   │   ├── middleware_fmstr_platform_pa32.cmake +│   │   ├── middleware_fmstr_platform_s12z.cmake +│   │   ├── middleware_fmstr_platform_s32.cmake +│   │   ├── middleware_fmstr.cmake +│   │   └── src +│   │   ├── common +│   │   ├── drivers +│   │   ├── platforms +│   │   ├── support +│   │   └── template +│   ├── libjpeg +│   │   ├── change.log +│   │   ├── inc +│   │   │   ├── cderror.h +│   │   │   ├── cdjpeg.h +│   │   │   ├── jdct.h +│   │   │   ├── jerror.h +│   │   │   ├── jinclude.h +│   │   │   ├── jmemsys.h +│   │   │   ├── jmorecfg.h +│   │   │   ├── jpegint.h +│   │   │   ├── jpeglib.h +│   │   │   ├── jversion.h +│   │   │   └── transupp.h +│   │   ├── middleware_libjpeg_template.cmake +│   │   ├── middleware_libjpeg.cmake +│   │   ├── README +│   │   ├── src +│   │   │   ├── jaricom.c +│   │   │   ├── jcapimin.c +│   │   │   ├── jcapistd.c +│   │   │   ├── jcarith.c +│   │   │   ├── jccoefct.c +│   │   │   ├── jccolor.c +│   │   │   ├── jcdctmgr.c +│   │   │   ├── jchuff.c +│   │   │   ├── jcinit.c +│   │   │   ├── jcmainct.c +│   │   │   ├── jcmarker.c +│   │   │   ├── jcmaster.c +│   │   │   ├── jcomapi.c +│   │   │   ├── jcparam.c +│   │   │   ├── jcprepct.c +│   │   │   ├── jcsample.c +│   │   │   ├── jctrans.c +│   │   │   ├── jdapimin.c +│   │   │   ├── jdapistd.c +│   │   │   ├── jdarith.c +│   │   │   ├── jdatadst.c +│   │   │   ├── jdatasrc.c +│   │   │   ├── jdcoefct.c +│   │   │   ├── jdcolor.c +│   │   │   ├── jddctmgr.c +│   │   │   ├── jdhuff.c +│   │   │   ├── jdinput.c +│   │   │   ├── jdmainct.c +│   │   │   ├── jdmarker.c +│   │   │   ├── jdmaster.c +│   │   │   ├── jdmerge.c +│   │   │   ├── jdpostct.c +│   │   │   ├── jdsample.c +│   │   │   ├── jdtrans.c +│   │   │   ├── jerror.c +│   │   │   ├── jfdctflt.c +│   │   │   ├── jfdctfst.c +│   │   │   ├── jfdctint.c +│   │   │   ├── jidctflt.c +│   │   │   ├── jidctfst.c +│   │   │   ├── jidctint.c +│   │   │   ├── jmemmgr.c +│   │   │   ├── jmemnobs.c +│   │   │   ├── jquant1.c +│   │   │   ├── jquant2.c +│   │   │   └── jutils.c +│   │   └── template +│   │   └── jconfig.h +│   ├── littlefs +│   │   ├── DESIGN.md +│   │   ├── lfs_util.c +│   │   ├── lfs_util.h +│   │   ├── lfs.c +│   │   ├── lfs.h +│   │   ├── LICENSE.md +│   │   ├── mflash +│   │   │   ├── lfs_mflash.c +│   │   │   └── lfs_mflash.h +│   │   ├── middleware_littlefs_mflash.cmake +│   │   ├── middleware_littlefs.cmake +│   │   ├── README.md +│   │   ├── SBOM.spdx.json +│   │   └── SPEC.md +│   ├── mcuboot_opensource +│   │   ├── boot +│   │   │   ├── boot_serial +│   │   │   ├── bootutil +│   │   │   ├── cypress +│   │   │   ├── espressif +│   │   │   ├── mbed +│   │   │   ├── mynewt +│   │   │   ├── nuttx +│   │   │   ├── nxp_mcux_sdk +│   │   │   ├── zcbor +│   │   │   └── zephyr +│   │   ├── Cargo.lock +│   │   ├── Cargo.toml +│   │   ├── ChangeLogKSDK.txt +│   │   ├── ci +│   │   │   ├── check-signed-off-by.sh +│   │   │   ├── compare_versions.py +│   │   │   ├── espressif_install.sh +│   │   │   ├── espressif_run.sh +│   │   │   ├── fih_test_docker +│   │   │   ├── fih-tests_install.sh +│   │   │   ├── fih-tests_run.sh +│   │   │   ├── get_features.py +│   │   │   ├── imgtool_install.sh +│   │   │   ├── imgtool_run.sh +│   │   │   ├── mynewt_install.sh +│   │   │   ├── mynewt_keys +│   │   │   ├── mynewt_run.sh +│   │   │   ├── mynewt_targets +│   │   │   ├── requirements.txt +│   │   │   ├── sim_install.sh +│   │   │   └── sim_run.sh +│   │   ├── CODE_OF_CONDUCT.md +│   │   ├── docs +│   │   │   ├── _config.yml +│   │   │   ├── CNAME +│   │   │   ├── design.md +│   │   │   ├── ecdsa.md +│   │   │   ├── encrypted_images.md +│   │   │   ├── Gemfile +│   │   │   ├── Gemfile.lock +│   │   │   ├── imgtool.md +│   │   │   ├── index.md +│   │   │   ├── PORTING.md +│   │   │   ├── readme-espressif.md +│   │   │   ├── readme-mbed.md +│   │   │   ├── readme-mynewt.md +│   │   │   ├── readme-nuttx.md +│   │   │   ├── readme-nxp_mcux_sdk.md +│   │   │   ├── readme-riot.md +│   │   │   ├── readme-zephyr.md +│   │   │   ├── release-notes.d +│   │   │   ├── release-notes.md +│   │   │   ├── release.md +│   │   │   ├── SECURITY.md +│   │   │   ├── serial_recovery.md +│   │   │   ├── signed_images.md +│   │   │   ├── SubmittingPatches.md +│   │   │   ├── testplan-mynewt.md +│   │   │   └── testplan-zephyr.md +│   │   ├── enc-aes128kw.b64 +│   │   ├── enc-aes256kw.b64 +│   │   ├── enc-ec256-priv.pem +│   │   ├── enc-ec256-pub.pem +│   │   ├── enc-rsa2048-priv.pem +│   │   ├── enc-rsa2048-pub.pem +│   │   ├── enc-x25519-priv.pem +│   │   ├── enc-x25519-pub.pem +│   │   ├── ext +│   │   │   ├── fiat +│   │   │   ├── mbedtls-asn1 +│   │   │   ├── nrf +│   │   │   ├── tinycrypt +│   │   │   └── tinycrypt-sha512 +│   │   ├── go.mod +│   │   ├── LICENSE +│   │   ├── NOTICE +│   │   ├── project.yml +│   │   ├── ptest +│   │   │   ├── Cargo.lock +│   │   │   ├── Cargo.toml +│   │   │   └── src +│   │   ├── README.md +│   │   ├── repository.yml +│   │   ├── root-ec-p256-pkcs8.pem +│   │   ├── root-ec-p256.pem +│   │   ├── root-ec-p384-pkcs8.pem +│   │   ├── root-ec-p384.pem +│   │   ├── root-ed25519.pem +│   │   ├── root-rsa-2048.pem +│   │   ├── root-rsa-3072.pem +│   │   ├── samples +│   │   │   ├── mcuboot_config +│   │   │   └── zephyr +│   │   ├── scripts +│   │   │   ├── assemble.py +│   │   │   ├── flash.sh +│   │   │   ├── gdb-boot.sh +│   │   │   ├── imgtool +│   │   │   ├── imgtool.nix +│   │   │   ├── imgtool.py +│   │   │   ├── jgdb.sh +│   │   │   ├── jl.sh +│   │   │   ├── mcubin.bt +│   │   │   ├── requirements.txt +│   │   │   └── setup.py +│   │   ├── sim +│   │   │   ├── Cargo.toml +│   │   │   ├── mcuboot-sys +│   │   │   ├── README.rst +│   │   │   ├── simflash +│   │   │   ├── src +│   │   │   └── tests +│   │   ├── SW-Content-Register.txt +│   │   ├── testplan +│   │   │   └── mynewt +│   │   └── zephyr +│   │   └── module.yml +│   ├── pkcs11 +│   │   ├── LICENSE.md +│   │   ├── middleware_pkcs11.cmake +│   │   ├── pkcs11.h +│   │   ├── pkcs11f.h +│   │   ├── pkcs11t.h +│   │   └── README.md +│   ├── pngdec +│   │   ├── LICENSE +│   │   ├── middleware_pngdec.cmake +│   │   ├── perf_small.png +│   │   ├── README.md +│   │   └── src +│   │   ├── adler32.c +│   │   ├── crc32.c +│   │   ├── crc32.h +│   │   ├── infback.c +│   │   ├── inffast.c +│   │   ├── inffast.h +│   │   ├── inffixed.h +│   │   ├── inflate.c +│   │   ├── inflate.h +│   │   ├── inftrees.c +│   │   ├── inftrees.h +│   │   ├── PNGdec.c +│   │   ├── PNGdec.h +│   │   ├── zconf.h +│   │   ├── zlib.h +│   │   ├── zutil.c +│   │   └── zutil.h +│   ├── sdmmc +│   │   ├── common +│   │   │   ├── fsl_sdmmc_common.c +│   │   │   ├── fsl_sdmmc_common.h +│   │   │   └── fsl_sdmmc_spec.h +│   │   ├── host +│   │   │   └── usdhc +│   │   ├── middleware_sdmmc_common.cmake +│   │   ├── middleware_sdmmc_host_usdhc_blocking.cmake +│   │   ├── middleware_sdmmc_host_usdhc_non_blocking.cmake +│   │   ├── middleware_sdmmc_host_usdhc.cmake +│   │   ├── middleware_sdmmc_mmc.cmake +│   │   ├── middleware_sdmmc_osa.cmake +│   │   ├── middleware_sdmmc_sd.cmake +│   │   ├── middleware_sdmmc_sdhc_template.cmake +│   │   ├── middleware_sdmmc_sdif_template.cmake +│   │   ├── middleware_sdmmc_sdio.cmake +│   │   ├── middleware_sdmmc_sdspi.cmake +│   │   ├── middleware_sdmmc_usdhc_template.cmake +│   │   ├── mmc +│   │   │   ├── fsl_mmc.c +│   │   │   └── fsl_mmc.h +│   │   ├── osa +│   │   │   ├── fsl_sdmmc_osa.c +│   │   │   └── fsl_sdmmc_osa.h +│   │   ├── sd +│   │   │   ├── fsl_sd.c +│   │   │   └── fsl_sd.h +│   │   ├── sdio +│   │   │   ├── fsl_sdio.c +│   │   │   └── fsl_sdio.h +│   │   ├── sdspi +│   │   │   ├── fsl_sdspi.c +│   │   │   └── fsl_sdspi.h +│   │   └── template +│   │   ├── sdhc +│   │   ├── sdif +│   │   └── usdhc +│   ├── tfm +│   │   ├── psa-arch-tests +│   │   │   ├── api-tests +│   │   │   └── LICENSE.md +│   │   └── tf-m +│   │   ├── lib +│   │   └── middleware_psatest_ns_t_cose.cmake +│   ├── tinycbor +│   │   ├── Doxyfile +│   │   ├── examples +│   │   │   ├── examples.pro +│   │   │   ├── simplereader.c +│   │   │   └── simplereader.pro +│   │   ├── LICENSE +│   │   ├── Makefile +│   │   ├── Makefile.configure +│   │   ├── Makefile.nmake +│   │   ├── middleware_tinycbor.cmake +│   │   ├── README +│   │   ├── scripts +│   │   │   ├── maketag.pl +│   │   │   └── update-docs.sh +│   │   ├── src +│   │   │   ├── cbor.dox +│   │   │   ├── cbor.h +│   │   │   ├── cborencoder_close_container_checked.c +│   │   │   ├── cborencoder_float.c +│   │   │   ├── cborencoder.c +│   │   │   ├── cborerrorstrings.c +│   │   │   ├── cborinternal_p.h +│   │   │   ├── cborjson.h +│   │   │   ├── cborparser_dup_string.c +│   │   │   ├── cborparser_float.c +│   │   │   ├── cborparser.c +│   │   │   ├── cborpretty_stdio.c +│   │   │   ├── cborpretty.c +│   │   │   ├── cbortojson.c +│   │   │   ├── cborvalidation.c +│   │   │   ├── compilersupport_p.h +│   │   │   ├── open_memstream.c +│   │   │   ├── parsetags.pl +│   │   │   ├── src.pri +│   │   │   ├── tags.txt +│   │   │   ├── tinycbor-version.h +│   │   │   ├── tinycbor.pro +│   │   │   └── utf8_p.h +│   │   ├── tests +│   │   │   ├── c90 +│   │   │   ├── cpp +│   │   │   ├── encoder +│   │   │   ├── parser +│   │   │   ├── tests.pro +│   │   │   └── tojson +│   │   ├── tinycbor.pc.in +│   │   ├── TODO +│   │   ├── tools +│   │   │   ├── cbordump +│   │   │   ├── json2cbor +│   │   │   └── Makefile +│   │   └── VERSION +│   └── usb +│   ├── ChangeLogKSDK.txt +│   ├── config +│   │   ├── dcd +│   │   ├── device +│   │   ├── host +│   │   └── pd +│   ├── dcd +│   │   ├── usb_charger_detect.h +│   │   ├── usb_phydcd.c +│   │   └── usb_phydcd.h +│   ├── device +│   │   ├── class +│   │   ├── usb_device_ch9.c +│   │   ├── usb_device_ch9.h +│   │   ├── usb_device_dci.c +│   │   ├── usb_device_dci.h +│   │   ├── usb_device_ehci.c +│   │   ├── usb_device_ehci.h +│   │   └── usb_device.h +│   ├── host +│   │   ├── class +│   │   ├── usb_host_devices.c +│   │   ├── usb_host_devices.h +│   │   ├── usb_host_ehci.c +│   │   ├── usb_host_ehci.h +│   │   ├── usb_host_framework.c +│   │   ├── usb_host_framework.h +│   │   ├── usb_host_hci.c +│   │   ├── usb_host_hci.h +│   │   └── usb_host.h +│   ├── include +│   │   ├── usb_misc.h +│   │   ├── usb_spec.h +│   │   └── usb.h +│   ├── middleware_usb_common_header.cmake +│   ├── middleware_usb_device_audio.cmake +│   ├── middleware_usb_device_ccid.cmake +│   ├── middleware_usb_device_cdc_ecm.cmake +│   ├── middleware_usb_device_cdc_rndis.cmake +│   ├── middleware_usb_device_cdc.cmake +│   ├── middleware_usb_device_common_header.cmake +│   ├── middleware_usb_device_controller_driver.cmake +│   ├── middleware_usb_device_dfu.cmake +│   ├── middleware_usb_device_ehci_config_header.cmake +│   ├── middleware_usb_device_ehci.cmake +│   ├── middleware_usb_device_hid.cmake +│   ├── middleware_usb_device_msd.cmake +│   ├── middleware_usb_device_mtp.cmake +│   ├── middleware_usb_device_phdc.cmake +│   ├── middleware_usb_device_printer.cmake +│   ├── middleware_usb_device_stack.cmake +│   ├── middleware_usb_device_video.cmake +│   ├── middleware_usb_host_audio.cmake +│   ├── middleware_usb_host_cdc_ecm.cmake +│   ├── middleware_usb_host_cdc_rndis.cmake +│   ├── middleware_usb_host_cdc.cmake +│   ├── middleware_usb_host_common_header.cmake +│   ├── middleware_usb_host_ehci_config_header.cmake +│   ├── middleware_usb_host_ehci.cmake +│   ├── middleware_usb_host_hid.cmake +│   ├── middleware_usb_host_msd.cmake +│   ├── middleware_usb_host_phdc.cmake +│   ├── middleware_usb_host_printer.cmake +│   ├── middleware_usb_host_stack.cmake +│   ├── middleware_usb_host_video.cmake +│   ├── middleware_usb_pd_altmode.cmake +│   ├── middleware_usb_pd_compliance_test_report.cmake +│   ├── middleware_usb_pd_config_header.cmake +│   ├── middleware_usb_pd_phy_ptn5110.cmake +│   ├── middleware_usb_pd.cmake +│   ├── middleware_usb_phy.cmake +│   ├── middleware_usb_phydcd_config_header.cmake +│   ├── middleware_usb_phydcd.cmake +│   ├── pd +│   │   ├── alt_mode +│   │   ├── compliance_test_report +│   │   ├── phy_interface +│   │   ├── ptn5110 +│   │   ├── usb_pd_auto_policy.h +│   │   ├── usb_pd_connect.c +│   │   ├── usb_pd_interface.c +│   │   ├── usb_pd_interface.h +│   │   ├── usb_pd_msg.c +│   │   ├── usb_pd_phy.h +│   │   ├── usb_pd_policy.c +│   │   ├── usb_pd_spec.h +│   │   ├── usb_pd_timer.c +│   │   ├── usb_pd_timer.h +│   │   └── usb_pd.h +│   └── phy +│   ├── usb_phy.c +│   └── usb_phy.h +├── MIMXRT1052xxxxB_manifest_v3_15.xml +├── README.md +├── rtos +│   └── freertos +│   └── freertos-kernel +│   ├── CHANGELOG_mcuxsdk.md +│   ├── CMakeLists.txt +│   ├── croutine.c +│   ├── cspell.config.yaml +│   ├── event_groups.c +│   ├── examples +│   ├── GitHub-FreeRTOS-Kernel-Home.url +│   ├── History.txt +│   ├── include +│   ├── LICENSE.md +│   ├── list.c +│   ├── manifest.yml +│   ├── mcuxsdk-doc +│   ├── middleware_freertos-kernel_config.cmake +│   ├── middleware_freertos-kernel_extension.cmake +│   ├── middleware_freertos-kernel_heap_1.cmake +│   ├── middleware_freertos-kernel_heap_2.cmake +│   ├── middleware_freertos-kernel_heap_3.cmake +│   ├── middleware_freertos-kernel_heap_4.cmake +│   ├── middleware_freertos-kernel_heap_5.cmake +│   ├── middleware_freertos-kernel_mpu_wrappers_v2.cmake +│   ├── middleware_freertos-kernel_mpu_wrappers.cmake +│   ├── middleware_freertos-kernel_use_newlib_reentrant.cmake +│   ├── middleware_freertos-kernel_use_picolibc_tls.cmake +│   ├── middleware_freertos-kernel.cmake +│   ├── MISRA.md +│   ├── portable +│   ├── queue.c +│   ├── Quick_Start_Guide.url +│   ├── README_mcuxsdk.md +│   ├── README.md +│   ├── sbom.spdx +│   ├── SCR.txt +│   ├── stream_buffer.c +│   ├── tasks.c +│   ├── template +│   └── timers.c +├── sdk_tree.txt +├── SW-Content-Register.txt +└── tools + └── cmake_toolchain_files + ├── armgcc_force_cpp.cmake + ├── armgcc.cmake + ├── mcux_config.cmake + ├── riscvllvm.cmake + ├── xcc.cmake + └── xclang.cmake + +523 directories, 1213 files