ota_display.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. /*
  2. * @Description:
  3. * @Version: 2.0
  4. * @Author: Seven
  5. * @Date: 2022-11-22 10:52:19
  6. * @LastEditors: Seven
  7. * @LastEditTime: 2022-12-08 11:46:01
  8. */
  9. #include "ota_display.h"
  10. #include "includes.h"
  11. uint32_t XSP_OTA_VER = 0;//显示屏升级版本号
  12. uint8_t XSP_update_state[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
  13. ota_xsp_pack_info_t ota_xsp_pack_info;
  14. xsp_ota_info_t xsp_ota_info;
  15. uint8_t coll_xsp[1024];
  16. uint32_t XSPL_addr=0,XSPL_len=0,XSPA_len=0;
  17. uint16_t XSP_crc = 0;
  18. uint32_t XSPL_APP_Addr,XSPL_APP_Len,XSPL_APP_Crc,XSPH_APP_Addr,XSPH_APP_Len,XSPH_APP_Crc;
  19. //显示屏升级开始
  20. void xsp_ota_start(void)
  21. {
  22. printf("xsp ota start\n");
  23. device_fixed_info.Work_State = DEV_WORK_STATE_XSP_UPDATING;
  24. timeout_setValue(&ota_xsp_pack_info.tt_total,XSP_OTA_TOTAL_TIME,1);
  25. ota_xsp_info.xsp_count = 0;
  26. ota_xsp_info.error_num = 0;
  27. ota_xsp_info.xsp_ota_step = FIRST_READ_0xC0;
  28. }
  29. //显示屏升级结束
  30. void xsp_ota_over(void)
  31. {
  32. printf("xsp ota over\n");
  33. //清除屏升级标志存储
  34. BKP_WriteBackupRegister_code(BKP_DR4,0);
  35. device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
  36. ota_xsp_info.error_num = 0;
  37. ota_xsp_info.xsp_ota_begin = 0;
  38. timeout_stop(&ota_xsp_pack_info.tt_total);
  39. memset(&ota_state,0,sizeof(ota_state));
  40. }
  41. //读取显示屏升级信息
  42. void get_xsp_ota_info(uint32_t addr, uint32_t len)
  43. {
  44. int i,j;
  45. uint32_t size = 0;
  46. Flash_BufferRead(addr,coll_xsp,len);
  47. memset(&xsp_ota_info,0,sizeof(xsp_ota_info_t));
  48. memcpy(&xsp_ota_info,coll_xsp,4);
  49. // if(coll_xsp[0] <= 16)
  50. printf("coll num:%d\n",xsp_ota_info.coll_num);
  51. if(xsp_ota_info.coll_num <= 16)
  52. {
  53. // xsp_ota_info.coll_num = coll_xsp[0];
  54. size = 4;
  55. for(i = 0; i < xsp_ota_info.coll_num;i++)
  56. {
  57. memcpy(&xsp_ota_info.coll_xsp[i],&coll_xsp[size],12);
  58. printf("coll type:0x%04x,coll sn:0x%08x,xsp num:%d\n",xsp_ota_info.coll_xsp[i].coll_type,xsp_ota_info.coll_xsp[i].coll_sn,xsp_ota_info.coll_xsp[i].xsp_num);
  59. size += 12;
  60. memcpy(xsp_ota_info.coll_xsp[i].xsp_info,&coll_xsp[size],xsp_ota_info.coll_xsp[i].xsp_num*8);
  61. size += xsp_ota_info.coll_xsp[i].xsp_num*8;
  62. for(j = 0; j < xsp_ota_info.coll_xsp[i].xsp_num; j++)
  63. {
  64. printf("xsp %d,xsp type:0x%04x,xsp sn:<0x%08x,%u>\n",j,xsp_ota_info.coll_xsp[i].xsp_info[j].xsp_type,xsp_ota_info.coll_xsp[i].xsp_info[j].xsp_sn,xsp_ota_info.coll_xsp[i].xsp_info[j].xsp_sn);
  65. }
  66. }
  67. }
  68. }
  69. //查找路由内是否有本设备
  70. uint8_t check_route_xsp_ota(void)
  71. {
  72. uint8_t ret = 0;
  73. int i;
  74. for(i = 0; i < xsp_ota_info.coll_num; i++)
  75. {
  76. if((xsp_ota_info.coll_xsp[i].coll_type == (uint32_t)device_info.device_type) && (xsp_ota_info.coll_xsp[i].coll_sn == device_info.device_sn))
  77. {
  78. ota_xsp_info.xsp_index = i;
  79. ota_xsp_info.xsp_total_num = xsp_ota_info.coll_xsp[i].xsp_num;
  80. if(ota_xsp_info.xsp_total_num)
  81. {
  82. ret = 1;
  83. }
  84. break;
  85. }
  86. }
  87. return ret;
  88. }
  89. //显示屏校验计算
  90. uint16_t xsp_update_crc(uint32_t start, uint32_t len)
  91. {
  92. // uint32_t temp[16] = {0};
  93. uint32_t verify[2] = {0};
  94. uint16_t g_crc = 0;
  95. GetCodeVerify(start,len,verify);
  96. g_crc = CRC16_get((uint8_t *)verify,8);
  97. // printf("crc1 = 0x%04x\n",g_crc);
  98. //
  99. // GetCodeVerify_t(start,len,verify);
  100. // g_crc = CRC16_get((uint8_t *)verify,8);
  101. // printf("crc2 = 0x%04x\n",g_crc);
  102. // Flash_BufferRead(start,(uint8_t *)temp,len);
  103. return g_crc;
  104. }
  105. ////获取升级显示屏的sn
  106. //void get_ota_xsp_sn(void)
  107. //{
  108. //// ota_xsp_info.txsp_info.xsp_sn = 12345;
  109. //}
  110. void ota_xsp_info_read_test(void)
  111. {
  112. uint8_t ret;
  113. uint32_t datalen = 0,fixChar;
  114. datalen = Flash_DatalenRead(OTA_UPDATE_APP3_FLASH_START_ADDR,OTA_UPDATE_APP3_FLASH_SIZE);
  115. printf("data len = %d\n",datalen);
  116. if(datalen > (128*1024) || datalen == 0)
  117. {
  118. printf("升级包长度错误: %d\n",datalen);
  119. return;
  120. }
  121. fixChar = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-8); // 固定字符 WBJW
  122. if(fixChar == XSPL_CHAR)//有路由表
  123. {
  124. ota_slave.total_bytes = datalen;
  125. ret = ota_update_pkg_check(DISPLAY,0);
  126. if(!ret)
  127. {
  128. printf("update pkg err\n");
  129. return;
  130. }
  131. get_xsp_ota_info(XSPL_addr,XSPL_len);
  132. if(!check_route_xsp_ota())
  133. {
  134. printf("no xsp\n");
  135. return;
  136. }
  137. //显示屏升级标志存储
  138. BKP_WriteBackupRegister_code(BKP_DR4,XSP_UPDATE);
  139. //显示屏升级次数存储
  140. BKP_WriteBackupRegister_code(BKP_DR5,0);
  141. xsp_ota_start();
  142. ota_xsp_init();
  143. }
  144. // else if(fixChar == XSPA_CHAR)
  145. // {
  146. // //没有路由表
  147. // XSPH_APP_Len = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-2);
  148. // XSPH_APP_Addr = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-4);
  149. // XSPL_APP_Len = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-6);
  150. // XSPL_APP_Addr = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-8);
  151. // XSPL_APP_Crc = xsp_update_crc(OTA_UPDATE_APP3_FLASH_START_ADDR+XSPL_APP_Addr,XSPL_APP_Len);
  152. // XSPH_APP_Crc = xsp_update_crc(OTA_UPDATE_APP3_FLASH_START_ADDR+XSPH_APP_Addr,XSPH_APP_Len);
  153. // printf("xspl addr=0x%04x, xspl len=%d, xspl crc=0x%04x\n",XSPL_APP_Addr,XSPL_APP_Len,XSPL_APP_Crc);
  154. // printf("xsph addr=0x%04x, xsph len=%d, xsph crc=0x%04x\n",XSPH_APP_Addr,XSPH_APP_Len,XSPH_APP_Crc);
  155. // xsp_ota_start();
  156. // ota_xsp_info.txsp_info.xsp_type = 0x1023;
  157. // ota_xsp_info.txsp_info.xsp_sn = 4294000000;
  158. // ota_xsp_info.xsp_ota_step = FIRST_READ_0xC0;//;SEND_IAP_0x02
  159. // get_iap_key(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key_iap);
  160. // ota_xsp_info.xsp_ota_begin = 1;
  161. //
  162. // }
  163. }
  164. //显示屏升级初始化
  165. void ota_xsp_init(void)
  166. {
  167. #if 0
  168. uint8_t ret;
  169. uint32_t datalen = 0;
  170. datalen = Flash_DatalenRead(OTA_UPDATE_APP3_FLASH_START_ADDR,OTA_UPDATE_APP3_FLASH_SIZE);
  171. printf("data len = %d\n",datalen);
  172. if(datalen > (128*1024) || datalen == 0)
  173. {
  174. printf("升级包长度错误: %d\n",datalen);
  175. return;
  176. }
  177. //没有路由表
  178. XSPH_APP_Len = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-2);
  179. XSPH_APP_Addr = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-4);
  180. XSPL_APP_Len = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-6);
  181. XSPL_APP_Addr = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-8);
  182. XSPL_APP_Crc = xsp_update_crc(OTA_UPDATE_APP3_FLASH_START_ADDR+XSPL_APP_Addr,XSPL_APP_Len);
  183. XSPH_APP_Crc = xsp_update_crc(OTA_UPDATE_APP3_FLASH_START_ADDR+XSPH_APP_Addr,XSPH_APP_Len);
  184. printf("xspl addr=0x%04x, xspl len=%d, xspl crc=0x%04x\n",XSPL_APP_Addr,XSPL_APP_Len,XSPL_APP_Crc);
  185. printf("xsph addr=0x%04x, xsph len=%d, xsph crc=0x%04x\n",XSPH_APP_Addr,XSPH_APP_Len,XSPH_APP_Crc);
  186. ota_xsp_info.txsp_info.xsp_type = 0x0401;
  187. ota_xsp_info.txsp_info.xsp_sn = 10000123;
  188. ota_xsp_info.xsp_ota_step = FIRST_READ_0xC0;//;SEND_IAP_0x02
  189. get_iap_key(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key_iap);
  190. #endif
  191. #if 1
  192. //有路由表
  193. while(ota_xsp_info.xsp_count < ota_xsp_info.xsp_total_num)
  194. {
  195. if(xsp_ota_info.coll_xsp[ota_xsp_info.xsp_index].xsp_info[ota_xsp_info.xsp_count].xsp_type == ((XSP_OTA_VER&0xffff0000)>>16))
  196. {
  197. ota_xsp_info.txsp_info.xsp_sn = xsp_ota_info.coll_xsp[ota_xsp_info.xsp_index].xsp_info[ota_xsp_info.xsp_count].xsp_sn;
  198. ota_xsp_info.txsp_info.xsp_type = (XSP_OTA_VER&0xffff0000)>>16;
  199. get_iap_key(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key_iap);
  200. ota_xsp_info.xsp_ota_step = FIRST_READ_0xC0;
  201. ota_xsp_info.xsp_ota_begin = 1;
  202. break;
  203. }
  204. else
  205. {
  206. ota_xsp_info.xsp_count++;
  207. }
  208. }
  209. if(ota_xsp_info.xsp_count >= ota_xsp_info.xsp_total_num)//升级结束
  210. {
  211. xsp_ota_over();
  212. }
  213. #endif
  214. }
  215. //接收到iap 0x01返回后处理
  216. uint8_t rcv_iap_0x01_handle(void *data)
  217. {
  218. uint8_t ret = 0;
  219. xsp_iap_0x01_info_t *p_xsp = (xsp_iap_0x01_info_t *)data;
  220. if(p_xsp->iapVer == ota_xsp_pack_info.update_ver)//无需升级
  221. {
  222. return ret;
  223. }
  224. else
  225. {
  226. if(p_xsp->curAppBase == XSP_APPL_ADDR)
  227. {
  228. ota_xsp_pack_info.startaddr = XSP_APPH_ADDR;
  229. ota_xsp_pack_info.app3_startaddr = OTA_UPDATE_APP3_FLASH_START_ADDR+XSPH_APP_Addr;
  230. ota_xsp_pack_info.total_bytes = XSPH_APP_Len;
  231. ota_xsp_pack_info.total_crc = XSPH_APP_Crc;
  232. }
  233. else if(p_xsp->curAppBase == XSP_APPH_ADDR)
  234. {
  235. ota_xsp_pack_info.startaddr = XSP_APPL_ADDR;
  236. ota_xsp_pack_info.app3_startaddr = OTA_UPDATE_APP3_FLASH_START_ADDR+XSPL_APP_Addr;
  237. ota_xsp_pack_info.total_bytes = XSPL_APP_Len;
  238. ota_xsp_pack_info.total_crc = XSPL_APP_Crc;
  239. }
  240. ota_xsp_pack_info.total_pkgs = ota_xsp_pack_info.total_bytes/OTA_XSP_PACK_LEN;
  241. if(ota_xsp_pack_info.total_bytes%OTA_XSP_PACK_LEN)
  242. {
  243. ota_xsp_pack_info.total_pkgs++;
  244. }
  245. printf("xsp crc=%04x\n",ota_xsp_pack_info.total_crc);
  246. }
  247. return ret;
  248. }
  249. //显示屏升级
  250. void ota_xsp_send(void)
  251. {
  252. uint32_t times = 0;
  253. switch(ota_xsp_info.xsp_ota_step)
  254. {
  255. case FIRST_READ_0xC0:
  256. xsp_0xC0_send(ota_xsp_info.txsp_info.xsp_sn);
  257. break;
  258. case SECOND_AUTH_0xC1_STEP01:
  259. xsp_0xC1_send(ota_xsp_info.txsp_info.xsp_sn,1,xsp_comm_info,ota_xsp_info.txsp_info.curkey);
  260. break;
  261. case SECOND_AUTH_0xC1_STEP02:
  262. xsp_0xC1_send(ota_xsp_info.txsp_info.xsp_sn,2,xsp_comm_info,ota_xsp_info.txsp_info.curkey);
  263. break;
  264. // case READ_XSP_0xC3:
  265. // xsp_0xC3_send(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key);
  266. // break;
  267. case SEND_IAP_0x01:
  268. xsp_iap_0x01_send(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key_iap,ota_xsp_info.txsp_info.key);
  269. break;
  270. case SEND_IAP_0x02:
  271. xsp_iap_0x02_send(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key_iap,ota_xsp_info.txsp_info.key,ota_xsp_pack_info.startaddr,XSP_APPL_SIZE/2048);
  272. break;
  273. case SEND_IAP_0x03:
  274. xsp_iap_0x03_send(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key_iap,ota_xsp_info.txsp_info.key,OTA_XSP_PACK_LEN/4,ota_xsp_pack_info.startaddr);
  275. break;
  276. case SEND_IAP_0x04:
  277. // ota_xsp_pack_info.total_crc = xsp_update_crc(OTA_UPDATE_APP3_FLASH_START_ADDR+2048*ota_xsp_info.iap_0x04_num,2048);//OTA_XSP_PACK_LEN,datalen
  278. xsp_iap_0x04_send(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key_iap,ota_xsp_info.txsp_info.key,ota_xsp_pack_info.startaddr,ota_xsp_pack_info.total_bytes,ota_xsp_pack_info.total_crc);//ota_xsp_pack_info.total_bytes,OTA_XSP_PACK_LEN
  279. break;
  280. case SEND_IAP_0x07:
  281. times = RTC_GetCounter();
  282. xsp_iap_0x07_send(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key_iap,ota_xsp_info.txsp_info.key,ota_xsp_pack_info.startaddr,times);
  283. break;
  284. case SEND_IAP_0x0F:
  285. xsp_iap_0x0F_send(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key_iap,ota_xsp_info.txsp_info.key);
  286. lora_xsp_ota_updatestate_resp(UPDATA_SUCCESS);
  287. ota_xsp_info.xsp_count++;
  288. // ota_xsp_info.xsp_ota_begin = 1;
  289. ota_xsp_init();
  290. // device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
  291. break;
  292. default:
  293. break;
  294. }
  295. }
  296. //显示屏升级状态返回
  297. void lora_xsp_ota_updatestate_resp(uint8_t updatestate)
  298. {
  299. collect_gateway_msg_format_t msg;
  300. ota_state_upload_t *p_ota = (ota_state_upload_t *)msg.info;
  301. p_ota->rcv_device_type = device_info.device_type;
  302. p_ota->rcv_device_sn = device_info.device_sn;
  303. p_ota->des_device_type = ota_xsp_info.txsp_info.xsp_type;
  304. p_ota->des_device_sn = ota_xsp_info.txsp_info.xsp_sn;
  305. p_ota->des_bt_ver = 0;
  306. p_ota->des_app_ver = ota_xsp_pack_info.update_ver;
  307. p_ota->update_state = updatestate;
  308. p_ota->reserve = 0;
  309. coll_msg_send(&msg, net_msg_type_update_status_upload, OTA_STATE_UPLOAD_LEN);
  310. data_dump("xsp update",(uint8_t *)&msg,msg.msg_len+FRAME_HEADER_LEN);
  311. // slave_upload_info.num++;//上报次数
  312. // printf("slave send %d ",slave_upload_info.num);
  313. // data_dump("times",(uint8_t *)&msg,FRAME_HEADER_LEN + OTA_STATE_UPLOAD_LEN+2);
  314. }
  315. uint8_t xsp_update_state;
  316. void xsp_update_handle(void)
  317. {
  318. //显示屏升级
  319. if(device_fixed_info.xsp_update_start)
  320. {
  321. device_fixed_info.xsp_update_start = 0;
  322. xsp_update_reboot();
  323. }
  324. if(device_fixed_info.Work_State == DEV_WORK_STATE_XSP_UPDATING)
  325. {
  326. if(timeout_isOut(&ota_xsp_pack_info.tt_total))
  327. {
  328. xsp_ota_over();
  329. }
  330. if(ota_xsp_info.error_num > 3)
  331. {
  332. ota_xsp_info.xsp_ota_begin = 0;
  333. ota_xsp_info.error_num = 0;
  334. // device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
  335. xsp_update_state = XSP_update_state[ota_xsp_info.xsp_ota_step];
  336. lora_xsp_ota_updatestate_resp(xsp_update_state);
  337. ota_xsp_info.xsp_count++;
  338. ota_xsp_init();
  339. }
  340. if(ota_xsp_info.xsp_ota_begin)
  341. {
  342. ota_xsp_send();
  343. ota_xsp_info.xsp_ota_begin = 0;
  344. }
  345. if(timeout_isOut(&ota_xsp_info.tt_uart))
  346. {
  347. ota_xsp_info.error_num++;
  348. if(ota_xsp_info.error_num <= 3)
  349. ota_xsp_info.xsp_ota_begin = 1;
  350. }
  351. }
  352. }