From fc9967b37c19c8b5b72837b24c1f35678163ab64 Mon Sep 17 00:00:00 2001 From: WXK <287788329@qq.com> Date: 星期一, 30 六月 2025 14:49:07 +0800 Subject: [PATCH] OTAv3 加入传输完成的语音 --- keil/include/src/OTA.c | 160 +++++++++++++++++++++++++++++++--------------------- 1 files changed, 95 insertions(+), 65 deletions(-) diff --git a/keil/include/src/OTA.c b/keil/include/src/OTA.c index 9937e0f..0cb6782 100644 --- a/keil/include/src/OTA.c +++ b/keil/include/src/OTA.c @@ -19,13 +19,15 @@ #include "Internet.h" #include "mk_flash.h" #include "mk_trace.h" +#include <global_param.h> +#include <serial_at_cmd_app.h> /******************************************************************************* * Macro * *******************************************************************************/ -#define MAX_REQUEST_SIZE (30 * 1024) +#define MAX_REQUEST_SIZE (5 * 1024) #define APP2_ADRESS 0x0402f000 -#define APP_SIZE 0x04080000-APP2_ADRESS - +//#define APP_SIZE 0x04080000-APP2_ADRESS +#define APP_CONFIG_APPLICATION_SIZE 0x20000 //4K对齐 /******************************************************************************* * Type Definition * *******************************************************************************/ @@ -36,17 +38,24 @@ OTA_STATE_HTTP_REQUEST_DATA, OTA_STATE_WAIT_HTTP_RESPONSE, }E_OTAState; +typedef enum +{ + OTA_TYPE_MCU, + OTA_TYPE_MUSIC, +} E_OTAType; /******************************************************************************* * Local Variable * *******************************************************************************/ -static HIDO_CHAR l_acOTAUrl[128]; +static HIDO_UINT8 l_u8OTAType; +static HIDO_CHAR l_acOTAUrl[256]; static HIDO_UINT32 l_u32OTATimerID = 0; -static E_OTAState l_eOTAState = OTA_STATE_IDLE; +static volatile E_OTAState l_eOTAState = OTA_STATE_IDLE; static HIDO_UINT32 l_u32OTARetryCnt = 0; static HIDO_UINT32 l_u32OTAFileRecvLen = 0; static HIDO_UINT32 l_u32OTAFileSize = 0; - +static HIDO_UINT32 l_u32MusicWriteLen = 0; +static E_OTAType l_eOTAType = OTA_TYPE_MCU; /******************************************************************************* * Local Function Declaration * *******************************************************************************/ @@ -126,6 +135,7 @@ * Author : www.hido-studio.com * Modified Date: : 2020年9月13日 *******************************************************************************/ +uint8_t result1; static HIDO_INT32 OTA_HTTPGetFileCallBack(HIDO_UINT32 _u32RespCode, ST_HTTPGetFileResponse *_pstResponse, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len, HIDO_VOID *_pArg) { @@ -164,7 +174,7 @@ #if 0 SPIFlash_Write(SPI_FLASH_ID_0, APP_CONFIG_APP_DOWN_LOAD_SPIFLASH_ADDRESS + l_u32OTAFileRecvLen, _pu8Data, _u32Len); #else - flash_write_nbytes(FLASH_ID0, APP2_ADRESS + l_u32OTAFileRecvLen, _pu8Data, _u32Len); + flash_write_nbytes(FLASH_ID0, APP2_ADRESS + l_u32OTAFileRecvLen, _pu8Data, _u32Len); #endif l_u32OTAFileRecvLen += _u32Len; LOG_INFO(TRACE_MODULE_APP,"OTAFileDownload %u/%u\r\n", l_u32OTAFileRecvLen, l_u32OTAFileSize); @@ -172,19 +182,33 @@ /* 文件接收完成 */ if (l_u32OTAFileRecvLen == l_u32OTAFileSize) { + uint16_t tmp = 0; l_eOTAState = OTA_STATE_IDLE; HIDO_TimerCancel(l_u32OTATimerID); - // 执行到这里,已经完成文件的下载,可以执行下一步处理了 -//#if 0 -// HIDO_UINT16 tmp = 0xBBBB,result; -// SPIFlash_Erase(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP,2, SPI_FLASH_SECTOR_ERASE_MODE_4K); -// SPIFlash_Write(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP, (HIDO_UINT8*)&tmp, sizeof(tmp)); -//#endif - // HAL_Delay(10); - // Reboot(0); - - break; + // 执行到这里,已经完成文件的下载,可以执行下一步处理了 + if (OTA_TYPE_MUSIC == l_eOTAType) + { + tmp = 0xFFFF; + l_u32MusicWriteLen = 0; + DATA_CHANGE(); + } + else + { + tmp = 0xBBBB; + } + __disable_irq(); + result1=flash_open(FLASH_ID0,NULL); + if(!result1) + { + flash_erase(FLASH_ID0, APP_CONFIG_IAPFLAG_SECTOR_ADDR, FLASH_SECTOR_SIZE);//擦除APPFLAG + flash_write_nbytes(FLASH_ID0, APP_CONFIG_IAPFLAG_MAP, (uint8_t*)&tmp, sizeof(tmp)); + flash_erase(FLASH_ID0, APP_CONFIG_IAP_PARAM_MAP, FLASH_SECTOR_SIZE);//擦除APPFLAG + } + __enable_irq(); + delay_us(1000000); + NVIC_SystemReset(); //软复位回到bootloader + break; } OTA_RequestFileData(l_u32OTAFileRecvLen); @@ -205,6 +229,27 @@ return HIDO_OK; } + + +HIDO_VOID OTA_GetMusicPackData(HIDO_UINT8 *_pu8Data) +{ + flash_read(FLASH_ID0, APP2_ADRESS + l_u32MusicWriteLen, _pu8Data, 512); + l_u32MusicWriteLen += 512; +} + +HIDO_UINT16 OTA_GetMusicPackNum() +{ + if ((l_u32OTAFileSize % 512) != 0) + { + return (l_u32OTAFileSize / 512) + 1; + } + else + { + return l_u32OTAFileSize / 512; + } +} + + /******************************************************************************* * Function Name : OTA_Failed * Description : @@ -216,20 +261,18 @@ *******************************************************************************/ static HIDO_INT32 OTA_Failed(void) { - /* 升级参数有误,取消升级 */ - HIDO_UINT16 tmp = 0xFFFF; - -// HIDO_Debug("goto app application\r\n"); - - // 执行到这里,说明文件下载失败了,需要进一步处理 -#if 0 - SPIFlash_Erase(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP, 2, SPI_FLASH_SECTOR_ERASE_MODE_4K); - SPIFlash_Write(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP, (HIDO_UINT8*)&tmp, sizeof(tmp)); - SPIFlash_Erase(SPI_FLASH_ID_0, APP_CONFIG_IAP_PARAM_MAP, 256, SPI_FLASH_SECTOR_ERASE_MODE_4K); -#endif - // delay_ms(10); - // Reboot(0); - NVIC_SystemReset(); + uint16_t tmp = 0xFFFF; + __disable_irq(); + result1=flash_open(FLASH_ID0,NULL); + if(!result1) + { + flash_erase(FLASH_ID0, APP_CONFIG_IAPFLAG_SECTOR_ADDR, FLASH_SECTOR_SIZE);//擦除APPFLAG + flash_write_nbytes(FLASH_ID0, APP_CONFIG_IAPFLAG_MAP, (uint8_t*)&tmp, sizeof(tmp)); + flash_erase(FLASH_ID0, APP_CONFIG_IAP_PARAM_MAP, FLASH_SECTOR_SIZE);//擦除APPFLAG + } + __enable_irq(); + delay_us(1000000); + NVIC_SystemReset(); //软复位回到bootloader return HIDO_OK; } @@ -293,7 +336,7 @@ * Author : www.hido-studio.com * Modified Date: : 2020年9月13日 *******************************************************************************/ -HIDO_INT32 OTA_SetUp(HIDO_CHAR *_pcUrl) +HIDO_INT32 OTA_SetUp(HIDO_UINT8 _u8Type, HIDO_CHAR *_pcUrl) { if(HIDO_NULL == _pcUrl) { @@ -309,15 +352,21 @@ l_u32OTARetryCnt = 0; l_u32OTAFileSize = 0; l_u32OTAFileRecvLen = 0; + l_u8OTAType = _u8Type; HIDO_UtilSnprintf(l_acOTAUrl, sizeof(l_acOTAUrl), _pcUrl); /* 擦除OTA文件缓存存储空间 */ -#if 0 - SPIFlash_Erase(SPI_FLASH_ID_0, APP_CONFIG_APP_DOWN_LOAD_SPIFLASH_ADDRESS, - APP_CONFIG_APP_DOWN_LOAD_SPIFLASH_SIZE, SPI_FLASH_SECTOR_ERASE_MODE_64K); -#else - flash_erase(FLASH_ID0,APP2_ADRESS,APP_SIZE); -#endif + if (_u8Type == 0) + { + l_eOTAType = OTA_TYPE_MCU; + flash_erase(FLASH_ID0, APP2_ADRESS, APP_CONFIG_APPLICATION_SIZE); + } + else + { + l_eOTAType = OTA_TYPE_MUSIC; + flash_erase(FLASH_ID0, APP2_ADRESS, APP_CONFIG_APPLICATION_SIZE); + } + /* 请求升级文件长度 */ if(OTA_RequestFileLen() != HIDO_OK) { @@ -347,8 +396,6 @@ return HIDO_OK; } -static HIDO_CHAR url[256 + 1]; - /******************************************************************************* * Function Name : OTA_Poll * Description : @@ -360,18 +407,19 @@ *******************************************************************************/ HIDO_INT32 OTA_Poll(void) { - if(Internet_IsIPReady() != HIDO_TRUE) + if (Internet_IsIPReady() != HIDO_TRUE) { return HIDO_ERR; } - - if(l_eOTAState == OTA_STATE_IDLE) + + if (l_eOTAState == OTA_STATE_IDLE) { - OTA_SetUp(url); + OTA_SetUp(l_u8OTAType, l_acOTAUrl); } - + return HIDO_OK; } + /******************************************************************************* * Function Name : OTA_Start @@ -382,30 +430,12 @@ * Author : www.hido-studio.com * Modified Date: : 2020年9月13日 *******************************************************************************/ -HIDO_INT32 OTA_Start(HIDO_CHAR *_pcUrl) +HIDO_INT32 OTA_Start(HIDO_UINT8 _u8Type, HIDO_CHAR *_pcUrl) { l_eOTAState = OTA_STATE_IDLE; HIDO_TimerCreate(&l_u32OTATimerID); - - HIDO_DataStruct stHost; - HIDO_DataStruct stPath; - HIDO_UINT32 u32Port = 0; -#if 0 - SPIFlash_Read(SPI_FLASH_ID_0, url, APP_CONFIG_IAP_PARAM_MAP, sizeof(url) - 1); -#endif - - url[256] = '\0'; - - if(HIDO_UtilParseFormat((HIDO_UINT8 *)_pcUrl, sizeof(url), "http://%p:%d/%p", &stHost, &u32Port, &stPath) != 3) - { - u32Port = 80; + OTA_SetUp(_u8Type, _pcUrl); - if (HIDO_UtilParseFormat((HIDO_UINT8 *) _pcUrl, sizeof(url), "http://%p/%p", &stHost, &stPath) != 2) - { - OTA_Failed(); - } - } - return HIDO_OK; } -- Gitblit v1.9.3