Обновление

This commit is contained in:
cfif 2026-05-28 12:35:21 +03:00
parent c8496cb73d
commit c39138f027
2 changed files with 86 additions and 8 deletions

View File

@ -68,9 +68,6 @@ SECTIONS
{ {
__ram_boot_meta_start = .; __ram_boot_meta_start = .;
KEEP(*(.meta_fw_crc))
LONG(_FirmwareSize - _MetadataSize) ; /* word with firmware_size */
KEEP(*(.meta_fw_name_size)) KEEP(*(.meta_fw_name_size))
KEEP(*(.meta_fw_name)) KEEP(*(.meta_fw_name))

View File

@ -14,14 +14,19 @@
#include "FirmwareLoader.h" #include "FirmwareLoader.h"
#define BOOT_AREA_LENGTH (128 * 1024) // Размер загрузчика #define BOOT_AREA_LENGTH (128 * 1024) // Размер загрузчика
#define FIRMWARE_MAIN_AREA_LENGTH ((704 + 192) * 1024) // Размер основной программы + калибровки #define FIRMWARE_MAIN_AREA_LENGTH (704 * 1024) // Размер основной программы
#define FIRMWARE_MAIN_ADDR (0x01000000 + BOOT_AREA_LENGTH) // Адрес основной программы #define FIRMWARE_MAIN_ADDR (0x01000000 + BOOT_AREA_LENGTH) // Адрес основной программы
#define FIRMWARE_MAIN_UPDATE_ADDR 0x01100000 // Адрес основной программы (обновление) #define FIRMWARE_MAIN_UPDATE_ADDR 0x01100000 // Адрес основной программы (обновление)
#define FIRMWARE_CALIB_AREA_LENGTH (192 * 1024) // Размер калибровки
#define FIRMWARE_CALIB_ADDR (0x01000000 + BOOT_AREA_LENGTH + FIRMWARE_MAIN_AREA_LENGTH) // Адрес калибровки
#define FIRMWARE_CALIB_UPDATE_ADDR (0x01100000 + FIRMWARE_MAIN_AREA_LENGTH) // Адрес калибровки (обновление)
typedef struct { typedef struct {
tLoggerToSerialPort slog; tLoggerToSerialPort slog;
tDeviceStorage storage; tDeviceStorage storage;
tFirmwareLoader FIRMWARE_HVAC; tFirmwareLoader FIRMWARE_HVAC;
tFirmwareLoader FIRMWARE_CALIB_HVAC;
struct { struct {
osThreadId_t id; osThreadId_t id;
@ -102,6 +107,12 @@ static _Noreturn void MainTransmitter_Thread(tBootMma *env) {
// &env->slog.logger); // &env->slog.logger);
//начало=================================================MAIN=================================================================
//начало=================================================MAIN=================================================================
//начало=================================================MAIN=================================================================
FirmwareLoader_Init(&env->FIRMWARE_HVAC, FIRMWARE_MAIN_AREA_LENGTH, FIRMWARE_MAIN_ADDR, FirmwareLoader_Init(&env->FIRMWARE_HVAC, FIRMWARE_MAIN_AREA_LENGTH, FIRMWARE_MAIN_ADDR,
FIRMWARE_MAIN_UPDATE_ADDR); FIRMWARE_MAIN_UPDATE_ADDR);
@ -135,13 +146,13 @@ static _Noreturn void MainTransmitter_Thread(tBootMma *env) {
// !isMain - Не совпадает crc основной прошивки isNewFirmware - есть рабочая прошивка в обновлении, которая отличается от основной (main) // !isMain - Не совпадает crc основной прошивки isNewFirmware - есть рабочая прошивка в обновлении, которая отличается от основной (main)
if ((!isMain) || (isNewFirmware)) { if ((!isMain) || (isNewFirmware)) {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Update detected") LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Update firmware detected")
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Starting the update process") LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Starting the update firmware process")
// Обновление // Обновление
// FirmwareLoader_CopyUpdateToMain(&env->FIRMWARE_HVAC); FirmwareLoader_CopyUpdateToMain(&env->FIRMWARE_HVAC);
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Update complete") LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Update firmware complete")
// Проверка crc // Проверка crc
isMain = FirmwareLoader_CheckBlock(&env->FIRMWARE_HVAC, &env->FIRMWARE_HVAC.main); isMain = FirmwareLoader_CheckBlock(&env->FIRMWARE_HVAC, &env->FIRMWARE_HVAC.main);
@ -155,7 +166,77 @@ static _Noreturn void MainTransmitter_Thread(tBootMma *env) {
} }
} }
//конец=================================================MAIN=================================================================
//конец=================================================MAIN=================================================================
//конец=================================================MAIN=================================================================
//начало=================================================CALIB=================================================================
//начало=================================================CALIB=================================================================
//начало=================================================CALIB=================================================================
FirmwareLoader_Init(&env->FIRMWARE_CALIB_HVAC, FIRMWARE_CALIB_AREA_LENGTH, FIRMWARE_CALIB_ADDR,
FIRMWARE_CALIB_UPDATE_ADDR);
isMain = FirmwareLoader_CheckBlock(&env->FIRMWARE_CALIB_HVAC, &env->FIRMWARE_CALIB_HVAC.main);
if (isMain) {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Calib firmware: Checksum is correct")
} else {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Calib firmware: Checksum is not correct")
if (*env->FIRMWARE_CALIB_HVAC.main.metadata.crc == 0) {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN,
"Calib firmware: Checksum not found (The program may have been flashed using JTAG ?)")
}
}
isUpdate = FirmwareLoader_CheckBlock(&env->FIRMWARE_CALIB_HVAC, &env->FIRMWARE_CALIB_HVAC.update);
if (isUpdate) {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Recovery Calib: Checksum is correct")
} else {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Recovery Calib: Checksum is not correct")
}
// Есть обновление
if (isUpdate) {
// Если текущая прошивка (isMain) неисправна (не загружена) или в секции обновления находится отличная от текущей прошивка
bool isNewFirmware = FirmwareLoader_IsUpdateAndMainAreDifferent(&env->FIRMWARE_CALIB_HVAC);
// !isMain - Не совпадает crc основной прошивки isNewFirmware - есть рабочая прошивка в обновлении, которая отличается от основной (main)
if ((!isMain) || (isNewFirmware)) {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Update calib detected")
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Starting the update calib process")
// Обновление
FirmwareLoader_CopyUpdateToMain(&env->FIRMWARE_CALIB_HVAC);
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Update calib complete")
// Проверка crc
isMain = FirmwareLoader_CheckBlock(&env->FIRMWARE_CALIB_HVAC, &env->FIRMWARE_CALIB_HVAC.main);
if (isMain) {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Calib firmware (after update): Checksum is correct")
} else {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN,
"Calib firmware (after update): Checksum is not correct")
}
}
}
//конец=================================================CALIB=================================================================
//конец=================================================CALIB=================================================================
//конец=================================================CALIB=================================================================
} }
SystemDelayMs(10); SystemDelayMs(10);
BootJumpToAddress(FIRMWARE_MAIN_ADDR); BootJumpToAddress(FIRMWARE_MAIN_ADDR);