diff --git a/tools/firmware-build/README.md b/tools/firmware-build/README.md index ccb8522..5c7cf7f 100644 --- a/tools/firmware-build/README.md +++ b/tools/firmware-build/README.md @@ -78,13 +78,66 @@ cmd /c call "K:\git_project\newProject\newTEMPL\templates\tools\firmware-build\c Это подготовка метаданных сборки и файла. Чтобы версия присутствовала в программе и ответах устройства, подключите заголовок `firmware_identity.h` к модулю версии и обработчику запроса. Include path: `${BuildDirectory}/generated`. Для C2000 с 16-битным char нужна адаптация байтового контракта; обычный 8-битный порт нельзя считать готовым. Смотрите [PORTING.md](../../c/firmware-info/PORTING.md). -## Прежний режим и Keil +## Keil: тот же JSON, заголовок и SHA-256 -Для совместимости сохранены старые вызовы CCS без `--identity` и исходные Keil BAT: +Keil использует `firmware_identity.json` и режим `--identity`, как CCS. Дополнительный CMD-файл конфигурации и SETGUI для этой схемы не нужны. Требуется Python 3.8+ в PATH; Git нужен для commit. HEX создаётся штатным компилятором Keil, а BAT создаёт и проверяет manifest и SHA-256 точного HEX/BIN. -```bat -call "templates\tools\firmware-build\keil\precompile.bat" "project-root" "generated\firmware_build_id.h" -call "templates\tools\firmware-build\keil\postcompile.bat" "firmware-release.cmd" +### 1. Создайте конфигурацию версии + +Пример расположения: + +```text +project/ + firmware_identity.json + mdk/ + Firmware.uvprojx + Generated/ ``` -Этот precompile вызывает make_build_id.ps1, а postcompile — SETGUI preflight готового HEX/BIN. Для этого отдельного режима нужны firmware-release.cmd и настроенный SETGUI по [инструкции публикатора](../firmware-publish/README.md). Его конфигурация выпуска не читается режимом `--identity`. +Скопируйте `keil/firmware_identity.example.json` в корень project под именем `firmware_identity.json`. Исправьте product, target и version: + +```json +{ + "product": "MY_CONTROLLER", + "target": "STM32F407", + "version": [0, 1, 0] +} +``` + +### 2. Настройте Before/After Build + +В Options for Target → Output включите Create HEX File. Затем откройте User и включите выполнение команд Before Build/Rebuild и After Build/Rebuild. Для обеих команд задайте Stop on Exit Code `>=1`, чтобы ошибка скрипта останавливала сборку. Пример предполагает templates в `C:\Projects\templates`; замените этот путь своим. + +Before Build/Rebuild, одной строкой: + +```bat +cmd /c call "C:\Projects\templates\tools\firmware-build\keil\precompile.bat" --identity "$P.." "$P..\firmware_identity.json" "$PGenerated" +``` + +After Build/Rebuild, одной строкой: + +```bat +cmd /c call "C:\Projects\templates\tools\firmware-build\keil\postcompile.bat" --identity "#H" "$PGenerated\firmware_identity.json" +``` + +В Keil `$P` обозначает каталог проекта с завершающим разделителем, а `#H` — полный путь к выходному HEX. Официальное описание макросов: [Keil User commands](https://www.keil.com/support/man/docs/uv4cl/uv4cl_dg_user.htm). Макросы раскрываются в IDE; при ручном запуске BAT замените их реальными путями. + +В примере файл uvprojx находится в mdk, поэтому `$P..` указывает на корень исходников. Если JSON и uvprojx находятся в одном каталоге, используйте `"$P."` для repository и `"$Pfirmware_identity.json"` для config; третий аргумент Generated сохраните. + +Добавьте Generated в include path и подключите `firmware_identity.h` в модуле версии прошивки. Для параллельных или разных target задавайте отдельные Generated и согласуйте путь во второй команде. Перенос версии в ответ устройства требует подключения модуля и обработчика, как описано в [PORTING.md](../../c/firmware-info/PORTING.md). + +### 3. Выполните Rebuild + +Перед выпуском измените только исходный firmware_identity.json и выполните Rebuild. Precompile создаст заголовок и метаданные в Generated. Postcompile создаст рядом с HEX: + +```text +Firmware.hex +Firmware.hex.manifest.json +Firmware.hex.sha256 +``` + +При успехе Console содержит строки `[firmware-build] Image`, `Manifest`, `SHA-256`. Для готового BIN вместо `#H` передайте его фактический путь; конвертацию AXF в BIN нужно выполнить до postcompile. Сгенерированные файлы исключите через .gitignore. + +## Совместимость со старыми проектами + +Вызовы BAT без `--identity` сохранены для уже настроенных проектов: прежний precompile генерирует только build ID, прежний postcompile запускает SETGUI preflight по release-конфигурации. Эта отдельная схема описана в [инструкции публикатора](../firmware-publish/README.md). Для новых CCS и Keil используйте приведённые выше команды с `--identity`. diff --git a/tools/firmware-build/keil/firmware_identity.example.json b/tools/firmware-build/keil/firmware_identity.example.json new file mode 100644 index 0000000..7767f6d --- /dev/null +++ b/tools/firmware-build/keil/firmware_identity.example.json @@ -0,0 +1,5 @@ +{ + "product": "MY_CONTROLLER", + "target": "STM32F407", + "version": [0, 1, 0] +} diff --git a/tools/firmware-build/keil/postcompile.bat b/tools/firmware-build/keil/postcompile.bat index ea6583b..de1e9df 100644 --- a/tools/firmware-build/keil/postcompile.bat +++ b/tools/firmware-build/keil/postcompile.bat @@ -1,5 +1,7 @@ @echo off -setlocal DisableDelayedExpansion +setlocal EnableExtensions DisableDelayedExpansion +if /i "%~1"=="--identity" goto identity +rem Legacy mode retained for existing SETGUI publication configurations. if "%~1"=="" goto usage if not "%~2"=="" goto usage if not exist "%~1" ( @@ -8,6 +10,22 @@ if not exist "%~1" ( ) call "%~dp0..\..\firmware-publish\PUBLISH_FIRMWARE.bat" --config "%~f1" --preflight exit /b %errorlevel% +:identity +if "%~2"=="" goto usage +if "%~3"=="" goto usage +if not "%~4"=="" goto usage +if /i not "%~x2"==".hex" if /i not "%~x2"==".bin" ( + echo [firmware-build] Expected a ready HEX or BIN image: "%~2" 1>&2 + exit /b 2 +) +python "%~dp0..\..\..\c\firmware-info\tools\identity.py" seal --image "%~f2" --metadata "%~f3" +if errorlevel 1 exit /b %errorlevel% +python "%~dp0..\..\..\c\firmware-info\tools\identity.py" verify --image "%~f2" --manifest "%~f2.manifest.json" +if errorlevel 1 exit /b %errorlevel% +echo [firmware-build] Image: "%~f2" +echo [firmware-build] Manifest: "%~f2.manifest.json" +echo [firmware-build] SHA-256: "%~f2.sha256" +exit /b 0 :usage -echo Usage: postcompile.bat "firmware-release.cmd" 1>&2 +echo Usage: postcompile.bat --identity "image.hex-or-bin" "generated-metadata.json" 1>&2 exit /b 2 diff --git a/tools/firmware-build/keil/precompile.bat b/tools/firmware-build/keil/precompile.bat index 2efa06a..30eba48 100644 --- a/tools/firmware-build/keil/precompile.bat +++ b/tools/firmware-build/keil/precompile.bat @@ -1,5 +1,7 @@ @echo off -setlocal DisableDelayedExpansion +setlocal EnableExtensions DisableDelayedExpansion +if /i "%~1"=="--identity" goto identity +rem Legacy mode: build ID header only. if "%~1"=="" goto usage if "%~2"=="" goto usage if not "%~3"=="" goto usage @@ -9,6 +11,14 @@ if not exist "%~1\." ( ) powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dp0..\..\..\c\firmware-info\tools\make_build_id.ps1" -Repository "%~f1" -Output "%~f2" exit /b %errorlevel% +:identity +if "%~2"=="" goto usage +if "%~3"=="" goto usage +if "%~4"=="" goto usage +if not "%~5"=="" goto usage +python "%~dp0..\..\..\c\firmware-info\tools\identity.py" prepare --repository "%~f2" --templates "%~dp0..\..\.." --config "%~f3" --output "%~f4" +exit /b %errorlevel% :usage -echo Usage: precompile.bat "project-root" "output-header" 1>&2 +echo Usage: precompile.bat --identity "project-root" "firmware_identity.json" "generated-dir" 1>&2 +echo Legacy: precompile.bat "project-root" "output-header" 1>&2 exit /b 2