forked from xuos/xiuos
Optimize OTA information structure and flash_write function
This commit is contained in:
@@ -369,17 +369,35 @@ struct InitSequenceDesc _board_init[] =
|
||||
#ifdef BSP_USING_OTA
|
||||
static void OtaCmd(void)
|
||||
{
|
||||
int32_t Size;
|
||||
int32_t size;
|
||||
ota_info_t ota_info;
|
||||
|
||||
FLASH_Init();
|
||||
UartConfig();
|
||||
UpdateOTAStatus(OTA_STATUS_DOWNLOADING);
|
||||
Size = SerialDownload(DOWN_FLAH_ADDRESS);
|
||||
UpdateOTAStatus(OTA_STATUS_DOWNLOADED);
|
||||
if(Size > 0)
|
||||
|
||||
memcpy(&ota_info, (const void *)FLAG_FLAH_ADDRESS,sizeof(ota_info_t));
|
||||
ota_info.status = OTA_STATUS_DOWNLOADING;
|
||||
UpdateOTAFlag(&ota_info);
|
||||
size = SerialDownload(DOWN_FLAH_ADDRESS);
|
||||
ota_info.status = OTA_STATUS_DOWNLOADED;
|
||||
UpdateOTAFlag(&ota_info);
|
||||
if(size > 0)
|
||||
{
|
||||
UpdateOTAFlag(Size, 0x11223344, OTA_STATUS_READY, "OTA Test!","No error!");
|
||||
ota_info.down.size = size;
|
||||
ota_info.down.crc32= calculate_crc32(DOWN_FLAH_ADDRESS, size);
|
||||
ota_info.down.version = 0x11223344;
|
||||
strncpy(ota_info.down.description, "OTA Test!",sizeof(ota_info.down.description));
|
||||
ota_info.status = OTA_STATUS_READY;
|
||||
strncpy(ota_info.error_message, "Download the firmware to the download partition successfully!",sizeof(ota_info.error_message));
|
||||
UpdateOTAFlag(&ota_info);
|
||||
}
|
||||
else
|
||||
{
|
||||
ota_info.status = OTA_STATUS_ERROR;
|
||||
strncpy(ota_info.error_message, "Failed to download firmware to download partition!",sizeof(ota_info.error_message));
|
||||
UpdateOTAFlag(&ota_info);
|
||||
}
|
||||
|
||||
FLASH_DeInit();
|
||||
|
||||
__set_FAULTMASK(1);
|
||||
@@ -437,4 +455,10 @@ void InitBoardHardware()
|
||||
}
|
||||
KPrintf("board init done.\n");
|
||||
KPrintf("start kernel...\n");
|
||||
|
||||
#ifdef BSP_USING_OTA
|
||||
FLASH_Init();
|
||||
//跳转成功将对应跳转失败标志清零
|
||||
FLASH_DeInit();
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -684,7 +684,7 @@ status_t FLASH_Read(uint32_t addr, uint32_t *buf, uint32_t len)
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>Flashָ<68><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵĿռ<C4BF>
|
||||
* <20><> <20><>: addr:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||||
byte_cnt:Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>,<2C><>4k<34>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
||||
* <20><> <20><> ֵ: None
|
||||
* <20><> <20><> ֵ: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>гɹ<EFBFBD><EFBFBD><EFBFBD>״ֵ̬Ϊ kStatus_Success<73><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״ֵ̬Ϊ<D6B5><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* ע <20><>: <20><><EFBFBD><EFBFBD>4k<34>ֽڵģ<DAB5>Ҳ<EFBFBD><D2B2>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4k<34>ֽ<EFBFBD>
|
||||
*******************************************************************************/
|
||||
status_t flash_erase(uint32_t start_addr, uint32_t byte_cnt)
|
||||
@@ -708,16 +708,30 @@ status_t flash_erase(uint32_t start_addr, uint32_t byte_cnt)
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><> <20><> <20><>: flash_write
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>FLASH_WritePage<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>дFlashһ<EFBFBD><EFBFBD>ҳ
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>flash<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַд<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><> <20><>: addr:д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||||
buf:<3A><><EFBFBD>ݴ洢<DDB4><E6B4A2>
|
||||
len:Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>(<28><><EFBFBD><EFBFBD>256)
|
||||
byte_cnt:Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
||||
* <20><> <20><> ֵ: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>гɹ<D0B3><C9B9><EFBFBD>״ֵ̬Ϊ kStatus_Success<73><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״ֵ̬Ϊ<D6B5><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* ע <20><>: <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʼд<CABC><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>256<35>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
*******************************************************************************/
|
||||
status_t flash_write(uint32_t start_addr, uint8_t *buf, uint32_t byte_cnt)
|
||||
{
|
||||
return FLASH_WritePage(start_addr, (void *)buf, byte_cnt);
|
||||
uint32_t size;
|
||||
status_t status;
|
||||
while(byte_cnt > 0)
|
||||
{
|
||||
size = byte_cnt > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE : byte_cnt;
|
||||
status = FLASH_WritePage(start_addr, (void *)buf, size);
|
||||
if(status != kStatus_Success)
|
||||
{
|
||||
return status;
|
||||
}
|
||||
start_addr += size;
|
||||
buf += size;
|
||||
byte_cnt -= size;
|
||||
}
|
||||
|
||||
return kStatus_Success;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ static const uint32_t crc32tab[] = {
|
||||
len:<3A><>ʾ<EFBFBD><CABE>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>CRC32<33><32><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
||||
* <20><> <20><> ֵ: <20><><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>CRC32ֵ
|
||||
*******************************************************************************/
|
||||
static uint32_t calculate_crc32(uint32_t addr, uint32_t len)
|
||||
uint32_t calculate_crc32(uint32_t addr, uint32_t len)
|
||||
{
|
||||
uint32_t crc = 0xFFFFFFFF;
|
||||
uint8_t byte = 0xFF;
|
||||
@@ -114,52 +114,26 @@ static uint32_t calculate_crc32(uint32_t addr, uint32_t len)
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><> <20><> <20><>: UpdateOTAStatus
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>OTA<54><41>״̬<D7B4><CCAC>Ϣ
|
||||
* <20><> <20><>: status:<3A><>Ҫ<EFBFBD><D2AA><EFBFBD>ĵ<EFBFBD>״ֵ̬
|
||||
* <20><> <20><> ֵ: <20><>
|
||||
*******************************************************************************/
|
||||
void UpdateOTAStatus(ota_status_t status)
|
||||
{
|
||||
ota_info_t ota_info;
|
||||
|
||||
//<2F><>Flash<73>ж<EFBFBD>ȡOTA<54><41>Ϣ
|
||||
memcpy(&ota_info, (const void *)FLAG_FLAH_ADDRESS,sizeof(ota_info_t));
|
||||
ota_info.status = status;
|
||||
flash_erase(FLAG_FLAH_ADDRESS,sizeof(ota_info_t));
|
||||
flash_write(FLAG_FLAH_ADDRESS,(void *)&ota_info,sizeof(ota_info_t));
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><> <20><> <20><>: UpdateOTAFlag
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>OTA Flag<61><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>汾<EFBFBD><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>app<70><70><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>
|
||||
* <20><> <20><>: app_size:<3A>µĹ̼<C4B9><CCBC>Ĵ<EFBFBD>С,<2C><>λ<EFBFBD>ֽ<EFBFBD>
|
||||
version:<3A>µĹ̼<C4B9><CCBC>İ汾
|
||||
status:OTA<54><41>״̬<D7B4><CCAC>Ϣ
|
||||
description:<3A>°汾<C2B0>Ĺ̼<C4B9><CCBC><EFBFBD><EFBFBD><EFBFBD>
|
||||
error_message:<3A><><EFBFBD>¹<EFBFBD><C2B9><EFBFBD><EFBFBD>д洢<D0B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
* <20><> <20><> ֵ: <20><>
|
||||
* <20><> <20><>: ptr:ota_info_t<5F>ṹ<EFBFBD><E1B9B9>ָ<EFBFBD><D6B8>,<2C><><EFBFBD><EFBFBD>OTA<54><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
* <20><> <20><> ֵ: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>гɹ<D0B3><C9B9><EFBFBD>״ֵ̬Ϊ kStatus_Success<73><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״ֵ̬Ϊ<D6B5><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*******************************************************************************/
|
||||
void UpdateOTAFlag(uint32_t app_size, uint32_t version, uint32_t status, uint8_t* description, uint8_t* error_message)
|
||||
status_t UpdateOTAFlag(ota_info_t *ptr)
|
||||
{
|
||||
ota_info_t ota_info; // <20><><EFBFBD><EFBFBD>OTA<54><41>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||||
status_t status;
|
||||
|
||||
// <20><>Flash<73>ж<EFBFBD>ȡOTA<54><41>Ϣ
|
||||
memcpy(&ota_info, (const void *)FLAG_FLAH_ADDRESS,sizeof(ota_info_t));
|
||||
ota_info.app_size = app_size;
|
||||
ota_info.crc = calculate_crc32(DOWN_FLAH_ADDRESS, app_size);
|
||||
ota_info.version = version;
|
||||
strncpy(ota_info.description, description,sizeof(ota_info.description));
|
||||
ota_info.status = status;
|
||||
strncpy(ota_info.error_message, error_message,sizeof(ota_info.error_message));
|
||||
status = flash_erase(FLAG_FLAH_ADDRESS,sizeof(ota_info_t));
|
||||
if(status != kStatus_Success)
|
||||
{
|
||||
return status;
|
||||
}
|
||||
status = flash_write(FLAG_FLAH_ADDRESS,(void *)ptr,sizeof(ota_info_t));
|
||||
|
||||
flash_erase(FLAG_FLAH_ADDRESS,sizeof(ota_info_t));
|
||||
flash_write(FLAG_FLAH_ADDRESS,(void *)&ota_info,sizeof(ota_info_t));
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><> <20><> <20><>: UpdateApplication
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>bootloader<65><72><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>,<2C><><EFBFBD><EFBFBD>Flash<73><68>Flag<61><67><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>а汾<D0B0><E6B1BE><EFBFBD><EFBFBD>
|
||||
@@ -179,61 +153,44 @@ void UpdateApplication(void)
|
||||
if(ota_info.status == OTA_STATUS_READY)
|
||||
{
|
||||
Serial_PutString("\r\n------Start to update the app!------\r\n");
|
||||
// У<><D0A3><EFBFBD>̼<EFBFBD>CRC
|
||||
if(calculate_crc32(DOWN_FLAH_ADDRESS, ota_info.app_size) == ota_info.crc)
|
||||
// У<><D0A3>downlad<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̼<EFBFBD>CRC
|
||||
if(calculate_crc32(DOWN_FLAH_ADDRESS, ota_info.down.size) == ota_info.down.crc32)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD>CRCУ<43><D0A3>ͨ<EFBFBD><CDA8>,<2C><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>,<2C><><EFBFBD>ֽڰ<D6BD><DAB0><EFBFBD>
|
||||
UpdateOTAStatus(OTA_STATUS_UPDATING);
|
||||
status = flash_copy(XIUOS_FLAH_ADDRESS,BAKUP_FLAH_ADDRESS,ota_info.app_size);
|
||||
if(status != kStatus_Success)
|
||||
ota_info.status = OTA_STATUS_UPDATING;
|
||||
UpdateOTAFlag(&ota_info);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>download<61><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>XiUOS System<65><6D><EFBFBD><EFBFBD>
|
||||
status = flash_copy(DOWN_FLAH_ADDRESS, XIUOS_FLAH_ADDRESS, ota_info.down.size);
|
||||
if((status == kStatus_Success) &&(calculate_crc32(XIUOS_FLAH_ADDRESS, ota_info.down.size) == ota_info.down.crc32))
|
||||
{
|
||||
Serial_PutString("------Backup app failed!------\r\n");
|
||||
goto finish;
|
||||
Serial_PutString("\r\n------The download partition is copied successfully!------\r\n");
|
||||
|
||||
ota_info.os.size = ota_info.down.size;
|
||||
ota_info.os.crc32 = ota_info.down.crc32;
|
||||
ota_info.os.version = ota_info.down.version;
|
||||
strncpy(ota_info.os.description, ota_info.down.description, sizeof(ota_info.down.description));
|
||||
ota_info.status == OTA_STATUS_IDLE; // <20><><EFBFBD><EFBFBD>download<61><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>XiUOS System<65><6D><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>,<2C><>OTA<54><41><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>ΪIDLE
|
||||
UpdateOTAFlag(&ota_info);
|
||||
}
|
||||
status = flash_copy(DOWN_FLAH_ADDRESS,XIUOS_FLAH_ADDRESS,ota_info.app_size);
|
||||
if(status != kStatus_Success)
|
||||
else
|
||||
{
|
||||
Serial_PutString("------Firmware partition copy failed!------\r\n");
|
||||
Serial_PutString("\r\n------The download partition copy failed!------\r\n");
|
||||
ota_info.status = OTA_STATUS_ERROR;
|
||||
strncpy(ota_info.error_message, "The download partition copy failed!",sizeof(ota_info.error_message));
|
||||
UpdateOTAFlag(&ota_info);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
// У<><D0A3><EFBFBD><EFBFBD><EFBFBD>ƺ<EFBFBD><C6BA>Ĺ̼<C4B9>CRC
|
||||
if(calculate_crc32(XIUOS_FLAH_ADDRESS, ota_info.app_size) == ota_info.crc)
|
||||
{
|
||||
ota_info.status = OTA_STATUS_IDLE; // <20><>OTA<54><41><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>ΪIDLE
|
||||
memset(ota_info.error_message,0,sizeof(ota_info.error_message)); // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>º<EFBFBD><C2BA><EFBFBD>OTA<54><41>Ϣд<CFA2><D0B4>Flash<73><68>
|
||||
flash_erase(FLAG_FLAH_ADDRESS,sizeof(ota_info_t));
|
||||
flash_write(FLAG_FLAH_ADDRESS,(void *)&ota_info,sizeof(ota_info_t));
|
||||
Serial_PutString("\r\n------Update completed!------\r\n");
|
||||
goto finish;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƺ<EFBFBD><C6BA>Ĺ̼<C4B9>CRCУ<43><D0A3>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
ota_info.status = OTA_STATUS_ERROR; // <20><>OTA<54><41><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>ΪERROR
|
||||
memset(ota_info.error_message,0,sizeof(ota_info.error_message));
|
||||
snprintf((char *)ota_info.error_message, sizeof(ota_info.error_message), "APP Firmware CRC check failed!"); // <20><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>º<EFBFBD><C2BA><EFBFBD>OTA<54><41>Ϣд<CFA2><D0B4>Flash<73><68>
|
||||
flash_erase(FLAG_FLAH_ADDRESS,sizeof(ota_info_t));
|
||||
flash_write(FLAG_FLAH_ADDRESS,(void *)&ota_info,sizeof(ota_info_t));
|
||||
Serial_PutString("\r\n------APP Firmware CRC check failed!------\r\n");
|
||||
goto finish;
|
||||
}
|
||||
Serial_PutString("\r\n------Update completed!------\r\n");
|
||||
goto finish;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD>CRCУ<43><D0A3>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
ota_info.status = OTA_STATUS_ERROR; // <20><>OTA<54><41><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>ΪERROR
|
||||
memset(ota_info.error_message,0,sizeof(ota_info.error_message));
|
||||
snprintf((char *)ota_info.error_message, sizeof(ota_info.error_message), "Download Firmware CRC check failed"); // <20><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>º<EFBFBD><C2BA><EFBFBD>OTA<54><41>Ϣд<CFA2><D0B4>Flash<73><68>
|
||||
flash_erase(FLAG_FLAH_ADDRESS,sizeof(ota_info_t));
|
||||
flash_write(FLAG_FLAH_ADDRESS,(void *)&ota_info,sizeof(ota_info_t));
|
||||
// <20><><EFBFBD><EFBFBD>download<EFBFBD><EFBFBD><EFBFBD><EFBFBD>CRCУ<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>
|
||||
Serial_PutString("\r\n------Download Firmware CRC check failed!------\r\n");
|
||||
ota_info.status = OTA_STATUS_ERROR;
|
||||
strncpy(ota_info.error_message, "Download Firmware CRC check failed!",sizeof(ota_info.error_message));
|
||||
UpdateOTAFlag(&ota_info);
|
||||
goto finish;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,27 +26,43 @@
|
||||
#include "flash.h"
|
||||
#include "ymodem.h"
|
||||
|
||||
|
||||
/* OTA升级过程中的状态描述 */
|
||||
typedef enum {
|
||||
OTA_STATUS_IDLE = 0, // 空闲状态,没有进行OTA升级
|
||||
OTA_STATUS_READY, // 准备状态,可以进行OTA升级
|
||||
OTA_STATUS_DOWNLOADING, // 正在下载固件
|
||||
OTA_STATUS_DOWNLOADED, // 固件下载完成,可以进行升级
|
||||
OTA_STATUS_UPDATING, // 正在进行OTA升级
|
||||
OTA_STATUS_ERROR, // 出现错误,升级失败
|
||||
OTA_STATUS_IDLE = 0, // 空闲状态,没有进行OTA升级
|
||||
OTA_STATUS_READY, // 准备状态,可以进行OTA升级
|
||||
OTA_STATUS_DOWNLOADING, // 正在下载固件
|
||||
OTA_STATUS_DOWNLOADED, // 固件下载完成,可以进行升级
|
||||
OTA_STATUS_UPDATING, // 正在进行OTA升级
|
||||
OTA_STATUS_ERROR, // 出现错误,升级失败
|
||||
} ota_status_t;
|
||||
|
||||
|
||||
/* Flash分区中保存固件的属性描述 */
|
||||
typedef struct {
|
||||
uint32_t app_size; // 应用程序大小
|
||||
uint32_t crc; // 应用程序CRC校验值
|
||||
uint32_t version; // 应用程序版本号
|
||||
uint32_t status; // 升级状态
|
||||
uint8_t description[64]; // 应用程序升级说明,最多64个字符
|
||||
uint8_t error_message[64]; // 错误信息,最多64个字符
|
||||
uint32_t size; // 应用程序大小,记录分区固件的大小
|
||||
uint32_t crc32; // 应用程序CRC32校验值,记录分区固件的crc32值
|
||||
uint32_t version; // 应用程序版本号,记录分区固件的版本号
|
||||
uint32_t reserve; // 保留字段
|
||||
uint8_t description[128]; // 固件的描述信息,最多128个字符
|
||||
} firmware_t;
|
||||
|
||||
|
||||
/* OTA升级过程中的信息结构体 */
|
||||
typedef struct {
|
||||
firmware_t os; // XiUOS System分区属性信息
|
||||
firmware_t bak; // Bakup分区属性信息
|
||||
firmware_t down; // Download分区属性信息
|
||||
uint32_t status; // 升级状态,取值来自于ota_status_t类型
|
||||
uint32_t initversion; // 恢复出厂设置的标志,0xFFFFFFFF代表未烧写过,烧写过以后设置为0x12345678
|
||||
uint32_t jumpfailed; // bootloaer跳转失败的标志,bootloader里置0xabababab,跳转成功后置0x00000000
|
||||
uint32_t reserve; // 保留字段
|
||||
uint8_t error_message[128]; // 错误信息,最多128个字符
|
||||
} ota_info_t;
|
||||
|
||||
|
||||
void UpdateOTAStatus(ota_status_t status);
|
||||
void UpdateOTAFlag(uint32_t app_size, uint32_t version, uint32_t status, uint8_t* description, uint8_t* error_message);
|
||||
uint32_t calculate_crc32(uint32_t addr, uint32_t len);
|
||||
status_t UpdateOTAFlag(ota_info_t *ptr);
|
||||
void UpdateApplication(void);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user