From 2532ae43d4c9036af49255e8abc43e2025804525 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Mon, 8 May 2023 13:59:41 +0800 Subject: [PATCH] move version rollback function for OTA to tool dir --- .../XiZi_IIoT/board/xidatong-arm32/board.c | 4 +-- .../XiZi_IIoT/tool/bootloader/ota/ota.c | 33 +++++++++---------- .../XiZi_IIoT/tool/bootloader/ota/ota.h | 7 ++-- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/Ubiquitous/XiZi_IIoT/board/xidatong-arm32/board.c b/Ubiquitous/XiZi_IIoT/board/xidatong-arm32/board.c index 007d67690..614c8264c 100644 --- a/Ubiquitous/XiZi_IIoT/board/xidatong-arm32/board.c +++ b/Ubiquitous/XiZi_IIoT/board/xidatong-arm32/board.c @@ -413,8 +413,8 @@ void InitBoardHardware() KPrintf("board init done.\n"); KPrintf("start kernel...\n"); -#ifdef MCUBOOT_APPLICATION - /* Clear the lastjumpflag after the jump is successful.*/ +#ifdef TOOL_USING_OTA + //跳转成功设置lastjumpflag为JUMP_SUCCESS_FLAG app_clear_jumpflag(); #endif } diff --git a/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.c b/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.c index 31898cdb5..4e0416e19 100644 --- a/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.c +++ b/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.c @@ -123,7 +123,7 @@ static void UpdateApplication(void) ota_info_t ota_info; // 定义OTA信息结构体 // 从Flash中读取OTA信息 - memcpy(&ota_info, (const void *)FLAG_FLAH_ADDRESS,sizeof(ota_info_t)); + mcuboot.op_flash_read(FLAG_FLAH_ADDRESS, (void*)&ota_info, sizeof(ota_info_t)); // 如果OTA升级状态为准备状态,且APP分区与download分区版本不同,才可以进行升级 if((ota_info.status == OTA_STATUS_READY) && (ota_info.os.crc32 != ota_info.down.crc32)) @@ -233,7 +233,7 @@ static void BackupVersion(void) { status_t status; ota_info_t ota_info; - memcpy(&ota_info, (const void *)FLAG_FLAH_ADDRESS,sizeof(ota_info_t)); + mcuboot.op_flash_read(FLAG_FLAH_ADDRESS, (void*)&ota_info, sizeof(ota_info_t)); ota_info.status = OTA_STATUS_BACKUP; UpdateOTAFlag(&ota_info); @@ -244,7 +244,6 @@ static void BackupVersion(void) ota_info.os.size = ota_info.bak.size; ota_info.os.crc32 = ota_info.bak.crc32; ota_info.os.version = ota_info.bak.version; - ota_info.lastjumpflag = 0xABABABAB; strncpy(ota_info.os.description, ota_info.bak.description, sizeof(ota_info.bak.description)); UpdateOTAFlag(&ota_info); } @@ -268,19 +267,18 @@ static void BootLoaderJumpApp(void) { ota_info_t ota_info; mcuboot.flash_init(); - memcpy(&ota_info, (const void *)FLAG_FLAH_ADDRESS,sizeof(ota_info_t)); - if (ota_info.lastjumpflag != 0x00000000) + mcuboot.op_flash_read(FLAG_FLAH_ADDRESS, (void*)&ota_info, sizeof(ota_info_t)); + + if(ota_info.lastjumpflag == JUMP_FAILED_FLAG) { mcuboot.print_string("\r\n------Bootloader false, begin backup!------\r\n"); - BackupVersion(); - + BackupVersion(); } else { - ota_info.lastjumpflag = 0xABABABAB; + ota_info.lastjumpflag = JUMP_FAILED_FLAG; UpdateOTAFlag(&ota_info); } - mcuboot.flash_deinit(); mcuboot.op_jump(); } @@ -306,7 +304,7 @@ static status_t UpdateOTAFlag(ota_info_t *ptr) return status; } -#ifdef MCUBOOT_APPLICATION + /******************************************************************************* * 函 数 名: app_ota * 功能描述: 在app中通过命令来进行ota升级,该函数与升级的命令关联 @@ -321,7 +319,7 @@ static void app_ota(void) mcuboot.flash_init(); mcuboot.serial_init(); - memcpy(&ota_info, (const void *)FLAG_FLAH_ADDRESS,sizeof(ota_info_t)); + mcuboot.op_flash_read(FLAG_FLAH_ADDRESS, (void*)&ota_info, sizeof(ota_info_t)); ota_info.status = OTA_STATUS_DOWNLOADING; UpdateOTAFlag(&ota_info); size = mcuboot.download_by_serial(DOWN_FLAH_ADDRESS); @@ -348,25 +346,24 @@ static void app_ota(void) } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0),ota, app_ota, ota function); + /******************************************************************************* * 函 数 名: app_clear_jumpflag -* 功能描述: 跳转app成功后,在app中调用将lastjumpflag重置为0x00000000 +* 功能描述: 跳转app成功后,在app中调用将lastjumpflag重置为0XCDCDCDCD * 形 参: 无 * 返 回 值: 无 *******************************************************************************/ void app_clear_jumpflag(void) { mcuboot.flash_init(); - //跳转成功将对应跳转失败标志清零 + //跳转成功设置lastjumpflag为JUMP_SUCCESS_FLAG ota_info_t ota_info; - memcpy(&ota_info, (const void *)FLAG_FLAH_ADDRESS,sizeof(ota_info_t)); - ota_info.lastjumpflag = 0x00000000; + mcuboot.op_flash_read(FLAG_FLAH_ADDRESS, (void*)&ota_info, sizeof(ota_info_t)); + ota_info.lastjumpflag = JUMP_SUCCESS_FLAG; UpdateOTAFlag(&ota_info); mcuboot.flash_deinit(); } -#endif - /******************************************************************************* * 函 数 名: ota_entry @@ -414,7 +411,7 @@ void ota_entry(void) case 0x32: mcuboot.flash_init(); - memcpy(&ota_info, (const void *)FLAG_FLAH_ADDRESS,sizeof(ota_info_t)); + mcuboot.op_flash_read(FLAG_FLAH_ADDRESS, (void*)&ota_info, sizeof(ota_info_t)); /* 此时APP分区还没有有效的固件,需要在bootloader下通过iap烧写出厂固件 */ if((ota_info.os.size > APP_FLASH_SIZE) || (calculate_crc32(XIUOS_FLAH_ADDRESS, ota_info.os.size) != ota_info.os.crc32)) { diff --git a/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.h b/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.h index 7662b1702..1eab71bdb 100644 --- a/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.h +++ b/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.h @@ -17,6 +17,9 @@ #include "flash_ops.h" +#define JUMP_FAILED_FLAG 0XABABABAB +#define JUMP_SUCCESS_FLAG 0XCDCDCDCD + typedef enum { OTA_STATUS_IDLE = 0, // 空闲状态,没有进行OTA升级 OTA_STATUS_READY, // 准备状态,可以进行OTA升级 @@ -44,13 +47,11 @@ typedef struct { firmware_t bak; // Bakup分区属性信息 firmware_t down; // Download分区属性信息 uint32_t status; // 升级状态,取值来自于ota_status_t类型 - uint32_t lastjumpflag; // bootloaer跳转失败的标志,bootloader里置0xABABABAB,跳转成功后在应用里置0x00000000 + uint32_t lastjumpflag; // bootloaer跳转失败的标志,bootloader里置0xABABABAB,跳转成功后在应用里置0xCDCDCDCD uint32_t reserve[2]; // 保留字段 uint8_t error_message[128]; // 错误信息,最多128个字符 } ota_info_t; -#ifdef MCUBOOT_APPLICATION void app_clear_jumpflag(void); -#endif void ota_entry(void); #endif