Files
Balsam_167/Doc/FIRMWARE_IDENTITY.md
Andrey 5d9818291b feat: add M95M02-only GAS and EEPROM profiles
Expose the existing registers through Modbus and service CAN using one GAS provider only in M95M02 builds.
Include the EEPROM layout/driver, LOAD protection and calibration, firmware identity and shared CCS build workflow.
Add transport/profile and SCI8 validation tests, documentation and the checked M95M02 firmware image.
2026-10-09 16:17:37 +03:00

11 KiB
Raw Blame History

167: версия работающей прошивки, SHA-256 и выпуск

Что подключено

167 использует общий templates/c/firmware-info, а не копию Climate. Работающий ПМ35 отдаёт 12 регистров версии через RS и служебный CAN. После сборки на компьютере создаются SHA-256 BIN и JSON-паспорт.

Общая подробная инструкция, включая перенос на TMS320F2812 и STM32: BUILD_IDENTITY.md.

Файл проекта Роль
UKSSTMS320F28335/firmware_version.h Редактируемый номер выпуска: FIRMWARE_VERSION_MAJOR/MINOR/PATCH
UKSSTMS320F28335/firmware_identity.json Product и target; версия берётся из C-заголовка
Source/Internal/shared_ump.c Подключение общей таблицы версии и привязка к UMP ПМ35
UKSSTMS320F28335/prepare_identity.py Генерация идентичности из C-заголовка перед CCS Debug/Release
build_logger.ps1 Полный CLI build: prepare, compile, link, SCI8, size check, seal
build_bin.bat Debug post-build: проверка SCI8 и паспорт конечного BIN
tests/firmware_identity/port_test.c Host-проверка привязки версии к реальному порту 167

Номер 0.1.0 — начальная версия разработки этого механизма; он не выдаётся за историческую версию предыдущих BIN. Назначайте release-номер вручную перед выпуском.

Сборка из PowerShell

Из корня 167:

