Обновление
This commit is contained in:
parent
b139a93058
commit
492ce42190
67
APP/main.c
67
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 (;;) {
|
||||
|
|
|
|||
|
|
@ -164,6 +164,12 @@
|
|||
"repo": "HVAC_M7_StatusData"
|
||||
},
|
||||
|
||||
{
|
||||
"type": "git",
|
||||
"provider": "HVAC_M7",
|
||||
"repo": "FirmwareLoader_Flagchip_FC7240"
|
||||
},
|
||||
|
||||
{
|
||||
"type": "local",
|
||||
"dir": "APP"
|
||||
|
|
|
|||
Loading…
Reference in New Issue