Обеспечь единый процесс обновления для STM32F103/F407/G474 и TMS320F2812/F28335: discovery, служебные ответы, BUSY, тайм-аут сессии и подтверждение приложения. Добавь самостоятельные проекты CCS, аппаратные хранилища и Python-клиент. Совместимость: структуры конфигурации и порта расширены, поэтому потребители должны пересобраться и обнулить новые поля. Для C28x callbacks используют pcan_boot_byte_t; периодический pcan_boot_poll обслуживает discovery и настроенный тайм-аут.
208 lines
16 KiB
Markdown
208 lines
16 KiB
Markdown
# Отдельные проекты CCS: F28335 и F2812
|
||
|
||
Весь комплект находится внутри `templates/c/protocan-boot`: проекты CCS,
|
||
исходники загрузчиков, аппаратные порты, linker command files, необходимая
|
||
поддержка TI, CLI-сборка, тесты и документация. Зависимости от исходников
|
||
`28335_periph` и `BALZAM_167` при сборке отсутствуют. Требуется установленный
|
||
TI C2000 compiler с поддержкой **COFF ABI**; проверена версия **22.6.0.LTS**.
|
||
|
||
| Проект CCS | Контроллер | Обновляемая память | Схема |
|
||
| --- | --- | --- | --- |
|
||
| `ccs/f28335` — `F28335_CAN_AB` | TMS320F28335 | M95M02, 256 КиБ | A/B, trial, CONFIRM, rollback |
|
||
| `ccs/f2812` — `F2812_CAN_NOR` | TMS320F2812 / ПМ67 | AM29LV800BT-70EI, 1 МиБ, x16 | Один выделенный NOR-слот, проверяемый manifest, CAN recovery |
|
||
|
||
F2812 не использует EEPROM. Его карта, GPIO, частота CAN, допустимые адреса
|
||
приложения и состояние протокола отделены от F28335.
|
||
|
||
## Открытие в Code Composer Studio
|
||
|
||
1. **Project → Import CCS Projects**, каталог поиска — `c/protocan-boot/projects/ccs`.
|
||
2. Выбрать `F28335_CAN_AB` и `F2812_CAN_NOR`. Оставить проекты в исходном
|
||
расположении: **не включать Copy projects into workspace**, поскольку
|
||
переносимые ссылки `PCAN_ROOT` ведут к общей библиотеке выше проектов.
|
||
3. Выбрать **Debug** либо **Release**, затем **Build Project**. Оба проекта
|
||
содержат собственные `.project`, `.cproject`, `.ccsproject`.
|
||
4. OUT/MAP появятся в `ccs/<контроллер>/<Debug|Release>/`.
|
||
|
||
В `targetConfigs` сохранены существующие конфигурации Sauris SAU510:
|
||
F28335 — Iso Plus v.2, F2812 — Iso Plus. Для другого адаптера выбрать свой
|
||
Connection в Target Configuration. Компиляция и импорт не подключаются к JTAG
|
||
и не программируют плату.
|
||
|
||
Для отдельных workspace с ограниченными правами CCS допускает переменную
|
||
`TI_APPDATA_DIR` с доступным для записи каталогом. Это служебный cache IDE,
|
||
он не относится к исходникам загрузчиков.
|
||
|
||
## Сборка без запуска IDE
|
||
|
||
Из корня **templates**:
|
||
|
||
```powershell
|
||
python c/protocan-boot/projects/build.py --device f28335
|
||
python c/protocan-boot/projects/build.py --device f2812
|
||
python c/protocan-boot/projects/build.py --device f28335 --configuration Release
|
||
python c/protocan-boot/projects/build.py --device f2812 --configuration Release
|
||
```
|
||
|
||
Можно передать `--compiler <каталог-ti-cgt-c2000>` и `--output <каталог>`.
|
||
Скрипт читает состав исходников и настройки из этих же CCS-проектов, полностью
|
||
пересобирает их и проверяет реальные COFF LOAD-адреса официальным `ofd2000`.
|
||
Проверка отклоняет загружаемый RAM-код без Flash LOAD, пересечения, отсутствующие
|
||
boot branch/C entry, запись CSM/OTP и посторонних внутренних секторов.
|
||
Рядом с OUT сохраняются MAP, `build.log` и manifest с SHA-256.
|
||
|
||
Результаты:
|
||
|
||
- `ccs/f28335/Debug/F28335_CAN_AB.out`;
|
||
- `ccs/f2812/Debug/F2812_CAN_NOR.out`.
|
||
|
||
OUT — постоянный загрузчик для первоначальной установки через JTAG во
|
||
**внутреннюю Flash** соответствующего TMS. Образ самого приложения передаётся
|
||
по CAN в его внешнюю память. Для автоматического запуска должен быть выбран
|
||
внутренний Flash boot; у ПМ67 необходимо также учитывать штатную логику CPLD
|
||
выбора источника reset/boot из `big_dsp_module` платы.
|
||
|
||
## Prebuild/postbuild и копирование в SETGUI
|
||
|
||
В `.cproject` обоих проектов настроены **Debug и Release**. Prebuild вызывает
|
||
`projects/build.py --step prepare`: сохраняет UTC, Git-ревизию templates,
|
||
контроллер, конфигурацию и SHA-256 исходников в
|
||
`${BuildDirectory}/generated/canboot_build.json`. Это внешний паспорт сборки
|
||
загрузчика; номер версии приложения 167 не изменяется.
|
||
|
||
Postbuild вызывает тот же скрипт с `--step postbuild`. Он требует подготовку
|
||
той же конфигурации и неизменные исходники, проверяет фактические COFF LOAD-адреса,
|
||
C entry и аппаратный boot-переход через TI `ofd2000`, затем сохраняет OUT/MAP,
|
||
`.out.manifest.json`, `.out.sha256` и `firmware_identity.json` в локальном архиве
|
||
`${BuildDirectory}/firmware/HASH_дата_UTC+3`. Manifest содержит контроллер,
|
||
Debug/Release, назначение `canboot`, адреса проверки и SHA-256 точного OUT.
|
||
`firmware/latest_build.json` указывает текущие локальную и экспортированную папки.
|
||
|
||
Проверенный архив автоматически копируется в SETGUI по следующей схеме:
|
||
|
||
```text
|
||
SETGUI/..periph_28335/firmware/periph28335/balzam167/canboot/
|
||
28335/HASH_дата_UTC+3/F28335_CAN_AB.out
|
||
2812/HASH_дата_UTC+3/F2812_CAN_NOR.out
|
||
```
|
||
|
||
MAP, manifest, SHA-256 и метаданные лежат рядом с соответствующим OUT.
|
||
`..periph_28335` — буквальное имя существующего каталога SETGUI с двумя точками
|
||
в начале. Время имени папки берётся из prebuild; `+` после HASH означает изменения
|
||
в templates. Debug и Release имеют отдельные BuildDirectory и свои метаданные.
|
||
|
||
В **Project Properties → Build → Steps** команды уже заполнены для обеих
|
||
конфигураций. Пример для F28335 Debug, каждая команда вводится одной строкой:
|
||
|
||
```bat
|
||
python "${PROJECT_LOC}/../../build.py" --device f28335 --configuration Debug --compiler "${CG_TOOL_ROOT}" --output "${BuildDirectory}" --step prepare
|
||
python "${PROJECT_LOC}/../../build.py" --device f28335 --configuration Debug --compiler "${CG_TOOL_ROOT}" --output "${BuildDirectory}" --step postbuild --export "${PROJECT_LOC}/../../../../../../SETGUI/..periph_28335/firmware/periph28335/balzam167/canboot/28335"
|
||
```
|
||
|
||
Для F2812 используются `--device f2812` и конечная папка `2812`; для Release —
|
||
`--configuration Release`. При другом расположении SETGUI измените `--export`
|
||
в postbuild обеих конфигураций. Все пути с пробелами должны оставаться в кавычках.
|
||
CLI-сборка из раздела выше выполняет те же prepare/postbuild и копирует в эти же
|
||
каталоги; аргумент `--export <каталог>` переопределяет место копирования.
|
||
При ошибке компиляции, проверки OUT, отсутствии MAP или изменении исходников
|
||
после prebuild новый комплект в SETGUI не копируется. После изменения исходников
|
||
выполните **Rebuild Project**, чтобы обновить и OUT, и подготовку.
|
||
|
||
В диалоге SETGUI **Flash JTAG (OUT)** для установки постоянного загрузчика F28335
|
||
выбирайте `canboot/28335/HASH_дата_UTC+3/F28335_CAN_AB.out`.
|
||
`F2812_CAN_NOR.out` предназначен для JTAG соответствующего F2812.
|
||
Копирование файлов не запускает программирование платы и сетевую публикацию.
|
||
|
||
## F28335 / M95M02
|
||
|
||
Проект использует существующий порт и формат журнала без изменения адресов:
|
||
**PERIPH 0–31: Type = 1 + PERIPH / 16, Device ID = PERIPH mod 16**.
|
||
УМП1 — **1/5**, УМП2 — **1/6**, задатчик — **1/8**.
|
||
Product **0x2833**, HW **1**, CAN **250000 бит/с**. Приложение и загрузчик
|
||
используют один аппаратный номер платы; прежний общий адрес **3/7** отменён.
|
||
Код загрузчика — внутренний сектор A `0x338000..0x33FF7F`, boot — `0x33FFF6`.
|
||
Слоты M95M02 имеют по **130560 октетов**, параметры — прежние 258 октетов
|
||
по адресу `0x3FEFC`. Приложение загружается в RAM ниже CPU word-адреса `0xE000`.
|
||
|
||
После установки постоянного загрузчика новое приложение 167 передаётся
|
||
существующим клиентом SETGUI **CAN / ProtoCAN Boot**. Оно обязано содержать
|
||
hooks READY/CONFIRM и watchdog: пример интеграции реализован в ветке 167.
|
||
Без CONFIRM следующий reset возвращает подтверждённый active.
|
||
Полная последовательность — [документация порта F28335](../ports/tms320f28335/README.md).
|
||
|
||
## F2812 / AM29LV800BT
|
||
|
||
Профиль: **Device Type 3, Device ID 6, Product 0x2812, HW 1,
|
||
CAN 250000 бит/с, SYSCLKOUT 150 МГц**. CAN находится на **GPIOF6 TX / GPIOF7 RX**.
|
||
F2812 использует программную арифметику `rts2800_ml.lib`; F28335 — FPU32
|
||
и `rts2800_fpu32.lib`.
|
||
|
||
Внутренний сектор A загрузчика: `0x3F6000..0x3F7F7F`, boot — `0x3F7FF6`.
|
||
Внешняя NOR подключена по **CPU word-адресу `0x100000`**. Новый CAN-раздел
|
||
задан явно в `ports/tms320f2812/boot2812.h`:
|
||
|
||
| Область | CPU word-адреса включительно | Размер |
|
||
| --- | --- | ---: |
|
||
| Существующая нижняя область: прежние образы/параметры/FPGA | `0x100000..0x15FFFF` | 768 КиБ |
|
||
| Новый SCI8 CAN-образ: обычные сектора 12/13/14 | `0x160000..0x177FFF` | **192 КиБ** |
|
||
| Неизменяемые этим загрузчиком top-boot сектора 15/16/17 | `0x178000..0x17DFFF` | 48 КиБ |
|
||
| Новый manifest: последний top-boot сектор 18 | `0x17E000..0x17FFFF` | 16 КиБ |
|
||
|
||
Это **новое явное размещение CAN-образа**, а не автоматическое определение
|
||
свободного места в уже заполненном чипе. Перед первоначальной установкой
|
||
согласовать эти два выделенных участка с фактической картой NOR конкретной
|
||
платы. В известном исходнике FPGA начинается с `0x130000`, а новый CAN-слот
|
||
находится выше; драйвер не изменяет ничего ниже `0x160000` и в секторах 15–17.
|
||
|
||
После reset доступно **3 секунды** для ENTER_BOOT. Открытая сессия удерживает
|
||
загрузчик; пустой/повреждённый manifest оставляет CAN recovery постоянно.
|
||
Для обновления уже работающего приложения нужно войти в это окно после reset;
|
||
приложение F2812 само по себе пока не получает обработчик ENTER_BOOT от добавления
|
||
отдельного проекта загрузчика.
|
||
|
||
Перед записью требуется AMD manufacturer **`0x0001`**, device **`0x22DA`**.
|
||
Сначала стирается сектор manifest, затем три сектора образа. Запись проверяет
|
||
каждое слово. VERIFY повторно читает NOR, проверяет CRC32, SCI8, entry,
|
||
перекрытия и запрещённые назначения. COMMIT повторяет проверку, сохраняет
|
||
manifest с собственной CRC, два magic-слова публикуются последними.
|
||
Стирание сообщает BUSY каждые 250 мс, продлевая живую сессию.
|
||
|
||
Это single-slot схема: при обрыве обновления последнего CAN-образа остаётся
|
||
recovery, автоматический A/B rollback для F2812 не заявляется. Полное стирание
|
||
NOR, запись внутренней Flash по CAN и программирование FPGA отсутствуют.
|
||
|
||
Образ приложения — **TI SCI8 `AA 08`**, максимум **196608 октетов**. Старый
|
||
flat BIN основного контроллера автоматически не мигрируется. Допустимый payload:
|
||
|
||
- L0 `0x8000..0x8EFF`;
|
||
- H0 `0x3F8000..0x3F9FFF`;
|
||
- внешняя SRAM zone2 `0x80000..0xFFFFF`.
|
||
|
||
Стек M1, L1 `0x9000..0x9FFF`, RAM InitFlash `0x8F00..0x8FFF`, периферия,
|
||
внутренняя Flash и NOR не допускаются как назначения SCI8. `.ebss` приложения
|
||
может занять L1 после перехода в его C runtime; инициализированный payload
|
||
работающую RAM загрузчика перезаписывать не должен. Настройка приложения
|
||
F2812/его linker — отдельная от импорта загрузчика операция.
|
||
|
||
Геометрия x16, ID и команды AA/55/A0/80/30/F0 взяты из
|
||
[оригинального datasheet AMD Am29LV800B](https://cms.nacsemi.com/content/AuthDatasheets/FASLS02690-1.pdf).
|
||
Аппаратные GPIO/CPLD и XINTF-тайминги перенесены из действующих
|
||
`big_dsp_module.c` / `flash_tools.c` ПМ67, без зависимости от этих файлов при сборке.
|
||
|
||
## Проверки
|
||
|
||
```powershell
|
||
$env:CC = 'C:/msys64/ucrt64/bin/gcc.exe'
|
||
python c/protocan-boot/tests/run_tests.py
|
||
```
|
||
|
||
Проверяются протокол, CRC, сессии/BUSY, A/B F28335 с trial/rollback/CONFIRM,
|
||
NOR F2812 с настоящими AMD command cycles, ID, readback, запрещёнными секторами,
|
||
обрывами COMMIT, повреждением CRC/SCI8 и тайм-аутом DQ7.
|
||
Вариант с CMake/CTest также поддерживается.
|
||
|
||
Подтверждены реальные import/build обоих проектов в CCS 12.3, CLI-сборки
|
||
Debug/Release TI 22.6 COFF и проверки секций OUT. Физические JTAG/CAN/XINTF,
|
||
режим boot и поведение конкретной платы при отключении питания требуют стенда;
|
||
физическое программирование этим комплектом автоматически не выполнялось.
|