#include #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=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