WXK
5 天以前 fc9967b37c19c8b5b72837b24c1f35678163ab64
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;
}