# Отдельные проекты 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/<контроллер>//`. В `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 и поведение конкретной платы при отключении питания требуют стенда; физическое программирование этим комплектом автоматически не выполнялось.