drv_ota.c 4.9 KB

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