From 492ce4219032b605d43cb7546fbf916dbfdea606 Mon Sep 17 00:00:00 2001 From: cfif Date: Wed, 22 Apr 2026 15:19:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APP/main.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++---- modular.json | 6 +++++ 2 files changed, 68 insertions(+), 5 deletions(-) diff --git a/APP/main.c b/APP/main.c index 1ca1684..75bbed5 100644 --- a/APP/main.c +++ b/APP/main.c @@ -11,15 +11,17 @@ #include "SystemDelayInterface.h" #include "DeviceStorage.h" #include "BootJump.h" +#include "FirmwareLoader.h" #define BOOT_AREA_LENGTH (256 * 1024) // Размер загрузчика #define FIRMWARE_MAIN_AREA_LENGTH (512 * 1024) // Размер основной программы #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 { tLoggerToSerialPort slog; tDeviceStorage storage; + tFirmwareLoader FIRMWARE_HVAC; struct { osThreadId_t id; @@ -77,7 +79,7 @@ static _Noreturn void MainTransmitter_Thread(tBootMma *env) { &SERIAL_PORTS.SerialPortLog_IO, &RTCS.rtcI0, 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") - StorageOnFlash_Init(&env->slog.logger); +// StorageOnFlash_Init(&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_param.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, // &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); for (;;) { diff --git a/modular.json b/modular.json index 3c0f53c..b845678 100644 --- a/modular.json +++ b/modular.json @@ -164,6 +164,12 @@ "repo": "HVAC_M7_StatusData" }, + { + "type": "git", + "provider": "HVAC_M7", + "repo": "FirmwareLoader_Flagchip_FC7240" + }, + { "type": "local", "dir": "APP"