diff --git a/APP/FC7240_flash.ld b/APP/FC7240_flash.ld index 5b52032..46ce599 100644 --- a/APP/FC7240_flash.ld +++ b/APP/FC7240_flash.ld @@ -68,9 +68,6 @@ SECTIONS { __ram_boot_meta_start = .; - KEEP(*(.meta_fw_crc)) - LONG(_FirmwareSize - _MetadataSize) ; /* word with firmware_size */ - KEEP(*(.meta_fw_name_size)) KEEP(*(.meta_fw_name)) diff --git a/APP/main.c b/APP/main.c index 6a9681f..18a73a7 100644 --- a/APP/main.c +++ b/APP/main.c @@ -14,14 +14,19 @@ #include "FirmwareLoader.h" #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_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 { tLoggerToSerialPort slog; tDeviceStorage storage; tFirmwareLoader FIRMWARE_HVAC; + tFirmwareLoader FIRMWARE_CALIB_HVAC; struct { osThreadId_t id; @@ -102,6 +107,12 @@ static _Noreturn void MainTransmitter_Thread(tBootMma *env) { // &env->slog.logger); + +//начало=================================================MAIN================================================================= +//начало=================================================MAIN================================================================= +//начало=================================================MAIN================================================================= + + FirmwareLoader_Init(&env->FIRMWARE_HVAC, FIRMWARE_MAIN_AREA_LENGTH, FIRMWARE_MAIN_ADDR, FIRMWARE_MAIN_UPDATE_ADDR); @@ -135,13 +146,13 @@ static _Noreturn void MainTransmitter_Thread(tBootMma *env) { // !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") + LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Update firmware detected") + 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 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); BootJumpToAddress(FIRMWARE_MAIN_ADDR);