61 KiB
Журнал изменений: tft_manufacture_test
Репозиторий: https://github.com/OSabuser/tft_manufacture_test.git
Отслеживаемая ветка: dev
Базовый диапазон: 2026-03-05 .. 2026-05-08, 52 коммита
Базовый HEAD: 22f98c311a4564d8f18ed72d11635bf908046b1e
Версия формата: strict-2026-05-13
Этот журнал фиксирует только смысловые инженерные изменения. Формат основан на подходе Keep a Changelog и адаптирован под embedded firmware-репозиторий, где документация, тесты, HIL, CI и изменения vendor-SDK являются важными сигналами состояния проекта.
Политика формата
Каждая будущая запись должна иметь такую структуру:
## [Не выпущено] или [ГГГГ-ММ-ДД] — короткое название
Диапазон: `old_sha..new_sha`
Сравнение: https://github.com/OSabuser/tft_manufacture_test/compare/old_sha...new_sha
### Кратко
- Один-два содержательных пункта о том, что изменилось и почему это важно.
### Добавлено
- Новые возможности, модули, тесты, документы или инструменты.
### Изменено
- Поведение, архитектура, сборка, интерфейсы или крупные переработки документации.
### Исправлено
- Исправления ошибок, сборки, тестов и регрессий.
### Тесты
- Host-тесты, HIL-тесты, firmware-test модули, фикстуры, test runners и изменения покрытия.
### CI
- GitHub Actions, локальные CI-скрипты, self-hosted/HIL runners и изменения статуса workflow.
### Документация
- README и изменения архитектурных/protocol/how-to документов, которые влияют на понимание проекта.
### Удалено
- Удаления, имеющие практический смысл.
### Отфильтрованный шум
- Форматирование, чистые перемещения, vendor-импорты или generated churn, которые намеренно не считаются продуктовым изменением.
Пустую категорию можно опускать, если в ней нет смысловой информации. Не добавлять raw commit spam, статистику строк, длинные списки файлов или переименования, если они не меняют сборку, тестирование, документацию или использование проекта.
[Не выпущено]
Что отслеживать
Проверять, остаётся ли— решено: job.github/workflows/ci.ymlтолько сборочным workflowtestуже запускает host-тесты (just ci::test→just build::test-host-release).- Отслеживать появление self-hosted runner, регулярных аппаратных прогонов или отчётов по HIL.
- Проверять новые firmware-test модули в
firmware/test/src/tests/и синхронные обновления протокола/документации. - Следить за развитием BSP: RGB (частично закрыто display-тестом);
tft_app— директория всё ещё не заведена (bootloader — реализован, Фазы 0–6, см. запись ниже). - Отслеживать локальные патчи поверх vendor SDK, которые нужно вести отдельным patch log (пример — точечный патч
fault_injection_hardening.cпод#if defined(__arm__), bootloader Фаза 3, см. запись ниже). Отслеживать мерж ветки— смёржено (feature-tui-monolithвdevb4c664f), запись закрыта датой ниже.- Отслеживать тег
bootloader-v*— после первого релиза закрыть запись «bootloader: полная реализация» датой и финальным SHA (сейчас часть диапазона — незакоммиченные изменения рабочего дерева).
[Не выпущено] — bootloader: полная реализация, Фазы 0–6 (MCUboot Direct-XIP, HAB, service-tui интеграция)
Диапазон: 4644f21507d3..6c564f16388a + незакоммиченные изменения рабочего дерева (HAB-подпись
тестовым ключом, Тир-0/Тир-1 верификация в service-tui, CI bootloader-v*, документация)
Сравнение: https://github.com/OSabuser/tft_manufacture_test/compare/4644f21...6c564f1
firmware/bootloader/была пустой директорией на момент базового среза (см. "Что отслеживать" выше — теперь снята с наблюдения, кроме тега релиза). Диапазон охватывает всю реализацию с нуля до готовности к первому релизу (VERSION 1.0.0), шесть фаз согласно (уже удалённому после завершения, см. "Удалено" ниже)firmware/bootloader/PLAN.md.
Кратко
- Загрузчик MIMXRT1052 реализован целиком: XIP из Flash, выбор и запуск
tft_appиз одного из двух слотов (MCUboot Direct-XIP), обновление с microSD, устойчивость к зависшим образам (watchdog + recovery), HAB-подпись Release-сборки, интеграция сservice-tuiдля контроля производственной прошивки. - По пути на реальном железе найдено и исправлено более десятка багов — от неверной трактовки регистров FlexSPI/SRC до архитектурных пробелов в чек-листах верификации; детали по фазам ниже.
firmware/bootloader/CMakeLists.txt→VERSION 1.0.0; все 6 фаз аппаратно верифицированы.
Добавлено
- Фаза 0 — карта Flash.
docs/mimxrt1052/BOOTLOADER_FLASH_MAP.md— смещенияBOOTLOADER/SLOT_A/SLOT_B, зафиксированы до написания кода. - Фаза 1 — скелет.
firmware/bootloader/{CMakeLists.txt,src/main.c,src/cli.c,src/protocol.{c,h}}— bring-up (LED/tick/USB CDC), урезанный протокол (ping/get_version), HAB unsigned Debug-конфиг. - Фаза 2 — bootutil (Direct-XIP).
mcuboot_port/— шимflash_area_*надbsp_qspi_flash,sysflash.h,mcuboot_config.h(TinyCrypt ECDSA-P256,MCUBOOT_DIRECT_XIP_REVERT),src/boot_select.{c,h}.test_stub/— заглушкаtft_app(два слота, разная линковка) для аппаратной проверки выбора слота. - Фаза 3 — SD-путь установки.
src/{update_policy,slot_version,sd_update}.{c,h}— сканирование microSD, установка в неактивный слот, top-level состояние «нет валидного образа»;bootloader_fatfs(read-only FatFS); аппаратный watchdog (bsp/wdog). - Фаза 4 — SDRAM/QSPI smoke-test.
bsp/sdram::bsp_sdram_configure()— C-порт DCD (SEMC/CCM);bsp_qspi_decode_chip()— идентификация чипа по JEDEC;src/led_status.{c,h}— единый словарь LED-паттернов;dev_sdram_test.c(dev-only,BOOTLOADER_DEV_DIAGNOSTICS). - Фаза 6 — recovery.
bsp/boot_state— счётчик попыток загрузки вSRC_GPR3(переживает watchdog-сброс, обнуляется на POR);src/recovery.{c,h}— чистая функцияrecovery_decide()(таксономия отказов A–D); recovery-режим поBSP_BUTTON_2с ослабленным version-gate. - Фаза 5 — HAB Release + service-tui. Тестовый HAB-ключ (
tools/host/hab/keys/, схема NOCAK) —hab_bootloader_release.yamlреально подписывает Release-образ (flags=0x08);tools/service_tui/app/bootloader_client.py— CDC-клиент bootloader (get_smoke_status/get_qspi_info);tools/service_tui/app/screens/verify.py— экран живой проверки загрузчика после серийной прошивки (Тир-1); Тир-0 (readback-верификация записи,flash_backend._verify_written()) — включена по умолчанию для любой прошивки черезservice-tui;firmware/bootloader/SIGNING_CEREMONY.md— план настоящей production-подписи (HAB SRK + MCUboot production-ключ) на будущее.
Изменено
- Фаза 3: детект SD консолидирован на единый
PRSSTAT; ранний сэмпл кнопки даунгрейда. - Фаза 4:
board_mpu_init()(общий для всех прошивок код) — добавлен Region 11 под NIC-301 GPV-регистры (0x41000000, 8 МБ). - Фаза 5:
Flasher.PRODUCTION(tools/service_tui/app/flasher.py) сужен до сценария A (только загрузчик) — бандл сtft_app(сценарий B) отложен до реализацииtft_app; production жёстко резолвит Release, независимо от переменнойFIRMWARE_BUILD_TYPE.just host::package-tui— новый явный гвард наbuild/Release/bootloader_hab.bin..github/workflows/release.yml— тегbootloader-v*(симметричноfirmware-v*), общий jobfirmwareтеперь собирает и подписывает Release-образ bootloader. - Корневой
README.md— статус bootloaderзапланирован→реализован, v1.0.0.
Исправлено
- Фаза 2 (3 бага, аппаратная верификация):
jump_to_image()маскировал IRQ перед прыжком (не по референсу NXP) — вешалbsp_delay()в любом целевом образе;bsp_qspi_read()не округлялIDATSZдо кратного 4 при IP-чтении — контроллер недодавал слово на хвостах не кратной длины (впервые проявилось на чтении хэша образа bootutil);qspi_read_tail()сравнивалIPRXFSTS.FILL(watermark-юниты по 8 байт) напрямую со счётчиком слов — зависал на хвостах ровно в 2 слова (чтение подписи ECDSA). - Фаза 3: форсированный даунгрейд физически записывался, но не загружался бы (
boot_go()всегда выбирает более высокую версию) — добавлено полеerase_previous_active;fih_panic_loop()(вендоренный bootutil) ронялtest-host-releaseв CI на x86_64-раннере (invalid instruction mnemonic 'b'— ARM/Thumb-only мнемоника, на arm64 devcontainer случайно ассемблировалась, маскируя проблему); стабыtest_stubне позиционно-независимы — линковка под конкретный слот обязательна и для реальногоtft_app, не только для заглушки. - Фаза 6 (4 бага): счётчик попыток загрузки рос и на пустой плате без SD (без реального
зависания) — ошибочно уводил бы в recovery через ~4.5 с в штатном ожидании; в стенде
test_stubhealth-mark вызывался безусловно до проверкиHANG_MODE, из-за чего счётчик никогда не накапливался выше 1 (фолбэк не срабатывал); в самом чек-листе Фазы 6 предписывался файл для чужого слота при проверке recovery-установки;attempt_boot()не инкрементировал счётчик перед первым прыжком в свежеустановленный recovery-образ (симметрия с обычным путём). - Фаза 4 (3 бага): AXI-QoS регистры (NIC-301 GPV) валили C-код фолтом — не покрыты
board_mpu_init(), DCD успевал их записать до включения MPU, C-порт — нет; результаты smoke-теста терялись (шлются один раз сразу послеinit(), хост не успевает открыть порт) — кэширование + переспрос по команде; оценка длительности SDRAM-теста в комментарии оригинала завышена ~в 6 раз (реальный прогон ~4.2 с, не ~30 с). - Фаза 5 (2 бага в
service-tui, до публикации): production шил bootloader и (будущий) app по одному адресуFLASH_BASE— второй шаг затёр бы первый (наследие до-bootloader архитектуры, для Direct-XIP неверно); production мог тихо взять unsigned Debug-образ bootloader черезFIRMWARE_BUILD_TYPE(переменная предназначена только для firmware_test, дефолтDebug) — теперь Release резолвится жёстко.
Тесты
- Host-тесты выросли с 13 (Фаза 2) до 16 (Фазы 3/6:
update_policy,slot_version,recovery) — зелёные, Debug и Release, обе платформы (macOS + devcontainer Linux). tools/service_tui: 68 → 76 тестов (Фаза 5) — Тир-0 readback (test_flash_backend.py) + новыйtest_bootloader_client.py.- Полный аппаратный чек-лист пройден на каждой фазе (Фазы 2–6); детали были в удалённых
HARDWARE_VERIFICATION_*.md/DEBUG_LOG_*.md(см. git-история, "Удалено" ниже).
CI
.github/workflows/release.yml: новый jobpublish-bootloader(тегbootloader-v*), общий jobfirmwareрасширен на сборку Release HAB bootloader;service-tui-{macos,windows}теперь докачиваютbootloader_hab.binвbuild/Release/перед упаковкой — без этогоjust host::package-tuiпадал бы с новым гвардом (см. "Изменено").- CI-баг
fih_panic_loop/x86_64 (Фаза 3, см. "Исправлено") — точечный патч вендоренногоfault_injection_hardening.cпод#if defined(__arm__).
Документация
docs/bootloader/HAB_GUIDE.md— новый §5.1 (разбор команд CSF-секцииnxpimage, NOCAK vs полная SRK-иерархия).firmware/bootloader/SIGNING_CEREMONY.md— новый план настоящей production-подписи (HAB SRK-церемония + MCUboot production-ключ), на будущее.docs/DEV_ARCH.md(корневой) — исправлена фактическая ошибка (bootloader описывался как «копирование в ITCM», реально XIP без ITCM/DCD) и устаревший путьtools/production/.tools/service_tui/docs/DEV_ARCH.md→ переименован вtools/service_tui/docs/ARCHITECTURE.md(коллизия имени с корневымdocs/DEV_ARCH.md); новый §16 (Тир-0/Тир-1); синхронизирован со всеми изменениями Фазы 5; починены 10 битых/несогласованных ссылок на файл в трёх других README.docs/CI_WORKFLOW.md— синхронизирован сbootloader-v*(диаграмма, триггеры, таблица job'ов).
Удалено
firmware/bootloader/PLAN.md,DEBUG_LOG_PHASE2.md,DEBUG_LOG_PHASE3_SD.md,test_stub/HARDWARE_VERIFICATION_{PHASE2,PHASE3,PHASE6,LED_PATTERNS}.md,docs/CI_PLAN.md— планирующие/трекинговые документы и чек-листы, отработавшие своё после завершения всех фаз; фактическое содержание либо перенесено в постоянные документы (README.md,docs/bootloader/HAB_GUIDE.md,docs/CI_WORKFLOW.md), либо остаётся доступным в git-истории. Тот же паттерн, что уже применялся кFIRST_RELEASE_PLAN.md/RELEASE_ROADMAP.md/just/ci_workflow.mdпри предыдущем релизе (см. запись ниже).
[2026-07-07 .. 2026-07-13] — Первый релиз: tui-v0.2.0/firmware-v0.1.2, точечный tui-v0.2.1
Диапазон: 8869b3c8..d9fb813b
Сравнение: https://github.com/OSabuser/tft_manufacture_test/compare/8869b3c...d9fb813
Кратко
- Первый тег-релиз проекта:
firmware-v0.1.2(firmware_test HAB Debug) иtui-v0.2.0(service-tui PyInstaller-бандл, macOS + Windows) — итог веткиfeature-tui-monolith(см. запись ниже, закрыта этим же релизом). - Директория service-tui переименована
tools/production/→tools/service_tui/. - Точечный релиз
tui-v0.2.1(отдельная веткаservice-tui-fixes) — найден и исправлен полевой баг записи во Flash, воспроизводившийся на случайном подмножестве плат.
Изменено
tools/production/→tools/service_tui/(директория и все внутренние пути/ссылки).- Из репозитория убран ранее случайно закоммиченный
dist/(собранные PyInstaller-бандлы) — добавлен.gitignore.
Исправлено
- QE-бит (Winbond) не выставлялся при auto-config Flashloader — ~50/500 плат в поле падали на
ЛЮБОЙ flash-операции. Option word
0xC0000007(со старта проекта, унаследованflash_backend.py/flash_usb.py) не включает Quad Enable; часть партий W25Q128 приходит с завода с QE=0, из-за чего чип остаётся в SPI-режиме при LUT, настроенных на quad-команды →status 20106 FlexSPINOR: Command Failureна любой команде. Две промежуточные гипотезы (порядок commit-FCB/erase; маргинальный электрический контакт) проверены на живом железе и опровергнуты. Причина найдена пересчётом (не «на глаз») десятичного option word из логов NXP MCUBootUtility:0xC0000207. QE энергонезависимый — после одной корректной установки (в т.ч. случайно, через сторонний инструмент) плата «чинится» навсегда, что и маскировало баг как нестабильный. - M5StampPLC: два раунда фиксов детекта порта и CAN-обмена в
service-tui.
Удалено
- Планирующие документы, отработавшие своё к моменту релиза —
FIRST_RELEASE_PLAN.md,RELEASE_ROADMAP.md,just/ci_workflow.md,tools/production/docs/MONOLITH_APP_PLAN.md. Содержание перенесено в постоянныеREADME.md/docs/DEV_ARCH.md(тогда ещё под именемtools/production/).
[2026-07-07] — service-tui: монолитный spsdk-бэкенд, устойчивость к обрыву USB, упаковка PyInstaller
Диапазон: 1801f1beb959d610d31ee3dcd1f91046953117d4..22c40779ef0ec9911031d7a5272c4611b596d3e8 (мёрж в dev — b4c664fe121226c4231675a150fba809e73b21d6)
Сравнение: https://github.com/OSabuser/tft_manufacture_test/compare/1801f1beb959d610d31ee3dcd1f91046953117d4...22c40779ef0ec9911031d7a5272c4611b596d3e8
Ветка
feature-tui-monolith(отdev, поверх мержаfeature-tui-python). Смёржено вdevи выпущено как часть первого релиза (tui-v0.2.0/firmware-v0.1.2) — см. запись выше. Полностью заменяет предыдущую версию этой записи: прошивка сторонних бинарников через subprocess (tools/host/flash_usb.py --fcb-path+nxpimage) была реализацией на момент Фазы 0/раннего мержа и с тех пор заменена прямыми вызовамиspsdkPython API — ничего из старой записи больше не описывает текущий код.
Кратко
- Прошивка в
service-tuiпереведена с subprocess-обёртки надnxpimage/sdphost/blhostна прямые вызовыspsdkPython API (McuBoot/SDP/HabImage) —app/flash_backend.py, провалидировано byte-exact на живом железе (macOS + Windows).tools/host/flash_usb.pyостаётся отдельным dev-CLI дляjust host::flash*, TUI его больше не вызывает ни субпроцессом, ни как библиотеку. - Обрыв USB во время прошивки/chip erase теперь надёжно типизируется во
всех трёх наблюдавшихся на железе сценариях (
SPSDKConnectionError,SPSDKTimeoutError,False-по-таймауту без исключения) и даёт оператору единое понятное сообщение вместо «Непредвиденная ошибка». - Собран первый standalone-бандл (PyInstaller, onedir) — alpha, вручную протестирован на macOS и Windows.
- Документация (
tools/production/README.md+docs/DEV_ARCH.md, корневыеdocs/*, всеbsp/*/README.md, корневойREADME.md) синхронизирована с фактическим состоянием кода после всех фаз миграции.
Добавлено
tools/production/app/flash_backend.py— синхронное ядро прошивки на spsdk:detect_sdp/detect_cdc,load_flashloader,flash,erase_chip,build_custom_hab(HabImageвместоnxpimageCLI),write_fcb_explicit/write_fcb_auto. Zero Textual/asyncio импортов, тестируется без event loop.tools/production/app/usb_ports.py—resolve_serial_port()по VID:PID (имя порта не переносимо между перевтыкиваниями).- Иерархия
FlashBackendError/ConnectionLostError/DeviceNotFoundError/FlashLoaderTimeoutError/HabBuildErrorс полемconnection_lost— различает физический обрыв USB от логической ошибки прошивки без парсинга текста сообщения. tools/production/tests/test_flash_backend.py— вырос до 45 unit-тестов backend'а, включая обе ветки обрыва USB (SPSDKTimeoutError,False-по-таймауту + вариант B черезdetect_sdp()) и golden-тест byte-exact сборки HAB.- Кнопка «✕ Выйти из приложения» на
WaitingScreen. tools/production/service_tui.spec— PyInstaller spec (onedir).tools/production/docs/RELEASE_ROADMAP.md— дорожная карта Фаз 4a→4b→5→6 с принятыми решениями (Р10–Р12) и статусом гейтов.
Изменено
tools/production/app/flasher.py— переведён с subprocess (flash_usb.pyчерезuv run) наasyncio.to_thread-обёртку надflash_backend.py; сборка кастомного HAB — черезHabImageв отдельном потоке, а не subprocessnxpimage.tools/production/app/main.py— логирование: root по умолчаниюINFO(былоDEBUG),spsdk/libusbsioпринудительно приглушены доWARNINGнезависимо от root; полный DEBUG — черезSERVICE_LOG_LEVEL=DEBUG.tools/production/app/screens/flash.py— троттлинг записи в#flash-logдля фазыwrite(раз на 10%, ~10 строк вместо ~135) без потери плавности прогресс-бара.bsp/sd/src/sd.c—bsp_sd_init()/bsp_sd_deinit()теперь делают аппаратныйUSDHC_Reset()+ полныйmemset(&g_sd, ...)перед повторной инициализацией: без этого non-blocking host driver SDK мог оставаться в состоянии ожидания транзакции от предыдущей diagnostic-сессии, и следующийf_mount()в тестеusdблокировался навсегда.
Исправлено
- Обёртка обрыва USB расширена с
SPSDKConnectionErrorна(SPSDKConnectionError, SPSDKTimeoutError)— второй тип не наследует первый, но реально прилетает на read-фазе после write. - Вариант B для команд, возвращающих
Falseбез исключения (flash_erase_all/flash_erase_region/write_memory): приFalseвыполняется быстрыйdetect_sdp()— устройство пропало с шины →ConnectionLostError, устройство на месте → обычнаяFlashBackendError. - Баг «File not found» для bootloader/app/firmware_test при резолве путей прошивки (Фаза 4a).
- Unit-тест моки (
test_cli.c,test_bsp_can.c,test_firmware_runner.c, stub-хедерыfsl_clock.h/version.h) — фиксы после рефакторингаcli.c/test_runner.c.
Тесты
test_flash_backend.py— вырос до 45 тестов, включая гейт поSPSDKTimeoutErrorи переклассификации erase-таймаута (вариант B).
Документация
tools/production/README.md/tools/production/docs/DEV_ARCH.md— полностью пересмотрены под факт: убраны все следы subprocess/nxpimage/flash_usb.pyиз описания архитектуры прошивки; добавлены §6.2 (обработка обрыва USB), §14 (PyInstaller/frozen-резолв путей), §15 (логирование); зафиксирован разрыв между закоммиченнымservice_tui.spec(datasтолько../shared) и фактическим содержимым уже собранных релизных бандлов вdist/.docs/testing/PROTOCOL.md— версия0.1.0→0.1.2, добавлена командаget_versionи событияtest_list/uid_response/version_response, матрица тестов исправлена (убраны никогда не существовавшиеuart_ttl/uart_iso, добавлен реальныйmqs), поток Display дополнен шагами ротации (display_rot0/display_rot_base).docs/testing/host/HOST_CREATE_TEST.md— был байт-в-байт дубликатомdocs/HOW_TO_DEBUG.md(копипаст-баг, минимум с 2026-06-23); переписан как реальный гайд по добавлению host-теста.docs/HOW_TO_FLASH.md(§1.5 под факт spsdk-конвейера),docs/DEV_ARCH.md(в деревеtools/hil/недоставало04_test_button.py),docs/testing/hil/HIL_CREATE_TEST.md(примерloaded_<n>безm5вводил в заблуждение — питание таргета всегда идёт через M5, не только сигнальные реле) — актуализированы.bsp/usb_cdc/README.md(VID/PID был заявлен как заглушка0x1234:0x0001, реально прошит0x1996:0x00AD),bsp/uart_host/README.md(в списке API отсутствовали реальныеbsp_uart_host_deinit/rx_available/rx_flush),bsp/can/README.md(несуществующие в кодеbsp_can.c/can_mock.h/bsp_can_rx_cb_t) — исправлены по сверке с заголовками.bsp/mqs/{mqs.c,mqs.h,mqs_amp.c}— докстринги приведены в соответствие с кодом (были «SAI1»/«16 кГц», реально SAI3/12 кГц — подтверждено сверкой сbsp/generated/clock_config.c);bsp/provisioning/provisioning.h— докстринг порядка байт UID исправлен на соответствующий реализации (provisioning.cпишет CFG0 первым, докстринг утверждал обратное).- Корневой
README.md—firmware/bootloader//firmware/tft_app/помечены как запланированные, а не готовые (директорий не существует,add_subdirectory()закомментирован в корневомCMakeLists.txt); добавлен ранее отсутствовавший раздел «Инструменты (tools/)» —tools/production/(service-tui) нигде не упоминался.
Известные ограничения
- Auto-config Flashloader для W25Q256/512 не проверялся напрямую — решили не полагаться на него вообще, FCB для кастомных бинарей всегда пишется явно.
- Массовое программирование (авто-прошивка по факту детекта SDP, без подтверждения оператора) рассмотрено и отклонено — в SDP/Flashloader-режиме нет способа прочитать UID платы для идентификации.
[2026-06-29] — Этапы 6г–7: MQS, HIL pytest firmware_test, Provisioning
Кратко
firmware_testполучил MQS audio-тест, полный HIL pytest-стек для firmware_test (opto + CAN через CDC) и командуget_uidдля чтения OCOTP UID.- Завершён Этап 6 целиком. Этап 7 (Provisioning draft) реализован.
Добавлено
bsp/mqs/+bsp_mqs— SAI3 + eDMA + MQS периферия, управление громкостью через PWM4 SM0 + LM4875M. API:bsp_mqs_init/deinit,bsp_mqs_play,bsp_mqs_is_busy,bsp_mqs_amp_init/deinit,bsp_mqs_amp_set_volume.firmware/test/src/tests/test_mqs.c— интерактивный тест: мелодия ~4 с (A4 + E5, целочисленная LUT-синусоида), async-воспроизведение с USB keepalive,confirm_request("mqs_tone")→ PASS/FAIL оператором.tools/hil/conftest.py— классFirmwareCdcClientи фикстураfirmware_cdc: подключение к firmware_test по USB CDC ACM, проверка живости черезping→pong.tools/hil/06_test_firmware_opto.py— HIL pytest для opto-теста через CDC: автоматический оркестратор M5 реле → confirm, без участия оператора.tools/hil/06_test_firmware_can.py— HIL pytest для CAN-теста через CDC: RX (M5→таргет) и TX (таргет→M5) направления независимо.bsp/provisioning/+bsp_provisioning— чтение OCOTP UID (8 байт) через прямой доступ кOCOTP->CFG0/CFG1(паттернfsl_silicon_id_soc.c).- Команда
get_uidв протоколе v2:{"type":"cmd","cmd":"get_uid"}→{"type":"uid_response","uid":"<16 hex символов>"}.
Изменено
protocol.h/c— добавленаprotocol_send_uid_response().cli.c— добавлена веткаstrcmp(cmd_name, "get_uid")вhandle_cmd(); исправлен порядок:strstrзаменён наstrcmpпо аналогии с остальными командами.bsp/README.md— добавленыbsp_mqsиbsp_provisioningв таблицу и дерево.
Исправлено
- MQS: отсутствие
.pwmchannelenable = trueвpwm_signal_param_t(NXP SDK ≥ 2.13) приводило к тому чтоPWM_SetupPwm()не выставлялOUTEN→ ШИМ не выходил на пин. Маскировалось отладчиком (оставлялOUTENот прошлой сессии), воспроизводилось только при cold reset. - OCOTP:
OCOTP_Init()вызывал зависание при чтении UID (контроллер занят после USB CDC init). Исправлено переходом на прямое чтениеOCOTP->CFG0/CFG1без инициализации контроллера — shadow registers доступны сразу после сброса.
Тесты
06_test_firmware_opto.pyhardware-verified: таймингиRELAY_ON_S=0.15,RELAY_OFF_S=0.5; финальное чтение черезbsp_opto_force_read()обходит race condition чётного числа ISR при дребезге реле.06_test_firmware_can.pyhardware-verified: два направления (RX + TX),disableSelfReception=trueна таргете.test_mqshardware-verified: async-воспроизведение + USB keepalive работает корректно; blocking-вариант голодал USB за ~4 с.
Документация
bsp/provisioning/README.md— новый компонент: API, аппаратура, особенности прямого чтения OCOTP.PROTOCOL.md— добавлена командаget_uid/ событиеuid_response.
[2026-06-23] — Buttons/display test modules и полный рефакторинг документации
Диапазон: 22f98c311a4564d8f18ed72d11635bf908046b1e..<NEW_SHA>
Сравнение: https://github.com/OSabuser/tft_manufacture_test/compare/22f98c311a4564d8f18ed72d11635bf908046b1e...<NEW_SHA>
Кратко
- Manufacturing-test firmware получил два новых test module (
test_buttons,test_display), оба hardware-verified на таргете. - Вся проектная документация прошла полный рефакторинг: единый шаблон для BSP README, Mermaid-диаграммы вместо ASCII, структурные README для
utils/иport/.
Добавлено
firmware/test/src/tests/test_buttons.c— интерактивный тест двух тактовых кнопок (GPIO_B1_14/GPIO2[30], GPIO_B1_15/GPIO2[31]); non-blocking polling 5 мс, таймаут даётTEST_STATUS_SKIP;bsp_button_init()вызывается внутри init-фазы модуля.firmware/test/src/tests/test_display.c— интерактивный тест дисплея (два этапа: заливка цветом R/G/B/W с confirm-запросами, проверка ротации LR/UD черезbsp_display_set_rotation()).port/fatfs/README.md— новый документ, описывает INTERFACE-архитектуруport_fatfs_sdи причину per-binary компиляцииdiskio_sd.c.utils/prio_queue/README.md— новый документ (модуль существовал, документация отсутствовала).
Изменено
- Все 11 BSP README (
led,tick,uart_host,opto,can,button,usb_cdc,sdram,qspi_flash,sd,display) приведены к единому шаблону: Аппаратура (с номерами корпуса из pin_mux) → Архитектура → API → Быстрый старт → Тестирование → Интеграция → CMake. bsp/README.md— исправлена таблица компонентов (ранее отсутствовали 6 из 11 модулей), ASCII-диаграмма концепции заменена Mermaid.docs/DEV_ARCH.md— шесть ASCII-диаграмм заменены Mermaid (graph TB,flowchart,sequenceDiagram); §2 разбит на две отдельные диаграммы (физические связи + состав инструментов).docs/HOW_TO_FLASH.md— ASCII bash-поток USB SDP заменён Mermaidflowchart TD.docs/HOW_TO_DEBUG.md— ASCII топология хост/devcontainer заменена Mermaidflowchart LR.docs/testing/PROTOCOL.md— четыре ASCII-блока (стенд, жизненный цикл, три интерактивных теста, state machine) заменены Mermaid (flowchart,sequenceDiagram,stateDiagram-v2).docs/testing/host/HOST_CREATE_TEST.md— ASCII стек заменён Mermaid.docs/testing/hil/HIL_CREATE_TEST.md— ASCII стек и цепочка фикстур заменены Mermaid.README.md(корневой) — убрана устаревшая таблица BSP с 5 из 11 модулями, заменена ссылкой наbsp/README.md; исправлено описаниеtft_app.utils/README.md— добавлен пропущенный модульprio_queue, добавлен раздел CMake.port/README.md— переработан с Mermaid-диаграммой архитектуры слоёв.port/log/README.md— добавлена Mermaid-диаграмма потока, раздел FreeRTOS с реальным кодом.
Тесты
test_buttonshardware-verified: обнаружен и исправлен багcli.c—g_s_line_lenдолжен сбрасываться в0до вызоваprocess_line(), иначе входящие байты корруптят буфер команды в blocking confirm-wait цикле.test_displayhardware-verified: уточнена семантика ротации —SHLRуправляет горизонтальным направлением (LR пин),UPDN— вертикальным (UD пин); enum использует семантические имена (BSP_DISPLAY_ROTATE_0,BSP_DISPLAY_FLIP_VERTICALи др.).
Отфильтрованный шум
- Нормализация форматирования внутри уже существующих документов без изменения содержания.
- Перестановки в порядке разделов там, где смысл не менялся.
Базовый срез — 2026-05-13
Диапазон: вся история репозитория от initial commit до 22f98c311a4564d8f18ed72d11635bf908046b1e
Кратко
- Репозиторий представляет собой firmware-монорепозиторий для платы на базе NXP MIMXRT1052CVJ5B. Он охватывает manufacturing-test firmware, планируемые bootloader/application firmware, BSP-модули, host tooling, HIL tooling и документацию.
- К базовому срезу в проекте уже есть полноценный BSP-слой, двухуровневая стратегия тестирования, USB-CDC архитектура тестовой прошивки, GitHub Actions CI и обширная инженерная документация.
Текущая архитектура
- BSP-модули на момент базового среза:
led,tick,uart_host,opto,can,button,usb_cdc,sdram,qspi_flash,sd,display. - Host-тесты используют Unity/fff-подобные моки и инструменты, рассчитанные на devcontainer.
- HIL-тесты используют pyOCD, pyserial, pytest и поддержку M5StampPLC.
- Командный путь firmware-test состоит из USB-CDC ACM CLI, бинарного протокола,
test_runnerи отдельных firmware-side test modules. - Документация покрывает архитектуру разработки, прошивку, отладку, HAB, HIL, host-тесты и поведение протокола.
Состояние CI
- GitHub Actions уже есть и собирает проект внутри devcontainer.
- Видимый пробел: host unit tests и HIL tests пока не входят в GitHub Actions workflow.
[2026-05-08] — Display test module и выравнивание документации
Кратко
- Базовый срез заканчивается тем, что поддержка display становится частью и BSP, и manufacturing-test firmware.
- README и инженерные документы были синхронизированы между несколькими модулями, поэтому это documentation-heavy, но смысловое изменение состояния проекта.
Добавлено
- Реализован
bsp/displayс API, исходниками и интеграцией в сборку. - Добавлен
firmware/test/src/tests/test_display.cкак firmware-side test module для display.
Изменено
- README нескольких BSP-модулей и manufacturing-test firmware приведены к более единому стилю.
docs/DEV_ARCH.md, документы по прошивке/отладке и HIL-гайды обновлены под актуальную структуру проекта.just/ci_workflow.mdрасширен дополнительными деталями CI workflow.
Документация
- Документация по display, SD, CAN, button, USB-CDC и firmware-test получила содержательные обновления, а не только форматирование.
Удалено
- Удалён
bsp/qspi_flash/REFACTORING.md, так как временный план потерял актуальность.
Отфильтрованный шум
- Чистая нормализация стиля в документации не учитывалась как отдельная feature, если она не меняла содержание или проектные инструкции.
[2026-05-07] — USD/SD test flow
Кратко
- SD/MMC testing перешёл от BSP/middleware-работ к firmware-test module с обновлением протокола и тестовой документации.
Добавлено
- Добавлен
firmware/test/src/tests/test_usd.c, затем доведён до usable SD/MMC test module.
Изменено
firmware/test/src/main.cупрощён по мере модульного оформления test modules.docs/testing/PROTOCOL.md,firmware/test/src/tests/README.mdиfirmware/test/PLAN.mdобновлены под USD/SD test coverage.
Тесты
- Firmware-side SD/MMC testing стал видимым отдельным модулем, хотя базовый срез всё ещё требует отслеживать стабильное HIL-покрытие SD.
[2026-05-06] — SD card и FatFS integration
Кратко
- Поддержка SD card и FatFS вошла в BSP и firmware-test stack.
- NXP SD middleware был пропатчен, что создаёт будущую точку контроля для vendor SDK drift.
Добавлено
- Добавлен
bsp/sdс API, реализацией, README и CMake-интеграцией. - Добавлены
firmware/test/fatfsиport/fatfs/sdдля подключения FatFS к SD BSP. - Добавлены generated SDMMC configuration files.
Изменено
- SDK SD middleware и SDMMC host code изменены для поддержки smoke-test path.
- Clock и pin configuration скорректированы под SD/MMC.
Тесты
- Появился SD smoke-test, но стабильное HIL regression coverage ещё не закреплено в базовом срезе.
Отфильтрованный шум
project_tree.txtиsdk/sdk_tree.txtрассматривались как artifacts состояния репозитория, а не как функциональные изменения.
[2026-04-23] — Добавлен GitHub Actions CI
Кратко
- CI стал реальным: проект получил GitHub Actions workflow, который собирает проект внутри devcontainer.
- Workflow ориентирован на сборку; host tests и HIL tests остаются будущей работой.
Добавлено
- Добавлен
.github/workflows/ci.ymlс triggers на push, PR и manual dispatch. - Workflow собирает devcontainer image, запускает
just ci::buildи загружает build tree как artifact. - Добавлен
just/ci_workflow.mdс описанием CI flow.
Изменено
just/ci.justскорректирован под CI build path.
CI
- CI покрывает воспроизводимость containerized build.
- CI пока не запускает host unit tests.
- CI пока не запускает HIL tests, которым требуется подключённое железо или self-hosted runner.
Удалено
- Удалён
.clang-tidyoverride для generated code изbsp/generated.
[2026-04-20 .. 2026-04-22] — SDRAM и QSPI firmware-test modules
Кратко
- Manufacturing-test firmware получил memory-oriented test modules для SDRAM и QSPI Flash.
- QSPI support появился и как BSP module, и как firmware-side test.
Добавлено
- Добавлены API и реализация
bsp/sdram. - Добавлен
firmware/test/src/tests/test_sdram.c. - Добавлен
bsp/qspi_flashс API, реализацией и README. - Добавлен
firmware/test/src/tests/test_qspi.c. - Добавлен
firmware/test/src/tests/README.mdс описанием firmware-side test modules.
Изменено
firmware/test/src/main.cобновлён для интеграции новых test modules.
Тесты
- SDRAM и QSPI вошли в firmware-test command model.
Документация
- Документация по test modules начала описывать растущий firmware-test suite.
[2026-04-17] — Binary protocol, test runner и hardware documentation
Кратко
- Manufacturing-test firmware перешёл от простого CLI к protocol-driven test runner architecture.
- Hardware reference documentation существенно расширилась.
Добавлено
protocol.c/.hввели binary protocol для управления тестами.test_module.hиtest_runner.c/.hввели modular firmware-test runner.- Добавлены host tests для protocol и runner behavior.
docs/testing/PROTOCOL.mdописал binary protocol.- Добавлены hardware PDFs и board/display reference materials в документацию.
Изменено
firmware/test/README.mdсильно переписан под новую архитектуру.- Existing CLI host tests были расширены.
Тесты
- Host coverage расширился на protocol, runner и CLI behavior.
Удалено
- Старые planning/architecture artifacts в
firmware/testи HIL refactor notes удалены после замены новой структурой.
Отфильтрованный шум
- Большие добавления hardware PDF сведены по назначению, без перечисления каждого файла.
[2026-04-07 .. 2026-04-09] — USB-CDC CLI и priority queue
Кратко
- Test firmware получил modular USB-CDC CLI.
- Добавлен priority queue utility и host coverage для него.
Добавлено
firmware/test/src/cli.cиcli.hввели отдельный CLI module.tests/host/cli/test_cli.cдобавил host coverage для CLI behavior.- Добавлен
utils/prio_queueс README и большим host test. - Появилась placeholder structure для
bsp/display.
Изменено
- Старый monolithic
firmware/test/main.cpath заменён на modular source layout. - Добавлены firmware-test planning docs вокруг CLI/protocol roadmap.
Тесты
- Host tests покрыли CLI и priority queue.
[2026-04-03 .. 2026-04-06] — USB-CDC stack и HIL coverage
Кратко
- USB-CDC ACM стал реальной BSP capability и был подключён к HIL validation.
- HIL configuration и documentation были уточнены вокруг нового USB path.
Добавлено
- Реализован
bsp/usb_cdcс API, descriptors, Chapter 9 handling и hardware wrappers. - SDK USB middleware integration добавлена в сборку.
tests/target/hil_usb_cdcиtools/hil/05_test_usb_cdc.pyдобавили USB-CDC HIL coverage.
Изменено
- Обработка HIL configuration была отрефакторена,
.env.exampleполучил новые переменные. bsp/usb_cdc/README.mdпереписан с фокусом на API documentation.
Тесты
- USB-CDC вошёл в numbered HIL suite после UART, opto, CAN и button.
Документация
- HIL docs, включая bench, creation guide, fixtures и how-to, были обновлены.
[2026-04-01 .. 2026-04-02] — Clock, pin и MPU setup
Кратко
- Board generated files стали полнее: в firmware base вошли clock, pin и MPU configuration.
Добавлено
- Добавлены generated clock и pin-mux configuration files.
- Добавлен
TFT_Board.mexкак project state NXP Config Tools. - Появились initial empty
bsp/sdramplaceholders.
Изменено
- Board startup/configuration получил MPU initialization.
- Linker scripts скорректированы для FlexSPI NOR и RAM layout.
firmware/test/main.cупрощён вокруг нового initialization path.
[2026-03-30 .. 2026-03-31] — CAN и button BSP с host/HIL tests
Кратко
- CAN и button support стали полноценными BSP modules с host и HIL validation.
- HIL tests были пронумерованы в ordered suite.
Добавлено
- Добавлен
bsp/canс API, реализацией, README и mocks. - Добавлены host tests и HIL target/test code для CAN.
- Добавлен
bsp/buttonс API, реализацией и README. - Добавлены host tests и HIL target/test code для button.
Изменено
- HIL pytest files переименованы в ordered sequence: UART, opto, CAN, button.
- HIL documentation обновлена по мере конкретизации test suite.
Тесты
- CAN и button получили host test coverage.
- CAN и button получили HIL coverage.
Удалено
- Удалён
bsp/can/PLAN.mdпосле переноса полезного содержания в README.
[2026-03-26 .. 2026-03-28] — M5StampPLC HIL bench и fixture documentation
Кратко
- HIL стал больше чем pyOCD prototype: появились M5StampPLC support, power/control helpers и fixture documentation.
Добавлено
- Добавлена поддержка M5StampPLC в
tools/hil, включая agent/CLI logic и MicroPython firmware assets. - HIL support code реорганизован в M5-specific helpers.
tests/target/hil_optoиtools/hil/test_opto.pyдобавили opto HIL coverage.docs/testing/hil/HIL_FIXTURES.mdописал pytest fixtures для HIL.
Изменено
just/host.justиtools/hil/conftest.pyсущественно расширены под HIL workflows.- Документация реорганизована в более понятные иерархии hardware, MIMXRT1052 и testing.
Тесты
- Opto inputs получили HIL-level validation.
Удалено
- Старые locations CMake/test guides заменены новой иерархией
docs/testing.
Отфильтрованный шум
- Перемещения PDF и документов учтены как изменение структуры документации, а не как отдельное content change для каждого файла.
[2026-03-23] — Logging infrastructure и BSP opto
Кратко
- Появились logging infrastructure и opto input BSP вместе с host coverage.
Добавлено
port/logиutils/logввели logging abstractions и UART-oriented logging support.- Добавлены host tests для logging behavior.
- Добавлен
bsp/optoс API, реализацией, README, GPIO mocks и host tests.
Тесты
- Host coverage расширился на logging и opto behavior.
Удалено
- Корневой
TODO.mdудалён после переноса планирования в другие места.
[2026-03-18 .. 2026-03-20] — Первый HIL skeleton и flashing/debug docs
Кратко
- Проект получил первый HIL skeleton и target-side UART validation path.
- Flashing и debugging tooling стали документированными и scriptable.
Добавлено
- Добавлен
tools/hilс pytest/pyOCD/pyserial-oriented utilities. tests/target/host_uartпредоставил target firmware для UART HIL validation.tools/host/flash_swd.pyдобавил SWD flashing support.- Добавлены
docs/HOW_TO_DEBUG.md, расширенные flash docs и tool README.
Изменено
- Main README и development architecture docs расширены вокруг host/container workflow и testing.
- Добавлены host и HIL test creation guides.
Тесты
- Появился первый UART HIL path.
Удалено
- Temporary flash logs удалены после окончания диагностической пользы.
[2026-03-16 .. 2026-03-17] — Первые BSP modules и host test infrastructure
Кратко
- Репозиторий получил первые concrete BSP modules и host-test layout.
Добавлено
- Добавлены
bsp_ledиbsp_tickс API, реализацией и README files. bsp/uart_hostдобавил LPUART1/MCU-Link VCOM support с API, реализацией, README, mocks и host tests.- Введены shared BSP status codes.
- Добавлен
utils/ring_buffer. - Добавлен
tests/hostс mocks и tests для LED, ring buffer и timeout behavior. TODO-HIL.mdзафиксировал initial HIL plan.
Тесты
- Host testing начался с Unity/fff-style mocks и isolated test directories.
[2026-03-13 .. 2026-03-15] — Draft архитектуры manufacturing-test firmware
Кратко
- Архитектура manufacturing-test firmware была задокументирована до последующей реализации protocol/runner.
Добавлено
firmware/test/README.mdиfirmware/test/arch.svgописали первый architecture concept.- BSP и USB-CDC README зафиксировали early design intent.
Изменено
bootstrap.shбыл упрощён.
Удалено
- Ранняя VS Code launch configuration удалена при cleanup bootstrap.
[2026-03-10 .. 2026-03-12] — Project environment, BSP base и HAB flow
Кратко
- Проект перешёл от пустого scaffold к buildable embedded workspace с generated board support, HAB assets и containerized tooling.
Добавлено
- Добавлен board support для MIMXRT1052: startup code, generated config, linker scripts и FlexSPI NOR-related assets.
- Добавлен HAB signing/configuration flow для app, bootloader и firmware-test images.
- Добавлены formatting/lint/editor configuration.
- Добавлены devcontainer, Dockerfile, CMake presets, VS Code tasks и bootstrap scripts.
Justfileстал entry point для build и host automation.- Добавлена development architecture и CMake hints documentation.
Изменено
- Generated NXP Config Tools content перенесён из
bsp/boardвbsp/generated. - Логика
Justfileразделена на modules подjust/. - Добавлена flashing documentation, bootstrap logic переработана.
Документация
- Early docs явно отмечали, что CI и tests ещё не покрыты.
[2026-03-05] — Initial repository scaffold
Кратко
- Репозиторий инициализирован с базовой metadata и README placeholder.
Добавлено
- Добавлены
.gitattributes,.gitignoreи начальныйREADME.md.
Отфильтрованный шум базового среза
Следующие классы изменений были просмотрены, но намеренно не развёрнуты в подробные записи changelog:
- Merge commits без смысловых content changes.
- Дублирующиеся или неинформативные commit subjects, где значимость определялась по diff, а не по title.
- Чистое форматирование или переносы строк в документации.
- Перенумерация HIL tests, когда поведение не менялось.
- Bulk vendor SDK imports и generated code churn, кроме случаев, где они влияли на локальные patches или build effects.
- Перемещения PDF и datasheets, кроме случаев изменения структуры документации.
Контракт еженедельного мониторинга
Регулярная еженедельная проверка должна:
- Сравнивать предыдущий сохранённый SHA с текущим HEAD ветки
dev. - Обновлять блок
[Не выпущено]или создавать новый датированный блок наверху при наличии смысловых изменений. - Предпочитать строгие русскоязычные категории из этого файла.
- Упоминать изменения README только тогда, когда они влияют на onboarding, понимание API, инструкции сборки/тестирования или архитектуру проекта.
- Упоминать изменения тестовой инфраструктуры, когда они затрагивают host tests, HIL tests, firmware-side test modules, fixtures, runners, protocol commands или expected coverage.
- Упоминать CI changes, когда меняются workflows, local CI tasks, artifacts, triggers, status или self-hosted runner strategy.
- Молчать, если новых коммитов нет или найден только отфильтрованный шум.