Files
Andrey 05be38a04a Обновить Flash/CAN, версии сборок и управление периферией
Добавить защищённое обновление приложения через RS и CAN с сохранением
загрузчика, проверкой CRC, восстановлением передачи и защитой EEPROM.
Подключить общий процесс сборки C2000 и автоматический счётчик версии
для согласованных RAM, Flash, CAN и паспортов бинарных образов.

Уточнить запуск ЦАП, обработку измерений и параметров нагрузки,
начальную индикацию и документацию регистров GAS.
Дополнить модели аппаратуры и изолировать заголовки CAN в тестах.

Проверка: 26 тестов выпуска, 4 теста восстановления CAN и восемь
программных моделей CAN, Flash, EEPROM, ЦАП, параметров и TESTLAMP.
2026-11-06 16:11:11 +03:00

42 lines
6.1 KiB
C

#define main upstream_regressions /* Использует аппаратную модель общей библиотеки без запуска её собственного main. */
#include "tests/test_f28335_can_boot.c" /* Подключает настоящий CAN-порт, EEPROM-store, широкие октеты и аппаратные заглушки общей библиотеки. */
#undef main /* Экспортирует транспорт для существующего Python-клиента SETGUI. */
__declspec(dllexport) void model_reset(void) /* Создаёт пустую EEPROM с контрольным заполнением области параметров. */
{ /* Между передачами EEPROM сохраняется; эта функция вызывается лишь перед всей серией. */
memset(memory, 0xA5, sizeof(memory)); running = 255U; fail_write = 0; /* Запуск без active-слота воспроизводит первичную установку CAN-загрузчика. */
F28335CanBoot_Init(8U); /* Инициализирует задатчик PERIPH 8 с адресом Type 1 / Device 8 и чистой EEPROM. */
} /* Дальнейшая передача использует неизменённый production parser. */
__declspec(dllexport) unsigned int model_frame(uint32_t id, const pcan_boot_byte_t *data, unsigned int dlc, uint32_t *reply_id, pcan_boot_byte_t *reply) /* Принимает один реальный CAN-кадр клиента и возвращает ответ аппаратного порта. */
{ /* Меняет только железо и подтверждение физического TX; код команд остаётся общим. */
unsigned int i; /* Декодирует восемь аппаратных октетов, переданных в регистры MBOX4. */
tx_busy = 0; /* Предыдущий ответ уже подтверждён моделью CAN-шины до следующего запроса. */
(void)pcan_boot_process(&boot, id, data, dlc); /* Выполняет production сессию, ограничения устройства, CRC и callbacks EEPROM. */
if (!tx_busy) return 0U; /* В середине окна из 16 блоков ответ по протоколу не требуется. */
*reply_id = ECanaMboxes.MBOX4.MSGID.all & 0x1FFFFFFFUL; /* Удаляет только аппаратный IDE-бит, сохраняя полный 29-битный ProtoCAN ID. */
for (i = 0; i < 4U; ++i) { /* В аппаратном DBO=0 младший октет MDL/MDH идёт первым. */
reply[i] = (ECanaMboxes.MBOX4.MDL.all >> (i * 8U)) & 255U; /* Возвращает октеты status, slot и next_block из реального передатчика. */
reply[i + 4U] = (ECanaMboxes.MBOX4.MDH.all >> (i * 8U)) & 255U; /* Возвращает CRC32 принятых production-данных без повторного вычисления в модели. */
} /* Завершает чтение ответного mailbox. */
return 8U; /* Все статусы Boot имеют DLC=8. */
} /* Python-клиент получит тот же статусный кадр, что на физическом CAN. */
__declspec(dllexport) unsigned int model_select(void) /* Воспроизводит выбор слота при очередном аппаратном reset. */
{ /* attempted и rollback сохраняются настоящим журналом, а не переменными Python. */
unsigned int slot; /* FF означает, что ни один образ не разрешён к запуску. */
if (!f28335_boot_select(&store, &slot)) return 254U; /* Отдельное значение позволяет отличить ошибку журнала от пустого recovery. */
return slot; /* Возвращает trial, active либо recovery согласно production-алгоритму. */
} /* Повтор без CONFIRM обязан вернуть предыдущий active. */
__declspec(dllexport) unsigned int model_confirm(unsigned int slot) /* Моделирует подтверждение запущенным RAM-приложением после его READY. */
{ /* Проверяет фактическую публикацию active в том же энергонезависимом журнале. */
return f28335_boot_confirm(&store, slot); /* Не позволяет подтвердить слот, который ещё не выбирался для пробного запуска. */
} /* Подтверждённый слот защищается от следующих записей. */
__declspec(dllexport) void model_reopen(void) /* Воспроизводит перезапуск автомата загрузчика без стирания EEPROM. */
{ /* Новая сессия читает актуальный журнал после confirm либо rollback. */
F28335CanBoot_Init(8U); /* После перезапуска сохраняет адрес задатчика и сбрасывает только RAM-сессию протокола. */
} /* Сами два образа и параметры сохраняются. */
__declspec(dllexport) unsigned int model_parameters_intact(void) /* Проверяет всю защищённую верхнюю область M95M02 после серии обновлений. */
{ /* Значение A5 было записано только перед тестом и не должно меняться загрузчиком. */
uint32_t i; /* Адреса EEPROM выражены в октетах. */
for (i = 0x3FE00UL; i < 0x40000UL; ++i) if (memory[i] != 0xA5U) return 0U; /* Проверяет резерв, 258 октетов параметров и последнее неиспользуемое слово. */
return 1U; /* Подтверждает отсутствие изменений за пределами двух слотов и журнала. */
} /* Завершает аппаратную модель реального клиента SETGUI. */