Обновление

This commit is contained in:
cfif 2026-05-22 16:54:21 +03:00
parent 0915a5f9f5
commit b2c9e201cb
2 changed files with 65 additions and 49 deletions

View File

@ -106,8 +106,8 @@ static void Bsp_SCG_Init(void) {
.bLock = false, .bLock = false,
.bCm = false, .bCm = false,
.bTrEn = false, .bTrEn = false,
.bLpen = false, .bLpen = true,
.bSten = false, .bSten = true,
.eDivH = SCG_ASYNCCLOCKDIV_BY1, .eDivH = SCG_ASYNCCLOCKDIV_BY1,
.eDivM = SCG_ASYNCCLOCKDIV_BY1, .eDivM = SCG_ASYNCCLOCKDIV_BY1,
.eDivL = SCG_ASYNCCLOCKDIV_BY2, .eDivL = SCG_ASYNCCLOCKDIV_BY2,
@ -165,6 +165,14 @@ static void Bsp_PCC_Init(void) {
bSP_PCC_Config.eDivider = PCC_CLK_UNINVOLVED; bSP_PCC_Config.eDivider = PCC_CLK_UNINVOLVED;
PCC_SetPcc(&bSP_PCC_Config); PCC_SetPcc(&bSP_PCC_Config);
// PCC_CLK_WKU0
bSP_PCC_Config.eClockName = PCC_CLK_WKU0;
bSP_PCC_Config.bEn = true;
bSP_PCC_Config.eClkSrc = PCC_CLKGATE_UNINVOLVED;
bSP_PCC_Config.eDivider = PCC_CLK_UNINVOLVED;
PCC_SetPcc(&bSP_PCC_Config);
} }
void Bsp_Systick_Init(void) void Bsp_Systick_Init(void)

View File

@ -62,8 +62,6 @@ const DMA_InitType dmaInitCfg =
}; };
static _Noreturn void MainTransmitter_Thread(tBootMma *env) { static _Noreturn void MainTransmitter_Thread(tBootMma *env) {
DMA_Init(DMA_INSTANCE_0, &dmaInitCfg); DMA_Init(DMA_INSTANCE_0, &dmaInitCfg);
@ -90,6 +88,12 @@ 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")
if (RGM_SRS_WAKEUP_MASK == (RGM->SRS & RGM_SRS_WAKEUP_MASK)) {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "The bootloader is ignored (waking up)")
} else {
// 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;
@ -98,63 +102,66 @@ static _Noreturn void MainTransmitter_Thread(tBootMma *env) {
// &env->slog.logger); // &env->slog.logger);
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);
bool isMain = FirmwareLoader_CheckBlock(&env->FIRMWARE_HVAC, &env->FIRMWARE_HVAC.main); bool isMain = FirmwareLoader_CheckBlock(&env->FIRMWARE_HVAC, &env->FIRMWARE_HVAC.main);
if (isMain) { if (isMain) {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware: Checksum is correct") LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware: Checksum is correct")
} else { } else {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware: Checksum is not correct") LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Main firmware: Checksum is not correct")
if (*env->FIRMWARE_HVAC.main.metadata.crc == 0) { 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 ?)") 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")
} }
} }
} 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); SystemDelayMs(10);
BootJumpToAddress(FIRMWARE_MAIN_ADDR); BootJumpToAddress(FIRMWARE_MAIN_ADDR);
for (;;) { for (;;) {
LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Bootloader error")
SystemDelayMs(1000); SystemDelayMs(1000);
} }
} }
@ -171,6 +178,7 @@ int main(void) {
NVIC_SetPriorityGrouping(NVIC_PRIORITY_GROUP_4); NVIC_SetPriorityGrouping(NVIC_PRIORITY_GROUP_4);
osKernelInitialize(); osKernelInitialize();
tBootMma *env = &MAIN_BOOT_ENV; tBootMma *env = &MAIN_BOOT_ENV;