Обновление
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 "SystemDelayInterface.h"
|
||||||
#include "DeviceStorage.h"
|
#include "DeviceStorage.h"
|
||||||
#include "BootJump.h"
|
#include "BootJump.h"
|
||||||
|
#include "FirmwareLoader.h"
|
||||||
|
|
||||||
#define BOOT_AREA_LENGTH (256 * 1024) // Размер загрузчика
|
#define BOOT_AREA_LENGTH (256 * 1024) // Размер загрузчика
|
||||||
#define FIRMWARE_MAIN_AREA_LENGTH (512 * 1024) // Размер основной программы
|
#define FIRMWARE_MAIN_AREA_LENGTH (512 * 1024) // Размер основной программы
|
||||||
#define FIRMWARE_MAIN_ADDR (0x01000000 + BOOT_AREA_LENGTH) // Адрес основной программы
|
#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 {
|
typedef struct {
|
||||||
tLoggerToSerialPort slog;
|
tLoggerToSerialPort slog;
|
||||||
tDeviceStorage storage;
|
tDeviceStorage storage;
|
||||||
|
tFirmwareLoader FIRMWARE_HVAC;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
osThreadId_t id;
|
osThreadId_t id;
|
||||||
|
|
@ -77,7 +79,7 @@ static _Noreturn void MainTransmitter_Thread(tBootMma *env) {
|
||||||
&SERIAL_PORTS.SerialPortLog_IO,
|
&SERIAL_PORTS.SerialPortLog_IO,
|
||||||
&RTCS.rtcI0,
|
&RTCS.rtcI0,
|
||||||
SERIAL_LOGGER_SHOW_TIME | SERIAL_LOGGER_SHOW_AUTHOR | SERIAL_LOGGER_SHOW_LOG_LEVEL,
|
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")
|
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_param.logger = &env->slog.logger;
|
||||||
NVM_STORAGE.nf_storage_calib.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,
|
// bool result = DeviceStorage_Init(&env->storage, true, &NVM_STORAGE.interface_calib, &NVM_STORAGE.interface_param,
|
||||||
// &env->slog.logger);
|
// &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);
|
BootJumpToAddress(FIRMWARE_MAIN_ADDR);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
|
||||||
|
|
@ -164,6 +164,12 @@
|
||||||
"repo": "HVAC_M7_StatusData"
|
"repo": "HVAC_M7_StatusData"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"type": "git",
|
||||||
|
"provider": "HVAC_M7",
|
||||||
|
"repo": "FirmwareLoader_Flagchip_FC7240"
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"type": "local",
|
"type": "local",
|
||||||
"dir": "APP"
|
"dir": "APP"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue