Обновление
This commit is contained in:
parent
c8496cb73d
commit
c39138f027
|
|
@ -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))
|
||||||
|
|
||||||
|
|
|
||||||
91
APP/main.c
91
APP/main.c
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue