Добавить защищённое обновление приложения через RS и CAN с сохранением загрузчика, проверкой CRC, восстановлением передачи и защитой EEPROM. Подключить общий процесс сборки C2000 и автоматический счётчик версии для согласованных RAM, Flash, CAN и паспортов бинарных образов. Уточнить запуск ЦАП, обработку измерений и параметров нагрузки, начальную индикацию и документацию регистров GAS. Дополнить модели аппаратуры и изолировать заголовки CAN в тестах. Проверка: 26 тестов выпуска, 4 теста восстановления CAN и восемь программных моделей CAN, Flash, EEPROM, ЦАП, параметров и TESTLAMP.
42 lines
6.1 KiB
C
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. */
|