123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- #include <stdio.h>
- #include "ipc.h"
- #include "yc_timer.h"
- #include "yc11xx.h"
- #include "btreg.h"
- #include "drv_ota.h"
- #include "yc11xx_qspi.h"
- #include "yc_drv_common.h"
- #include "yc_lpm.h"
- #include "yc11xx_bt_interface.h"
- #include "system.h"
- #include "LH_TaskManager.h"
- #include "yc11xx_wdt.h"
- uint16_t OTA_packetid;
- uint32_t OTA_flash_start_addr;
- uint32_t OTA_datasum,OTA_datalen;
- int8_t OTA_start_ignore;
- void OTA_Init()
- {
- OTA_packetid = 0;
- OTA_datasum = 0;
- OTA_flash_start_addr = 0;
- OTA_datalen = 0;
- OTA_start_ignore=0;
- }
- void Bt_CBChangeCode()
- {
- MyPrintf("OTA_RX_OK\r\n");
- Bt_SndCmdLeDisconnect();
- int i=10000;
- while(i--);
- uint8_t datatemp[3]={0};
- if(OTA_flash_start_addr != CODE_START_FLASHADDR1
- && OTA_flash_start_addr!= CODE_START_FLASHADDR2)
- return;
-
- datatemp[0] = OTA_flash_start_addr>>16;
- datatemp[1] = (OTA_flash_start_addr&0xff00)>>8;
- datatemp[2] = OTA_flash_start_addr;
- //YC_FlashSectorErase(DEVICE_INFO_BASE);
- QSPI_SectorEraseFlash(0);
- QSPI_WriteFlashData(0,3,datatemp);
- HWRITE(CORE_RESET,0x03);
- while(1);
- }
- //#define OTA_PACKET_LEN 0x64
- #define OTA_PACKET_LEN 100
- void Bt_BleOTA(uint8_t len,uint8_t *dataPtr)
- {
- uint8_t j=0,data[7]={0},datatemp[32]={0};
- uint32_t i;
-
- if(*dataPtr +(*(dataPtr +1)<<8) == OTA_BLE_WRITE_HANDLE
- && len>3 && *(dataPtr+2) == OTA_EVT)
- {
- switch(*(dataPtr+3))
- {
- case OTA_EVT_START: //开始升级
- if(OTA_start_ignore){
- OTA_start_ignore-=2;
- if(OTA_start_ignore<0)OTA_start_ignore=0;
- break;
- }//if start always then response when 5th
- if(len != 4)
- break;
- OTA_Init();
-
- OTA_start_ignore=8;//ignore the start when receive a start until receive end or reset
- #ifdef HW_WATCH_DOG_FUNC
- WDT_Kick();
- #endif
- QSPI_ReadFlashData(0,3,(uint8_t *)(&OTA_flash_start_addr)); //读取flash 偏移地址
-
-
-
- if(CODE_START_FLASHADDR1 == REVERSE_3BYTE_DEFINE(OTA_flash_start_addr)){
- OTA_flash_start_addr = CODE_START_FLASHADDR2;
- }
- else if(CODE_START_FLASHADDR2 == REVERSE_3BYTE_DEFINE(OTA_flash_start_addr)){
- OTA_flash_start_addr = CODE_START_FLASHADDR1;
-
- }
- else
- {
- break;
- }
- #ifdef DEBUG_DRV_APP
- MyPrintf("OTA_flash_start_addr=%03x \r\n",OTA_flash_start_addr);
- #endif
- for(i=0;i<0x17;i++){
- QSPI_SectorEraseFlash(OTA_flash_start_addr+(i<<12)); //erase flash
- #ifdef HW_WATCH_DOG_FUNC
- WDT_Kick();
- #endif
- }
- data[0] = OTA_BLE_NOTIFY_HANDLE;
- data[1] = OTA_BLE_NOTIFY_HANDLE>>8;
- data[2] = OTA_CMD;
- data[3] = OTA_EVT_START;
- data[4] = OTA_PACKET_LEN&0xff;
- data[5] = OTA_PACKET_LEN>>8;
- IPC_TxCommon(IPC_TYPE_BLE,data,6);
- break;
-
- case OTA_EVT_DATA: //接收ota 数据
- if(OTA_start_ignore>0)OTA_start_ignore--;
- if(OTA_packetid == 0 || (OTA_packetid +1) == (*(dataPtr+4) + (*(dataPtr+5) <<8))){//判断包序号是否正常
- OTA_packetid = *(dataPtr+4) + (*(dataPtr+5) <<8); //获得包序号
- }
- else{
- break;
- }
- if((*(dataPtr+6)+((*(dataPtr+7))<<8)) >0)//长度大于0再写入
- {
- QSPI_WriteFlashData(OTA_flash_start_addr+OTA_datalen, (*(dataPtr+6)+((*(dataPtr+7))<<8)) ,dataPtr+8);//写入flash
- OTA_datalen += (*(dataPtr+6)+((*(dataPtr+7))<<8)) ;//计算写入长度值
- }
- else{
- break;
- }
- data[0] = OTA_BLE_NOTIFY_HANDLE;
- data[1] = OTA_BLE_NOTIFY_HANDLE>>8;
- data[2] = OTA_CMD;
- data[3] = OTA_EVT_DATA;
- data[4] = *(dataPtr+4);
- data[5] = *(dataPtr+5);
-
- IPC_TxCommon(IPC_TYPE_BLE,data,6);
- break;
-
- case OTA_EVT_END: //OTA 结束
- data[0] = OTA_BLE_NOTIFY_HANDLE;
- data[1] = OTA_BLE_NOTIFY_HANDLE>>8;
- data[2] = OTA_CMD;
- data[3] = OTA_EVT_END;
- data[4] = *(dataPtr+4);
- data[5] = *(dataPtr+5);
- for(i=0; i<OTA_datalen; )
- {
- if(OTA_datalen-i>=32)
- {
- QSPI_ReadFlashData(OTA_flash_start_addr+i,32,datatemp);
- for(j=0;j<32;j++)
- OTA_datasum += datatemp[j];
- i += 32;
- }else
- {
- QSPI_ReadFlashData(OTA_flash_start_addr+i,OTA_datalen-i,datatemp);
- for(j=0;j<OTA_datalen-i;j++)
- OTA_datasum += datatemp[j];
- i = OTA_datalen;
- }
- }
- if(OTA_datasum == *(dataPtr+6) + (*(dataPtr+7)<<8) + (*(dataPtr+8)<<16)
- && OTA_datalen == *(dataPtr+9) + (*(dataPtr+10)<<8) + (*(dataPtr+11)<<16)) {
- data[6] = OTA_END_CHECK_OK;
- //SYS_SetTimer(&gOTATimer,20, TIMER_SINGLE|TIMER_TYPE_BIT,Bt_CBChangeCode);
- UserTimerTask_Create((void*)Bt_CBChangeCode,20);
- }else
- {
- data[6] = OTA_END_CHECK_FAIL;
- OTA_Init();
- }
-
- IPC_TxCommon(IPC_TYPE_BLE,data,7);
- Lpm_unLockLpm(OTA_UPDATE_FLAG);
- break;
-
- case OTA_EVT_RESET: //ota 复位
- OTA_Init();
- break;
- default:
- OTA_Init();
- break;
- }
- }
- }
- uint32_t Get_runAddr(void){
- QSPI_ReadFlashData(0,3,(uint8_t *)(&OTA_flash_start_addr)); //读取flash 偏移地址
- return REVERSE_3BYTE_DEFINE(OTA_flash_start_addr);//判断是固件1的地址 还是固件2的地址
- }
|