./build_logger.ps1 -OutputDirectory "$PWD/Bin/FirmwareIdentity" `
  -ImageName UKSSTMS320F28335

По умолчанию применяется -O2 --opt_for_speed=0. Результаты:

Bin/FirmwareIdentity/UKSSTMS320F28335.bin
Bin/FirmwareIdentity/UKSSTMS320F28335.bin.manifest.json
Bin/FirmwareIdentity/UKSSTMS320F28335.bin.sha256
Bin/FirmwareIdentity/generated/firmware_identity.h
Bin/FirmwareIdentity/generated/firmware_identity.json

Проверка файла перед передачей:

python ../newProject/SETGUI/third_party/templates/c/firmware-info/tools/identity.py verify `
  --image Bin/FirmwareIdentity/UKSSTMS320F28335.bin `
  --manifest Bin/FirmwareIdentity/UKSSTMS320F28335.bin.manifest.json

CLI принимает -TemplatesRoot, если общий checkout расположен иначе. Все исходники общего механизма собираются непосредственно из этого checkout.

Сборка CCS

В .cproject добавлены pre-build и include paths ${BuildDirectory}/generated и templates/c/firmware-info/include. После изменения настроек закройте/откройте проект в IDE, затем выполните Clean/Rebuild.

Pre-build требует Python 3.10+ и Git в PATH процесса CCS. Generated принадлежит этому проекту: не запускайте Debug/Release одновременно. Для параллельных сборок используйте CLI с разными output-каталогами.

Штатный Debug post-build создаёт в Bin:

UKSSTMS320F28335_<commit>.bin
UKSSTMS320F28335_<commit>.bin.manifest.json
UKSSTMS320F28335_<commit>.bin.sha256

Имя BIN исторически содержит HEAD без dirty-суффикса; достоверные признаки dirty находятся внутри ответа версии и паспорта. Не определяйте чистоту только по имени. Release-конфигурация получает embedded identity через pre-build, но её старый проект не имел автоматического BIN post-build. Для готового проверенного BIN с паспортом используйте описанный CLI либо настройте release-конверсию по общей инструкции; нельзя запускать Debug build_bin.bat на Release и ожидать другой .out.

Если CCS пишет Error ... (ignored), сборка не считается успешной: убедитесь, что последняя проверка и seal завершились без ошибок. Старый BIN с таким же именем может оставаться на диске после неудачной сборки.

Как прочитать версию

По прямому RS232/RS485: Modbus 03, адрес начала 4608 (0x1200), 12 слов. Это zero-based адрес в запросе, а не обозначение 4xxxx в интерфейсе терминала. Адрес ведомого остаётся текущим CNTRL_ADDR. Возвращается стандартный RTU-ответ с 24 байтами данных и CRC; дополнительного legacy padding в этом окне нет.

Адрес Содержимое
0x1200 Версия формата = 1
0x1201..0x1203 Major, minor, patch
0x1204 Год UTC
0x1205 Месяц:день, старший:младший октет
0x1206 Час:минута UTC
0x1207 Секунда
0x1208..0x120B 8 ASCII-символов Build ID, по два на слово

По служебному CAN ПМ35: запрос UMP функции 03, 0x1200, 12 слов; ответ состоит из шести фрагментов. Используется выбранный Mode и существующий token запроса. CAN ПМ67 не переназначается. Запись функции 06 в окно версии запрещена.

Старый образ может вернуть исключение или неизвестный контракт. Это не следует заменять «ожидаемой» версией выбранного BIN. После прошивки переподключитесь или явно обновите чтение: ответ должен поступить с устройства, а не из кэша GUI.

Что сравнивать после заливки

Сравните SemVer, все поля UTC и Build ID с паспортом именно загруженного BIN. + означает локальные изменения приложения или templates; полный Git SHA и состояние обоих деревьев записаны в JSON. Проверка SHA на ПК подтверждает целостность файла, но не заменяет проверку программатором записанной памяти.

В контракте нет аппаратного product ID и хеша всей памяти. Подключённый профиль должен оставаться ПМ35/167, а файл — product=Balsam-167-PM35, target=TMS320F28335. Не переносите файл на ПМ67 только по похожему имени.

Влияние на память и параметры

С проверенными настройками текущий образ занимает 32 286 байт, предел — 32 508, запас 222 байта. Механизм добавил 116 байт относительно сборки без него. Это результат конкретной сборки, не обещание для следующих изменений.

Таблица версии — часть .econst прошивки. Её не сохраняют в область параметров; старые настройки не могут подменить версию после обновления. Размер буфера лога и размещение EEPROM-параметров не менялись. Дата не разбирается на MCU, SHA-256 не вычисляется на MCU. Проверка размера check_firmware.ps1 остаётся обязательной.

Проверки и ограничения

Проверка соответствия паспорта реально встроенной таблице в собранном SCI8:

python tests/firmware_identity/check_build.py Bin/FirmwareIdentity/UKSSTMS320F28335.bin

Этот независимый тест также сверяет SHA и размер, проходит boot-блоки и ищет точное 12-словное представление версии. Он обнаружит старый объект версии или паспорт другой сборки. Это тест для 167, не транспортный код для GUI.

Host-тест реального порта (GCC должен быть в PATH):

$templates = '../newProject/SETGUI/third_party/templates'
gcc -std=c99 -Wall -Wextra -Werror `
  "-I$templates/c/firmware-info/include" -IBin/FirmwareIdentity/generated `
  "-I$templates/c/set-protocol" "-I$templates/c/set-protocol/ports/tms320f28335" `
  tests/firmware_identity/port_test.c Source/Internal/shared_ump.c `
  -o Bin/FirmwareIdentity/port_test.exe
./Bin/FirmwareIdentity/port_test.exe
python tests/ump_logger/test_firmware_image.py
python tests/ump_logger/run_test.py
python tests/ump_logger/run_init_test.py

Проверены полный TI build 167, формат SCI8, host-тесты протокола и регистратора, общие тесты identity/SHA, компиляция общего C-кода TI C28x без FPU и ARM Cortex-M4. Это не аппаратная проверка TMS2812/STM32 и не полноценная сборка другого проекта. Физическое чтение нового окна версии и проверку после загрузки нужно выполнить на стенде. В SETGUI на вкладке «Загрузка / запуск / прошивка» доступны «Прочитать версию с платы» и «Проверить файл»: показаны SemVer, дата UTC, Build ID и сравнение с выбранным BIN. Для проверки файла держите рядом его .bin.manifest.json; GUI проверяет product/target, размер и SHA-256 и повторяет проверку перед передачей. BIN без паспорта отмечается как непроверенный старый образ; неверный паспорт блокирует загрузку. После RESET прочитайте версию снова.