drv_ota.c 4.5 KB

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