drv_ota.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #include <stdio.h>
  2. #include "ipc.h"
  3. #include "yc_timer.h"
  4. #include "yc11xx.h"
  5. #include "btreg.h"
  6. #include "drv_ota.h"
  7. #include "yc11xx_qspi.h"
  8. #include "yc_drv_common.h"
  9. #include "yc_lpm.h"
  10. #include "yc11xx_bt_interface.h"
  11. #include "system.h"
  12. #include "LH_TaskManager.h"
  13. #include "yc11xx_wdt.h"
  14. uint16_t OTA_packetid;
  15. uint32_t OTA_flash_start_addr;
  16. uint32_t OTA_datasum,OTA_datalen;
  17. int8_t OTA_start_ignore;
  18. void OTA_Init()
  19. {
  20. OTA_packetid = 0;
  21. OTA_datasum = 0;
  22. OTA_flash_start_addr = 0;
  23. OTA_datalen = 0;
  24. OTA_start_ignore=0;
  25. }
  26. void Bt_CBChangeCode()
  27. {
  28. MyPrintf("OTA_RX_OK\r\n");
  29. Bt_SndCmdLeDisconnect();
  30. int i=10000;
  31. while(i--);
  32. uint8_t datatemp[3]={0};
  33. if(OTA_flash_start_addr != CODE_START_FLASHADDR1
  34. && OTA_flash_start_addr!= CODE_START_FLASHADDR2)
  35. return;
  36. datatemp[0] = OTA_flash_start_addr>>16;
  37. datatemp[1] = (OTA_flash_start_addr&0xff00)>>8;
  38. datatemp[2] = OTA_flash_start_addr;
  39. //YC_FlashSectorErase(DEVICE_INFO_BASE);
  40. QSPI_SectorEraseFlash(0);
  41. QSPI_WriteFlashData(0,3,datatemp);
  42. HWRITE(CORE_RESET,0x03);
  43. while(1);
  44. }
  45. //#define OTA_PACKET_LEN 0x64
  46. #define OTA_PACKET_LEN 100
  47. void Bt_BleOTA(uint8_t len,uint8_t *dataPtr)
  48. {
  49. uint8_t j=0,data[7]={0},datatemp[32]={0};
  50. uint32_t i;
  51. if(*dataPtr +(*(dataPtr +1)<<8) == OTA_BLE_WRITE_HANDLE
  52. && len>3 && *(dataPtr+2) == OTA_EVT)
  53. {
  54. switch(*(dataPtr+3))
  55. {
  56. case OTA_EVT_START: //开始升级
  57. if(OTA_start_ignore){
  58. OTA_start_ignore-=2;
  59. if(OTA_start_ignore<0)OTA_start_ignore=0;
  60. break;
  61. }//if start always then response when 5th
  62. if(len != 4)
  63. break;
  64. OTA_Init();
  65. OTA_start_ignore=8;//ignore the start when receive a start until receive end or reset
  66. #ifdef HW_WATCH_DOG_FUNC
  67. WDT_Kick();
  68. #endif
  69. QSPI_ReadFlashData(0,3,(uint8_t *)(&OTA_flash_start_addr)); //读取flash 偏移地址
  70. if(CODE_START_FLASHADDR1 == REVERSE_3BYTE_DEFINE(OTA_flash_start_addr)){
  71. OTA_flash_start_addr = CODE_START_FLASHADDR2;
  72. }
  73. else if(CODE_START_FLASHADDR2 == REVERSE_3BYTE_DEFINE(OTA_flash_start_addr)){
  74. OTA_flash_start_addr = CODE_START_FLASHADDR1;
  75. }
  76. else
  77. {
  78. break;
  79. }
  80. #ifdef DEBUG_DRV_APP
  81. MyPrintf("OTA_flash_start_addr=%03x \r\n",OTA_flash_start_addr);
  82. #endif
  83. for(i=0;i<0x17;i++){
  84. QSPI_SectorEraseFlash(OTA_flash_start_addr+(i<<12)); //erase flash
  85. #ifdef HW_WATCH_DOG_FUNC
  86. WDT_Kick();
  87. #endif
  88. }
  89. data[0] = OTA_BLE_NOTIFY_HANDLE;
  90. data[1] = OTA_BLE_NOTIFY_HANDLE>>8;
  91. data[2] = OTA_CMD;
  92. data[3] = OTA_EVT_START;
  93. data[4] = OTA_PACKET_LEN&0xff;
  94. data[5] = OTA_PACKET_LEN>>8;
  95. IPC_TxCommon(IPC_TYPE_BLE,data,6);
  96. break;
  97. case OTA_EVT_DATA: //接收ota 数据
  98. if(OTA_start_ignore>0)OTA_start_ignore--;
  99. if(OTA_packetid == 0 || (OTA_packetid +1) == (*(dataPtr+4) + (*(dataPtr+5) <<8))){//判断包序号是否正常
  100. OTA_packetid = *(dataPtr+4) + (*(dataPtr+5) <<8); //获得包序号
  101. }
  102. else{
  103. break;
  104. }
  105. if((*(dataPtr+6)+((*(dataPtr+7))<<8)) >0)//长度大于0再写入
  106. {
  107. QSPI_WriteFlashData(OTA_flash_start_addr+OTA_datalen, (*(dataPtr+6)+((*(dataPtr+7))<<8)) ,dataPtr+8);//写入flash
  108. OTA_datalen += (*(dataPtr+6)+((*(dataPtr+7))<<8)) ;//计算写入长度值
  109. }
  110. else{
  111. break;
  112. }
  113. data[0] = OTA_BLE_NOTIFY_HANDLE;
  114. data[1] = OTA_BLE_NOTIFY_HANDLE>>8;
  115. data[2] = OTA_CMD;
  116. data[3] = OTA_EVT_DATA;
  117. data[4] = *(dataPtr+4);
  118. data[5] = *(dataPtr+5);
  119. IPC_TxCommon(IPC_TYPE_BLE,data,6);
  120. break;
  121. case OTA_EVT_END: //OTA 结束
  122. data[0] = OTA_BLE_NOTIFY_HANDLE;
  123. data[1] = OTA_BLE_NOTIFY_HANDLE>>8;
  124. data[2] = OTA_CMD;
  125. data[3] = OTA_EVT_END;
  126. data[4] = *(dataPtr+4);
  127. data[5] = *(dataPtr+5);
  128. for(i=0; i<OTA_datalen; )
  129. {
  130. if(OTA_datalen-i>=32)
  131. {
  132. QSPI_ReadFlashData(OTA_flash_start_addr+i,32,datatemp);
  133. for(j=0;j<32;j++)
  134. OTA_datasum += datatemp[j];
  135. i += 32;
  136. }else
  137. {
  138. QSPI_ReadFlashData(OTA_flash_start_addr+i,OTA_datalen-i,datatemp);
  139. for(j=0;j<OTA_datalen-i;j++)
  140. OTA_datasum += datatemp[j];
  141. i = OTA_datalen;
  142. }
  143. }
  144. if(OTA_datasum == *(dataPtr+6) + (*(dataPtr+7)<<8) + (*(dataPtr+8)<<16)
  145. && OTA_datalen == *(dataPtr+9) + (*(dataPtr+10)<<8) + (*(dataPtr+11)<<16)) {
  146. data[6] = OTA_END_CHECK_OK;
  147. //SYS_SetTimer(&gOTATimer,20, TIMER_SINGLE|TIMER_TYPE_BIT,Bt_CBChangeCode);
  148. UserTimerTask_Create((void*)Bt_CBChangeCode,20);
  149. }else
  150. {
  151. data[6] = OTA_END_CHECK_FAIL;
  152. OTA_Init();
  153. }
  154. IPC_TxCommon(IPC_TYPE_BLE,data,7);
  155. Lpm_unLockLpm(OTA_UPDATE_FLAG);
  156. break;
  157. case OTA_EVT_RESET: //ota 复位
  158. OTA_Init();
  159. break;
  160. default:
  161. OTA_Init();
  162. break;
  163. }
  164. }
  165. }
  166. uint32_t Get_runAddr(void){
  167. QSPI_ReadFlashData(0,3,(uint8_t *)(&OTA_flash_start_addr)); //读取flash 偏移地址
  168. return REVERSE_3BYTE_DEFINE(OTA_flash_start_addr);//判断是固件1的地址 还是固件2的地址
  169. }