Обновление

This commit is contained in:
cfif 2026-04-22 15:19:28 +03:00
parent b139a93058
commit 492ce42190
2 changed files with 68 additions and 5 deletions

View File

@ -11,15 +11,17 @@
#include "SystemDelayInterface.h" #include "SystemDelayInterface.h"
#include "DeviceStorage.h" #include "DeviceStorage.h"
#include "BootJump.h" #include "BootJump.h"
#include "FirmwareLoader.h"
#define BOOT_AREA_LENGTH (256 * 1024) // Размер загрузчика #define BOOT_AREA_LENGTH (256 * 1024) // Размер загрузчика
#define FIRMWARE_MAIN_AREA_LENGTH (512 * 1024) // Размер основной программы #define FIRMWARE_MAIN_AREA_LENGTH (512 * 1024) // Размер основной программы
#define FIRMWARE_MAIN_ADDR (0x01000000 + BOOT_AREA_LENGTH) // Адрес основной программы #define FIRMWARE_MAIN_ADDR (0x01000000 + BOOT_AREA_LENGTH) // Адрес основной программы
#define FIRMWARE_MAIN_RECOVERY_ADDR (FIRMWARE_MAIN_ADDR + FIRMWARE_MAIN_AREA_LENGTH) // Адрес основной программы (восстановление) #define FIRMWARE_MAIN_UPDATE_ADDR 0x01100000 // Адрес основной программы (обновление)
typedef struct { typedef struct {
tLoggerToSerialPort slog; tLoggerToSerialPort slog;
tDeviceStorage storage; tDeviceStorage storage;
tFirmwareLoader FIRMWARE_HVAC;
struct { struct {
osThreadId_t id; osThreadId_t id;
@ -77,7 +79,7 @@ static _Noreturn void MainTransmitter_Thread(tBootMma *env) {
&SERIAL_PORTS.SerialPortLog_IO, &SERIAL_PORTS.SerialPortLog_IO,
&RTCS.rtcI0, &RTCS.rtcI0,
SERIAL_LOGGER_SHOW_TIME | SERIAL_LOGGER_SHOW_AUTHOR | SERIAL_LOGGER_SHOW_LOG_LEVEL, SERIAL_LOGGER_SHOW_TIME | SERIAL_LOGGER_SHOW_AUTHOR | SERIAL_LOGGER_SHOW_LOG_LEVEL,
1000 5
); );
@ -85,13 +87,68 @@ static _Noreturn void MainTransmitter_Thread(tBootMma *env) {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Initialization of subsystems") LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Initialization of subsystems")
StorageOnFlash_Init(&env->slog.logger); // StorageOnFlash_Init(&env->slog.logger);
NVM_STORAGE.nf_storage_param.logger = &env->slog.logger; // NVM_STORAGE.nf_storage_param.logger = &env->slog.logger;
NVM_STORAGE.nf_storage_calib.logger = &env->slog.logger; // NVM_STORAGE.nf_storage_calib.logger = &env->slog.logger;
// bool result = DeviceStorage_Init(&env->storage, true, &NVM_STORAGE.interface_calib, &NVM_STORAGE.interface_param, // bool result = DeviceStorage_Init(&env->storage, true, &NVM_STORAGE.interface_calib, &NVM_STORAGE.interface_param,
// &env->slog.logger); // &env->slog.logger);
FirmwareLoader_Init(&env->FIRMWARE_HVAC, FIRMWARE_MAIN_AREA_LENGTH, FIRMWARE_MAIN_ADDR,
FIRMWARE_MAIN_UPDATE_ADDR);
bool isMain = FirmwareLoader_CheckBlock(&env->FIRMWARE_HVAC, &env->FIRMWARE_HVAC.main);
if (isMain) {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware: Checksum is correct")
} else {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware: Checksum is not correct")
if (*env->FIRMWARE_HVAC.main.metadata.crc == 0) {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware: Checksum not found (The program may have been flashed using JTAG ?)")
}
}
bool isUpdate = FirmwareLoader_CheckBlock(&env->FIRMWARE_HVAC, &env->FIRMWARE_HVAC.update);
if (isUpdate) {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Recovery firmware: Checksum is correct")
} else {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Recovery firmware: Checksum is not correct")
}
// Есть обновление
if (isUpdate) {
// Если текущая прошивка (isMain) неисправна (не загружена) или в секции обновления находится отличная от текущей прошивка
bool isNewFirmware = FirmwareLoader_IsUpdateAndMainAreDifferent(&env->FIRMWARE_HVAC);
// !isMain - Не совпадает crc основной прошивки isNewFirmware - есть рабочая прошивка в обновлении, которая отличается от основной (main)
if ((!isMain) || (isNewFirmware)) {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Update detected")
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Starting the update process")
// Обновление
FirmwareLoader_CopyUpdateToMain(&env->FIRMWARE_HVAC);
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Update complete")
// Проверка crc
isMain = FirmwareLoader_CheckBlock(&env->FIRMWARE_HVAC, &env->FIRMWARE_HVAC.main);
if (isMain) {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware (after update): Checksum is correct")
} else {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware (after update): Checksum is not correct")
}
}
}
SystemDelayMs(10);
BootJumpToAddress(FIRMWARE_MAIN_ADDR); BootJumpToAddress(FIRMWARE_MAIN_ADDR);
for (;;) { for (;;) {

View File

@ -164,6 +164,12 @@
"repo": "HVAC_M7_StatusData" "repo": "HVAC_M7_StatusData"
}, },
{
"type": "git",
"provider": "HVAC_M7",
"repo": "FirmwareLoader_Flagchip_FC7240"
},
{ {
"type": "local", "type": "local",
"dir": "APP" "dir": "APP"