ota_update.c 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062
  1. /*----------------------------------------------------------------------------------
  2. * 备份寄存器的说明
  3. * BKP_DR0: 写入的RTC标志
  4. * BKP_DR1: 写入升级标志码
  5. * BKP_DR2: 写入升级状态码
  6. * BKP_DR3: 写入升级任务号
  7. * BKP_DR4: 升级的来源: 0x22:来源于服务器下发的 0x44:来源于网关的离线升级
  8. * BKP_DR5: 上电后升级从设备
  9. * BKP_DR6: 升级的固件类型
  10. * ---------------------------------------------------------------------------------*/
  11. #include "ota_update.h"
  12. #include "dn_4g.h"
  13. #include "up_4g.h"
  14. #include "air780e.h"
  15. #include "masterslave.h"
  16. static uint8_t _buff[256];
  17. UpdateDa g_updateDa;
  18. OtaUpdateTime g_otaTimer;
  19. static otaUpdatMsg ota_devMsg;
  20. static uint16_t updata_state,updata_state_save;
  21. static void send_update_code_to_serve(uint16_t devtype, uint32_t devsn,uint16_t taskId,uint8_t upcode,uint8_t firmType)
  22. {
  23. uint8_t bufflen;
  24. memset(_buff,0,256);
  25. up_update_cmd_0x2002(_buff,&bufflen,devtype,devsn,taskId,firmType,upcode);
  26. add_data_to_4G_txfifo(_buff,bufflen,0x04,0x2002);
  27. }
  28. static void waiting_4g_tx_fifo_empty(void)
  29. {
  30. uint8_t len;
  31. do{
  32. if(fifo_is_empty(&g_4Gtxfifo) == TRUE) break ;// 发送fifo为空
  33. if(g_uart1Info.bSdFinish != 1) continue;
  34. printf("发送4G数据到服务器\r\n");
  35. len = fifo_read(&g_4Gtxfifo,_buff);
  36. data_dump("4g-data-to-server",_buff,len);
  37. send_data_to_mqtt(0x00,_buff,len);
  38. }while(1);
  39. }
  40. /*--------------------------------------------------------------------------
  41. * 上电读取升级的状态
  42. * --------------------------------------------------------------------------*/
  43. void ota_power_up_read_update_status(void)
  44. {
  45. uint16_t data;
  46. data = bkp_data_read(BKP_DATA_1); // 读取入标志码
  47. if(data != 0){
  48. if(updata_state_cmp(data)){
  49. if((data&0x00ff) == 0x82){ // 升级成功
  50. data = set_updata_state(UPDATE_SUCCESS);
  51. bkp_data_write(BKP_DATA_2, data);
  52. printf("\r\n send to net update sucess\r\n");
  53. }
  54. else if((data&0x00ff) == 0x83) { // 回退成功
  55. data = set_updata_state(UPDATE_RETURN_SUCESS);
  56. bkp_data_write(BKP_DATA_2, data);
  57. printf("\r\n send to net return sucess\r\n");
  58. }
  59. printf("\r\n update status1 = %x\r\n",data);
  60. data = bkp_data_read(BKP_DATA_2);
  61. bkp_data_write(BKP_DATA_1, 0);
  62. g_updateDa.updateCode = data&0xFF;
  63. data = bkp_data_read(BKP_DATA_3);//升级任务号
  64. g_updateDa.taskNo = data;
  65. data = bkp_data_read(BKP_DATA_4);
  66. //if(data == UP_PROG_FROM_NET) g_updateDa.bResetUpdate = 1;
  67. //else g_updateDa.bResetUpdate = 2;
  68. if(data == UP_PROG_FROM_GAT)
  69. {
  70. set_start_ota_timer(&g_otaTimer.randomTmr,(rand()%150+200));
  71. }
  72. g_updateDa.Update_Source = data;
  73. g_updateDa.bResetUpdate = 1;
  74. printf("g_updateDa.bResetUpdate = %d\r\n",g_updateDa.bResetUpdate);
  75. bkp_data_write(BKP_DATA_4, 0);
  76. data = bkp_data_read(BKP_DATA_6);//固件类型
  77. g_updateDa.bfirmware_type = data;
  78. data = bkp_data_read(BKP_DATA_5);
  79. printf("bkp5=%04x\n",data);
  80. if(data == UPDATE_SLAVE)//需要升级从设备
  81. {
  82. if(ota_offline_init(OTA_UPDATE_APP3_FLASH_START_ADDR,OTA_UPDATE_APP3_FLASH_SIZE))//升级包正确
  83. {
  84. ota_master_init_update_msg_offline(g_devMsg.devType,0xffffffff,g_devMsg.devType,0xffffffff,g_updateDa.bfirmware_type);
  85. // g_updateDa.bOffline_s = 1;//可以离线升级
  86. g_updateDa.bUpdate_slave = data;
  87. g_updateDa.bOffline_addr = OTA_UPDATE_APP3_FLASH_START_ADDR;
  88. g_devMsg.workMode = WORK_UPDATE;
  89. g_devMsg.ledgreen = 2;
  90. printf("升级从设备\n");
  91. }
  92. }
  93. bkp_data_write(BKP_DATA_5, 0);
  94. }
  95. }
  96. else{
  97. g_updateDa.bResetUpdate = 0;
  98. printf("\r\n no update program, data = %x\r\n",data);
  99. }
  100. }
  101. void set_start_ota_timer(otaTimeSet *timer, uint32_t delay)
  102. {
  103. timeout_stop(&(timer->timer));
  104. timeout_setValue(&(timer->timer),delay);
  105. timeout_start(&(timer->timer));
  106. timer->status = OTA_TIMER_START;
  107. }
  108. void ota_timer_stop(otaTimeSet *timer)
  109. {
  110. timeout_stop(&timer->timer);
  111. timer->status = OTA_TIMER_END;
  112. }
  113. /*----------------------------------------------------------------------
  114. * 1: 超时 0: 未超时
  115. * ---------------------------------------------------------------------*/
  116. uint8_t ota_timer_is_timeout(otaTimeSet * timer)
  117. {
  118. if(timer->status == OTA_TIMER_NULL) return 0; // 定时器还未启动时
  119. if((OTA_TIMER_START == timer->status) && timeout_isOut(&(timer->timer))){
  120. timer->status = OTA_TIMER_END;
  121. return 1;
  122. }
  123. else
  124. return 0;
  125. }
  126. void ota_master_update_slave_continue(otaUpdatMsg *msg,uint32_t addr)
  127. {
  128. updateCmd0x1004 *pmsg = NULL;
  129. // uint8_t i;
  130. pmsg = (updateCmd0x1004*)_buff;
  131. memset(_buff,0,256);
  132. pmsg->rcvDevType = msg->rcvDevType;
  133. pmsg->rcvDevSn = msg->rcvDevSn;
  134. pmsg->desDevType = msg->rcvDevType;
  135. pmsg->desDevSn = msg->rcvDevSn;
  136. pmsg->totalPage = msg->totalPage;
  137. pmsg->subPkgId = msg->subPkgId;
  138. pmsg->subPkgLen = msg->subPkgLen;
  139. while(ota_devMsg.subPkgId <= ota_devMsg.totalPage){
  140. start_delay_ms(msg->sendInterval);
  141. printf("lora_gw_ota_continues %d\r\n", msg->subPkgId);
  142. pmsg->subPkgId = msg->subPkgId++;
  143. Flash_BufferRead(addr + (pmsg->subPkgId - 1)*OTA_MASTER_SEND_PKG_SIZE,
  144. ((uint8_t *)pmsg) + OTA_CONTINUES_INFO_LEN, OTA_MASTER_SEND_PKG_SIZE);
  145. // if(pmsg->subPkgId%30)
  146. slave_send_data_to_uart(0x04,0x1004,(uint8_t*)pmsg,sizeof(updateCmd0x1004)+OTA_MASTER_SEND_PKG_SIZE);
  147. // for(i=0;i< sizeof(updateCmd0x1004)+OTA_MASTER_SEND_PKG_SIZE-OTA_CONTINUES_INFO_LEN;i++){
  148. // printf("%02x ",_buff[i]);
  149. // }
  150. // printf("\r\n");
  151. // printf("发送间隔:%u\n",msg->sendInterval);
  152. // start_delay_ms(msg->sendInterval);
  153. while(!g_iDelayfinish);
  154. }
  155. printf("continue finish, start repeat\r\n");
  156. }
  157. void ota_master_init_update_msg(dnUpdateCmd0x1004 *msg,uint32_t version,uint32_t totallen,uint16_t losepage)
  158. {
  159. memset(&ota_devMsg,0,sizeof(otaUpdatMsg));
  160. ota_devMsg.rcvDevType = msg->rcvDevType; // 接收设备类型
  161. ota_devMsg.rcvDevSn = msg->rcvDevSn; // 接收设备SN
  162. ota_devMsg.desDevType = msg->desDevType; // 升级目标设备类型
  163. ota_devMsg.desDevSn = msg->desDevSn; // 升级目标设备SN
  164. ota_devMsg.firmType = msg->firmType; // 升级的固件类型
  165. ota_devMsg.version = version;
  166. ota_devMsg.totalByte = totallen; // 升级的总大小
  167. ota_devMsg.losePage = losepage;
  168. ota_devMsg.sendInterval = 300;
  169. ota_devMsg.totalPage = totallen/OTA_MASTER_SEND_PKG_SIZE;
  170. if(totallen%OTA_MASTER_SEND_PKG_SIZE) ota_devMsg.totalPage += 1;
  171. ota_devMsg.subPkgLen = OTA_MASTER_SEND_PKG_SIZE;
  172. ota_devMsg.subPkgId = 1;
  173. ota_devMsg.lastRightPkgNum = 1;
  174. ota_devMsg.lossPkgIndex = 0;
  175. }
  176. /*-------------------------------------------------------------------------------
  177. * 从设备初化
  178. * ------------------------------------------------------------------------------*/
  179. void ota_slave_init_update_msg(updateCmd0x1003 *msg)
  180. {
  181. memset(&ota_devMsg,0,sizeof(otaUpdatMsg));
  182. ota_devMsg.rcvDevType = msg->rcvDevType; // 接收设备类型
  183. ota_devMsg.rcvDevSn = msg->rcvDevSn; // 接收设备SN
  184. ota_devMsg.desDevType = msg->desDevType; // 升级目标设备类型
  185. ota_devMsg.desDevSn = msg->desDevSn; // 升级目标设备SN
  186. ota_devMsg.firmType = msg->firmType; // 固件类型
  187. ota_devMsg.totalByte = msg->totalByte; // 升级总总长度
  188. ota_devMsg.eachMaxByte = msg->eachMaxByte; // 单包最大字节类
  189. ota_devMsg.losePage = msg->losePage; // 最大丢包面分比 最小为10%,最大为60%
  190. ota_devMsg.sendInterval = msg->sendInterval; // 连续阶段发 送包的时间间隔(单位:ms)
  191. ota_devMsg.totalPage = msg->totalByte/OTA_MASTER_SEND_PKG_SIZE; //总包数
  192. if(msg->totalByte%OTA_MASTER_SEND_PKG_SIZE) ota_devMsg.totalPage += 1;
  193. ota_devMsg.loseTotalPage = (ota_devMsg.totalPage*ota_devMsg.losePage)/100;//计算最大丢包数
  194. ota_devMsg.loseTotalPage = (ota_devMsg.loseTotalPage>250)?250:ota_devMsg.loseTotalPage;//最大丢包数不能超过250个
  195. printf("losetotalpage=%d\n",ota_devMsg.loseTotalPage);
  196. ota_devMsg.subPkgId = 1; // 升级包编号
  197. ota_devMsg.subPkgLen = 0; // 本升级包的长度
  198. ota_devMsg.lastRightPkgNum = 1;
  199. ota_devMsg.lossPkgIndex = 0;
  200. }
  201. /*--------------------------------------------------------------------------
  202. * 主设备升级从设备
  203. * -------------------------------------------------------------------------*/
  204. void ota_master_update_salve(otaUpdatMsg*msg,uint32_t addr)
  205. {
  206. uint8_t i;
  207. updateCmd0x1003 pMsg;
  208. pMsg.rcvDevType = msg->rcvDevType;
  209. pMsg.rcvDevSn = msg->rcvDevSn;
  210. pMsg.desDevType = msg->desDevType;
  211. pMsg.desDevSn = msg->desDevSn;
  212. pMsg.firmType = msg->firmType;
  213. pMsg.updateVer = msg->version;
  214. pMsg.totalByte = msg->totalByte;
  215. pMsg.eachMaxByte= OTA_MASTER_SEND_PKG_SIZE;
  216. pMsg.losePage = msg->losePage;
  217. pMsg.sendInterval = msg->sendInterval;
  218. for(i=0;i<3;i++){ // 下发启动升级指令
  219. slave_send_data_to_uart(0x04,0x1003,(uint8_t*)&pMsg,sizeof(updateCmd0x1003));
  220. start_delay_ms(2000);
  221. while(!g_iDelayfinish);
  222. }
  223. set_start_ota_timer(&g_otaTimer.totalTmr,OTA_TIM_TOTALTMR); // 升级的总时间
  224. printf("启动升级总定时时间\r\n");
  225. ota_master_update_slave_continue(msg,addr);// 处理连续升级指令
  226. set_start_ota_timer(&g_otaTimer.repeatTmr,OTA_TIM_REPEAT); //启动重传定时器
  227. printf("启动升级重传时间\r\n");
  228. }
  229. /*--------------------------------------------------------------------------
  230. * 主设备升级
  231. * updateType: 1: 升级主设备 2:升级从设备
  232. * -------------------------------------------------------------------------*/
  233. void ota_master_update_task(uint16_t cmd,uint8_t *data)
  234. {
  235. uint32_t Version;
  236. char *binPos = NULL;
  237. uint8_t updateCode,sendbuff[200] = {0};
  238. uint8_t *p_content = NULL;
  239. uint16_t pages = 0,send_data_dr2 = 0,losepage = 10;
  240. uint32_t fileVer,addr,filelen,crcVl,fixChar,getcrc;
  241. uint32_t start_addr = 0, total_len = 0, remain_len, read_len;
  242. dnUpdateCmd0x1002 *msg1002 = NULL;
  243. dnUpdateCmd0x1004 *msg = NULL;
  244. if(cmd == 0x1002){
  245. msg = (dnUpdateCmd0x1004*)sendbuff;
  246. msg1002 = (dnUpdateCmd0x1002*)data;
  247. msg->devType = g_devMsg.devType;
  248. msg->devSn = g_devMsg.devSn;
  249. msg->rcvDevType = msg1002->devType;
  250. msg->rcvDevSn = msg1002->devSn;
  251. msg->desDevType = msg1002->devType;
  252. msg->desDevSn = msg1002->devSn;
  253. msg->firmType = msg1002->firmType;
  254. msg->taskId = msg1002->taskId;
  255. msg->urllen = msg1002->urllen;
  256. memcpy(msg->url,msg1002->url,msg->urllen);
  257. losepage = msg1002->losePage;
  258. }
  259. else {
  260. msg = (dnUpdateCmd0x1004*)data;
  261. losepage = 10;
  262. }
  263. printf("主设备收到升级指令\r\n");
  264. g_devMsg.workMode = WORK_UPDATE;
  265. g_devMsg.ledgreen = 2;
  266. send_update_code_to_serve(msg->desDevType,msg->desDevSn,msg->taskId,UPDATE_RECEIVE_UPDATEFLAG,0x03);
  267. waiting_4g_tx_fifo_empty();
  268. start_delay_ms(1000);
  269. while(!g_iDelayfinish);
  270. bkp_data_write(BKP_DATA_3, msg->taskId);// 升级任务号 BKP_DATA_4
  271. g_updateDa.taskNo = msg->taskId;
  272. binPos = strstr((char*)msg->url,".bin") - 8;
  273. memset(_buff,0,sizeof(_buff));
  274. memcpy(_buff,binPos,8);
  275. sscanf((char*)_buff,"%x",&Version);
  276. memcpy(_buff,msg->url,msg->urllen);
  277. _buff[msg->urllen] = '\0';
  278. AIR_HTTP_GET((char*)_buff,&total_len); // 得到文件总大小
  279. if(total_len<=2){
  280. updateCode = UPDATE_DOWNLOADFILE_FAILED;// 文件下载失败
  281. goto UPDATE_END;
  282. }
  283. else if(total_len>98304){ // 96K的文件
  284. updateCode = UPdATE_FILE_LEN_ERROR;
  285. goto UPDATE_END;
  286. }
  287. Flash_RangeErase(OTA_UPDATE_APP3_FLASH_START_ADDR, OTA_UPDATE_APP3_FLASH_SIZE); // 擦除APP3区
  288. printf("total len=%d\n",total_len);
  289. while(start_addr < total_len) {//每次读取512字节,写入到flash中
  290. remain_len = total_len - start_addr;
  291. read_len = (remain_len > 512)?512:remain_len;
  292. p_content = AIR_HTTP_READ(start_addr, read_len);
  293. printf("update recive page = %d\r\n",pages++);
  294. //data_dump("Update Data", p_content+read_len-16,16);// read_len);
  295. Flash_BufferWrite(OTA_UPDATE_APP3_FLASH_START_ADDR + start_addr, (uint32_t *)p_content, read_len);
  296. start_addr += read_len;
  297. }
  298. crcVl = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+total_len-4); //CRC校验
  299. fixChar = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+total_len-8); // 固定字符 WBJW
  300. fileVer = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+total_len-12); // 固件信息
  301. filelen = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+total_len-20); // 文件总长度
  302. addr = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+total_len-16); // 文件写入的地址
  303. app_check_crc(OTA_UPDATE_APP3_FLASH_START_ADDR,OTA_UPDATE_APP3_FLASH_SIZE,&getcrc);
  304. printf("crcVl=%08x, getcrc=%08x\n",crcVl,getcrc);
  305. if(getcrc!=crcVl) {
  306. updateCode = UPDATE_CRCERROR;
  307. printf("update file crc error\r\n");// 升级文件crc校验错误
  308. goto UPDATE_END;
  309. }
  310. if(Version!=fileVer){
  311. updateCode = UPDATE_URL_FILE_TYPE_ERROR;
  312. goto UPDATE_END;
  313. }
  314. printf("~~~~~~~~update file download sucess~~~~~~~~~~\r\n");
  315. send_update_code_to_serve(msg->desDevType,msg->desDevSn,msg->taskId,UPDATE_DOWNLOADFILE_SUCCESS,0x03); // 文件下载成功并写入到APP3中
  316. waiting_4g_tx_fifo_empty();
  317. bkp_data_write(BKP_DATA_3, msg->taskId); // 升级任务号
  318. if(cmd == 0x1004){
  319. if(msg->desDevSn != g_devMsg.devSn){
  320. g_updateDa.iDentity = IDENTITY_MASTER;//标记为下发升级设备
  321. ota_master_init_update_msg(msg,Version,total_len,losepage);
  322. ota_master_update_salve(&ota_devMsg,OTA_UPDATE_APP3_FLASH_START_ADDR);
  323. return;
  324. }
  325. }
  326. if(msg->desDevType == DEV_TYPE){
  327. if(fixChar != 0x57424A57) {//固定字符错误
  328. goto UPDATE_END;
  329. }
  330. if((fileVer&0xfffff000) != (APP_VERSION&0xFFFFF000)){ //固件信息错误
  331. updateCode = UPDATE_DEVICETYPEERROR;
  332. goto UPDATE_END;
  333. }
  334. if(msg->desDevSn == g_devMsg.devSn || (0xFFFFFFFF == msg->desDevSn)){//|| (0xFFFFFFFF == msg->devSn)
  335. //if(0xFFFFFFFF == msg->desDevSn) bkp_data_write(BKP_DATA_5,(uint16_t)UPDATE_SLAVE);// 记录升级的设备,如果是广播升级,则需要重新启动后,升级从设备
  336. //else bkp_data_write(BKP_DATA_5,0);
  337. g_updateDa.bfirmware_type = msg->firmType;
  338. bkp_data_write(BKP_DATA_6,g_updateDa.bfirmware_type);//记录固件类型
  339. printf("1\n");
  340. send_data_dr2 = set_updata_state(UPDATE_DOWNLOADFILE_SUCCESS);
  341. bkp_data_write(BKP_DATA_2, send_data_dr2); // 写入状态码
  342. send_data_dr2 = set_updata_state(UPDATE_FLAG); // 升级标志0x81,bootloader可以根据此标志进行升级
  343. bkp_data_write(BKP_DATA_1, send_data_dr2); // 写入标志码
  344. g_updateDa.Update_Source = UP_PROG_FROM_NET;
  345. bkp_data_write(BKP_DATA_4, UP_PROG_FROM_NET); // 升级的来源 0x22 来源来网络服务下发的
  346. start_delay_ms(2000);
  347. while(!g_iDelayfinish);
  348. printf("\r\n gateway update ======================\r\n");
  349. NVIC_SystemReset();//复位//设备重新启动//写升级标志位,然后复位,进入bootloader程序中
  350. }
  351. }
  352. else { // 从设备升级
  353. g_updateDa.iDentity = IDENTITY_MASTER;//标记为下发升级设备
  354. ota_master_init_update_msg(msg,Version,total_len,losepage);
  355. ota_master_update_salve(&ota_devMsg,OTA_UPDATE_APP3_FLASH_START_ADDR);
  356. }
  357. return;
  358. UPDATE_END:
  359. send_update_code_to_serve(msg->desDevType,msg->desDevSn,msg->taskId,updateCode,0x03);
  360. waiting_4g_tx_fifo_empty();
  361. g_devMsg.workMode = WORK_NORMAL;
  362. return;
  363. }
  364. //重传随机延时
  365. void ota_repeat_rand_timer(uint8_t status)
  366. {
  367. static uint32_t randDa;
  368. // srand(randDa+g_devMsg.devSn);
  369. if(status == 0)
  370. randDa = rand()%150 + 200;
  371. else
  372. randDa = rand()%150 + 500;
  373. printf("重传随机时间 = %d\r\n",randDa);
  374. set_start_ota_timer(&g_otaTimer.repeatRandomTmr,randDa);
  375. }
  376. void ota_check_update_timer(void)
  377. {
  378. int i;
  379. uint32_t randDa;
  380. //if(g_updateDa.Work_State == OTA_UPDATE_CONTINUE_END){
  381. ota_update_slave_continue_end(g_updateDa.Work_State);
  382. //}
  383. if(ota_timer_is_timeout(&g_otaTimer.totalTmr)){ // 总定时器超时
  384. g_updateDa.Work_State = OTA_UPDATE_NULL;
  385. //g_devMsg.workMode = WORK_NORMAL;
  386. reset_work_mode();
  387. printf("启动升级总定时时间--超时\r\n");
  388. }
  389. if(ota_timer_is_timeout(&g_otaTimer.onlookerTmr)){ // 旁观都定时器超时
  390. if(g_updateDa.iDentity == IDENTITY_SLAVE)
  391. {
  392. if(g_updateDa.ResetUpdate_s)
  393. {
  394. g_updateDa.ResetUpdate_s = 0;
  395. g_updateDa.bResetUpdate = 1;
  396. randDa = rand()%150+200;
  397. set_start_ota_timer(&g_otaTimer.randomTmr,randDa);
  398. printf("上报升级状态\n");
  399. }
  400. }
  401. //g_devMsg.workMode = WORK_NORMAL;
  402. reset_work_mode();
  403. ota_timer_stop(&g_otaTimer.continueTmr);
  404. ota_timer_stop(&g_otaTimer.repeatTmr);
  405. ota_timer_stop(&g_otaTimer.totalTmr);
  406. printf("旁观者时间到\r\n");
  407. }
  408. if(ota_timer_is_timeout(&g_otaTimer.continueTmr)) {
  409. printf("连续发包超时\n");
  410. if(IDENTITY_MASTER != g_updateDa.iDentity)//被升级设备
  411. {
  412. for(i=ota_devMsg.lastRightPkgNum;i<ota_devMsg.totalPage;i++){
  413. ota_devMsg.losePkgNum++;
  414. ota_devMsg.lossPkgId[ota_devMsg.lossPkgIndex++] = i;
  415. if(ota_devMsg.losePkgNum == ota_devMsg.loseTotalPage) {// 丢10条
  416. set_start_ota_timer(&g_otaTimer.onlookerTmr,OTA_TIM_ONLOOKER);
  417. updata_state_save = set_updata_state(PACKET_LOSS_MORE);// 丢包太多
  418. bkp_data_write(BKP_DATA_2,updata_state_save);
  419. return;
  420. }
  421. }
  422. if(ota_devMsg.losePkgNum)//有丢包,开始重传
  423. {
  424. g_updateDa.Work_State = OTA_UPDATE_REPEAT;
  425. set_start_ota_timer(&g_otaTimer.repeatTmr,OTA_TIM_REPEAT);
  426. ota_repeat_rand_timer(0);//重传随机延时
  427. }
  428. }
  429. }
  430. if(ota_timer_is_timeout(&g_otaTimer.repeatTmr)){
  431. printf("启动升级重传时间--超时\r\n");
  432. if(IDENTITY_MASTER != g_updateDa.iDentity)//被升级设备
  433. {
  434. updata_state = RETRANSMIT_TIMEOUT;
  435. updata_state_save = set_updata_state(updata_state);
  436. bkp_data_write(BKP_DATA_2, updata_state_save);
  437. g_updateDa.Work_State = OTA_UPDATE_ONLOOKER;
  438. ota_timer_stop(&g_otaTimer.repeatRandomTmr);
  439. ota_timer_stop(&g_otaTimer.repeatTmr);
  440. }
  441. else//下发升级的设备
  442. {
  443. ota_timer_stop(&g_otaTimer.repeatRandomTmr);
  444. ota_timer_stop(&g_otaTimer.repeatTmr);
  445. set_start_ota_timer(&g_otaTimer.upstatusTmr,10*1000);
  446. }
  447. }
  448. if(ota_timer_is_timeout(&g_otaTimer.upstatusTmr)){ // 读取状态时间
  449. ota_timer_stop(&g_otaTimer.totalTmr);
  450. ota_timer_stop(&g_otaTimer.repeatTmr);
  451. //g_devMsg.workMode = WORK_NORMAL;
  452. reset_work_mode();
  453. g_updateDa.Work_State = OTA_UPDATE_NULL;
  454. memset(&g_updateDa,0,sizeof(UpdateDa));//
  455. printf("状态已经上报,升级结束\r\n");
  456. }
  457. }
  458. /*---------------------------------------------------------------------------
  459. * 从设备运行的升级任务
  460. * ---------------------------------------------------------------------------*/
  461. void ota_update_slave_task(uint16_t cmd,uint8_t *data,uint8_t len)
  462. {
  463. uint16_t totalPkg,i;
  464. uint32_t otaContinueTmr;
  465. updateCmd0x1003 *msg1003 = NULL;
  466. updateCmd0x1004 *msg1004 = NULL;
  467. updateCmd0x1005 *msg1005 = NULL;
  468. if(OTA_UPDATE_ONLOOKER == g_updateDa.Work_State) { //旁观者身份
  469. set_start_ota_timer(&g_otaTimer.onlookerTmr,OTA_TIM_ONLOOKER);
  470. printf("cur mode outlooker \r\n");
  471. }
  472. else {
  473. switch(cmd){
  474. case 0x1003:
  475. msg1003 = (updateCmd0x1003*)data;
  476. g_devMsg.workMode = WORK_UPDATE;
  477. g_devMsg.ledgreen = 2;
  478. if(0 == check_dev_type_sn(msg1003->desDevType,msg1003->desDevSn)){
  479. g_updateDa.Work_State = OTA_UPDATE_ONLOOKER;
  480. set_start_ota_timer(&g_otaTimer.onlookerTmr,OTA_TIM_ONLOOKER);// 打开旁观者定时器
  481. printf("cur mode outlooker \r\n");
  482. break;
  483. }
  484. if(OTA_UPDATE_NULL == g_updateDa.Work_State){
  485. Flash_RangeErase(OTA_UPDATE_APP3_FLASH_START_ADDR, OTA_UPDATE_APP3_FLASH_SIZE); //擦除app3
  486. }
  487. g_updateDa.iDentity = IDENTITY_SLAVE;//标记为被升级状态
  488. g_updateDa.ResetUpdate_s = 1;//需要上报升级状态
  489. g_updateDa.Update_Source = UP_PROG_FROM_GAT;
  490. bkp_data_write(BKP_DATA_4, UP_PROG_FROM_GAT); // 升级的来源 0x44 来源来网关下发的
  491. g_updateDa.bfirmware_type = msg1003->firmType;
  492. bkp_data_write(BKP_DATA_6,g_updateDa.bfirmware_type);//记录固件类型
  493. set_start_ota_timer(&g_otaTimer.totalTmr,OTA_TIM_TOTALTMR); // 打开总定时器
  494. //收到升级指令
  495. updata_state = START_UPDATA;
  496. updata_state_save = set_updata_state(updata_state);
  497. bkp_data_write(BKP_DATA_2, updata_state_save);
  498. g_updateDa.Work_State = OTA_UPDATE_BEGIN;
  499. totalPkg = (msg1003->totalByte%msg1003->eachMaxByte) ? msg1003->totalByte/msg1003->eachMaxByte+1 : msg1003->totalByte/msg1003->eachMaxByte;
  500. otaContinueTmr = totalPkg*msg1003->sendInterval + OTA_TIM_CONTINUE;
  501. if(otaContinueTmr > 8*60*1000){
  502. g_updateDa.Work_State = OTA_UPDATE_ONLOOKER;
  503. set_start_ota_timer(&g_otaTimer.onlookerTmr,OTA_TIM_ONLOOKER);
  504. return;
  505. }
  506. ota_slave_init_update_msg(msg1003);
  507. set_start_ota_timer(&g_otaTimer.continueTmr,otaContinueTmr); // 启用续传定时器
  508. printf("ota_totle_byte:%d, ota_totle_pkg:%d\n",msg1003->totalByte,totalPkg);
  509. printf("send interval:%d, continuous time:%d\n",msg1003->sendInterval,otaContinueTmr);
  510. break;
  511. case 0x1004:
  512. msg1004 = (updateCmd0x1004*)data;
  513. if((OTA_UPDATE_BEGIN == g_updateDa.Work_State) || (OTA_UPDATE_CONTINUE == g_updateDa.Work_State)){
  514. if(0 == check_dev_type_sn(msg1004->desDevType,msg1004->desDevSn)){
  515. g_updateDa.Work_State = OTA_UPDATE_ONLOOKER;
  516. set_start_ota_timer(&g_otaTimer.onlookerTmr,OTA_TIM_ONLOOKER);// 打开旁观者定时器
  517. ota_timer_stop(&g_otaTimer.continueTmr);// 关闭连续定时器
  518. break;
  519. }
  520. if(msg1004->subPkgLen > ota_devMsg.eachMaxByte) break; // 接收错误
  521. if(OTA_UPDATE_BEGIN == g_updateDa.Work_State) g_updateDa.Work_State = OTA_UPDATE_CONTINUE;
  522. if((msg1004->totalPage == ota_devMsg.totalPage) && (msg1004->subPkgId <= ota_devMsg.totalPage)){
  523. printf("update continue type=0x%x,sn=0x%x,{%d/%d/%d}\r\n",msg1004->rcvDevType,msg1004->rcvDevSn,
  524. msg1004->totalPage,msg1004->subPkgId,ota_devMsg.losePkgNum);
  525. Flash_BufferWrite(OTA_UPDATE_APP3_FLASH_START_ADDR + (msg1004->subPkgId - 1)*OTA_MASTER_SEND_PKG_SIZE,
  526. (uint32_t *)((data+OTA_CONTINUES_INFO_LEN)), msg1004->subPkgLen);
  527. //data_dump("收到1004",(uint8_t*)data+OTA_CONTINUES_INFO_LEN,msg1004->subPkgLen);
  528. for(i=ota_devMsg.lastRightPkgNum;i<msg1004->subPkgId;i++){
  529. ota_devMsg.losePkgNum++;
  530. ota_devMsg.lossPkgId[ota_devMsg.lossPkgIndex++] = i;
  531. if(ota_devMsg.losePkgNum == ota_devMsg.loseTotalPage) {// 丢10条
  532. set_start_ota_timer(&g_otaTimer.onlookerTmr,OTA_TIM_ONLOOKER);
  533. updata_state_save = set_updata_state(PACKET_LOSS_MORE);// 丢包太多
  534. bkp_data_write(BKP_DATA_2,updata_state_save);
  535. return;
  536. }
  537. }
  538. ota_devMsg.lastRightPkgNum = msg1004->subPkgId +1;
  539. if(msg1004->subPkgId == msg1004->totalPage){ // 最后一包
  540. if(0 == ota_devMsg.losePkgNum){ // 没有丢包
  541. printf("传输完成,没有丢包\r\n");
  542. ota_timer_stop(&g_otaTimer.continueTmr);// 关闭连续定时器
  543. g_updateDa.Work_State = OTA_UPDATE_CONTINUE_END; // 接收完成
  544. printf("check program right\r\n");
  545. }
  546. else { // 有丢包
  547. printf("传输完成,有丢包,启动重传指令\r\n");
  548. g_updateDa.Work_State = OTA_UPDATE_REPEAT;
  549. set_start_ota_timer(&g_otaTimer.repeatTmr,OTA_TIM_REPEAT);
  550. ota_repeat_rand_timer(0);//重传随机延时
  551. }
  552. ota_timer_stop(&g_otaTimer.continueTmr);// 关闭连续定时器
  553. }
  554. else { // 不是最后一包
  555. }
  556. }
  557. }
  558. else {
  559. g_updateDa.Work_State = OTA_UPDATE_ONLOOKER;
  560. set_start_ota_timer(&g_otaTimer.onlookerTmr,OTA_TIM_ONLOOKER);
  561. ota_timer_stop(&g_otaTimer.continueTmr);// 关闭连续定时器
  562. }
  563. break;
  564. case 0x1005:
  565. msg1005 = (updateCmd0x1005*)data;
  566. if(g_updateDa.Work_State == OTA_UPDATE_REPEAT) {
  567. // ota_timer_stop(&g_otaTimer.repeatTmr);
  568. if(msg1005->totalPage == ota_devMsg.totalPage){
  569. if(msg1005->subPkgLen > OTA_MASTER_SEND_PKG_SIZE) return;
  570. //判定该包是否为本设备丢的那些包之中的子包
  571. for(i = 0;i < ota_devMsg.lossPkgIndex;i++) {
  572. if(ota_devMsg.lossPkgId[i] == msg1005->subPkgId) {
  573. ota_devMsg.losePkgNum--;
  574. ota_devMsg.lossPkgId[i] = 0;
  575. //接受本包并写入flash的对应位置
  576. Flash_BufferWrite(OTA_UPDATE_APP3_FLASH_START_ADDR + (msg1005->subPkgId - 1)*OTA_MASTER_SEND_PKG_SIZE,
  577. (uint32_t *)(data+OTA_CONTINUES_INFO_LEN ), msg1005->subPkgLen);
  578. printf("rcv retransmit pkgid:%d\n",msg1005->subPkgId);
  579. break;
  580. }
  581. }
  582. if(ota_devMsg.losePkgNum == 0) //丢包已收完
  583. {
  584. //ota_continuous_end_flag = OTA_CONTINUOUS_DIRECT;
  585. //g_updateDa.Work_State = DEV_WORK_STATE_OTA_UPGRADE_RCV_END;
  586. g_updateDa.Work_State = OTA_UPDATE_REPEAT_END;
  587. ota_timer_stop(&g_otaTimer.repeatRandomTmr);
  588. }
  589. printf("ota_info.lossPkgCounter = %d, lossPkgId:%d\r\n", ota_devMsg.losePkgNum,msg1005->subPkgId);
  590. //指示灯显示
  591. //remain_pkg = ota_info.lossPkgCounter; //gch
  592. }
  593. // set_start_ota_timer(&g_otaTimer.repeatTmr,OTA_TIM_REPEAT);
  594. g_updateDa.retransmit_s = 0;
  595. }
  596. else {
  597. g_updateDa.Work_State = OTA_UPDATE_ONLOOKER;
  598. set_start_ota_timer(&g_otaTimer.onlookerTmr,OTA_TIM_ONLOOKER);
  599. ota_timer_stop(&g_otaTimer.continueTmr);// 关闭连续定时器
  600. }
  601. break;
  602. }
  603. }
  604. }
  605. void ota_update_slave_retransmit(uint16_t index)
  606. {
  607. updateCmd0x2005 *msg = (updateCmd0x2005*)_buff;
  608. memset(_buff,0,256);
  609. msg->slaveDevType = g_devMsg.devType;
  610. msg->slaveDevSn = g_devMsg.devSn;
  611. msg->repDevType = g_devMsg.devType;
  612. msg->repDevSn = g_devMsg.devSn;
  613. msg->repPkgId = index;
  614. slave_send_data_to_uart(0x04,0x2005,(uint8_t*)msg,sizeof(updateCmd0x2005));
  615. }
  616. /*----------------------------------------------------------------------------
  617. * 主设备收到重传指令
  618. * ---------------------------------------------------------------------------*/
  619. void ota_update_master_retransmit(uint8_t *data)
  620. {
  621. updateCmd0x2005 *msg = (updateCmd0x2005*)data;
  622. updateCmd0x1005 *pmsg = (updateCmd0x1005*)_buff;
  623. ota_timer_stop(&g_otaTimer.repeatTmr);
  624. memset(_buff,0,256);
  625. pmsg->rcvDevSn = ota_devMsg.rcvDevSn; //msg->slaveDevSn; ota_devMsg.rcvDevSn;
  626. pmsg->rcvDevType = ota_devMsg.rcvDevType; //msg->slaveDevType; ota_devMsg.rcvDevType;
  627. pmsg->desDevSn = ota_devMsg.desDevSn; //msg->repDevSn; ota_devMsg.desDevSn;
  628. pmsg->desDevType = ota_devMsg.desDevType; //msg->repDevType; ota_devMsg.desDevType;
  629. pmsg->subPkgId = msg->repPkgId;
  630. pmsg->subPkgLen = OTA_MASTER_SEND_PKG_SIZE;
  631. pmsg->totalPage = ota_devMsg.totalPage;
  632. Flash_BufferRead(OTA_UPDATE_APP3_FLASH_START_ADDR + (pmsg->subPkgId - 1)*OTA_MASTER_SEND_PKG_SIZE,
  633. ((uint8_t *)pmsg) + OTA_CONTINUES_INFO_LEN, OTA_MASTER_SEND_PKG_SIZE);
  634. slave_send_data_to_uart(0x04,0x1005,(uint8_t*)pmsg,sizeof(updateCmd0x1005)+OTA_MASTER_SEND_PKG_SIZE);
  635. set_start_ota_timer(&g_otaTimer.repeatTmr,OTA_TIM_REPEAT);
  636. }
  637. void ota_update_slave_continue_end(uint8_t workMode)
  638. {
  639. uint32_t crcVl,fixChar,fileVer,filelen,i;
  640. uint32_t getcrc;
  641. switch(workMode){
  642. case OTA_UPDATE_CONTINUE_END: case OTA_UPDATE_REPEAT_END:
  643. crcVl = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+ota_devMsg.totalByte-4); //CRC校验
  644. fixChar = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+ota_devMsg.totalByte-8); // 固定字符 WBJW
  645. fileVer = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+ota_devMsg.totalByte-12); // 固件信息
  646. filelen = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+ota_devMsg.totalByte-20); // 文件总长度
  647. printf("read_fixchar:%08x, fixchar:%08x\n",fixChar,0x57424A57);
  648. if(fixChar != 0x57424A57) //固定字符错误
  649. {
  650. g_updateDa.Work_State = OTA_UPDATE_ONLOOKER;
  651. set_start_ota_timer(&g_otaTimer.onlookerTmr,OTA_TIM_ONLOOKER); //打开旁观者定时器
  652. updata_state = FIXED_CHARACTER_ERROR;
  653. updata_state_save = set_updata_state(updata_state);
  654. bkp_data_write(BKP_DATA_2, updata_state_save);
  655. printf("fixChar error\r\n");// 升级文件固定字符校验错误
  656. return;
  657. }
  658. printf("read_filever:%08x, device_type:%08x\n",fileVer,0x01013000);
  659. if((fileVer&0xfffff000) != (APP_VERSION&0xFFFFF000)) //固件信息错误
  660. {
  661. g_updateDa.Work_State = OTA_UPDATE_ONLOOKER;
  662. set_start_ota_timer(&g_otaTimer.onlookerTmr,OTA_TIM_ONLOOKER); //打开旁观者定时器
  663. updata_state = DEVICE_TYPE_ERROR;
  664. updata_state_save = set_updata_state(updata_state);
  665. bkp_data_write(BKP_DATA_2, updata_state_save);
  666. printf("fileVer error\r\n");// 升级文件固件信息校验错误
  667. return;
  668. }
  669. printf("read_filelen:%08x, total_bytes:%08x\n",filelen,(ota_devMsg.totalByte-20));
  670. if(ota_devMsg.totalByte != (filelen+20))//长度错误
  671. {
  672. g_updateDa.Work_State = OTA_UPDATE_ONLOOKER;
  673. set_start_ota_timer(&g_otaTimer.onlookerTmr,OTA_TIM_ONLOOKER); //打开旁观者定时器
  674. updata_state = UPDATA_PACKAGE_LENGTH_ERROR;
  675. updata_state_save = set_updata_state(updata_state);
  676. bkp_data_write(BKP_DATA_2, updata_state_save);
  677. printf("filelen error\r\n");// 升级文件长度校验错误
  678. return;
  679. }
  680. app_check_crc(OTA_UPDATE_APP3_FLASH_START_ADDR,OTA_UPDATE_APP3_FLASH_SIZE,&getcrc);
  681. printf("read_crc:%x, get_crc:%x\n",crcVl,getcrc);
  682. if(getcrc!=crcVl) { //校验错误
  683. printf("update file crc error\r\n");// 升级文件crc校验错误
  684. g_updateDa.Work_State = OTA_UPDATE_ONLOOKER;
  685. set_start_ota_timer(&g_otaTimer.onlookerTmr,OTA_TIM_ONLOOKER); //打开旁观者定时器
  686. updata_state = UPDATA_CRC_ERROR;
  687. updata_state_save = set_updata_state(updata_state);
  688. bkp_data_write(BKP_DATA_2, updata_state_save);
  689. return;
  690. }
  691. printf("收包正确\n");
  692. updata_state = UPDATA_DATA_SUCCESS;
  693. updata_state_save = set_updata_state(updata_state);
  694. bkp_data_write(BKP_DATA_2, updata_state_save);
  695. updata_state = set_updata_state(UPDATE_FLAG);//置升级标志
  696. bkp_data_write(BKP_DATA_1, updata_state);
  697. //g_firmwareMsg.gatewayMsg.verMsg.gate_appVr3 = fileVer;//存储APP3版本
  698. //fram_write_gateway_version();
  699. NVIC_SystemReset();
  700. break;
  701. case OTA_UPDATE_REPEAT:
  702. // if(!timeout_isOut(&g_otaTimer.randomTmr.timer)) break;
  703. if(!timeout_isOut(&g_otaTimer.repeatRandomTmr.timer)) break;
  704. // if(1 == g_updateDa.bRetransmit) break;
  705. dma_channel_disable(DMA1, DMA_CH2);
  706. if(USART3_RX_SIZE - dma_transfer_number_get(DMA1,DMA_CH2))
  707. {
  708. dma_channel_enable(DMA1, DMA_CH2);/* enable USART1_RX DMA_Channel */
  709. ota_repeat_rand_timer(1);//重传随机延时
  710. break;
  711. }
  712. dma_channel_enable(DMA1, DMA_CH2);/* enable USART1_RX DMA_Channel */
  713. for(i = 0;i < ota_devMsg.lossPkgIndex;i++) {
  714. if(ota_devMsg.lossPkgId[i])
  715. {
  716. ota_update_slave_retransmit(ota_devMsg.lossPkgId[i]);
  717. printf("send retransmit pkgid:%d\n",ota_devMsg.lossPkgId[i]);
  718. g_updateDa.bRetransmit = 1;
  719. g_updateDa.retransmit_s = 1;
  720. break;
  721. }
  722. }
  723. ota_repeat_rand_timer(0);//重传随机延时
  724. break;
  725. }
  726. }
  727. void ota_update_send_update_status(uint16_t desDevType,uint32_t desDevSn)
  728. {
  729. updateCmd0x2007 *msg = (updateCmd0x2007*)_buff;
  730. memset(_buff,0,256);
  731. msg->slaveDevType = g_devMsg.devType;
  732. msg->slaveDevSn = g_devMsg.devSn;
  733. msg->desDevType = desDevType;
  734. msg->desDevSn = desDevSn;
  735. msg->ptVer = g_devAppVer.ptVer;
  736. msg->appVer = APP_VERSION;
  737. msg->updateCode = g_updateDa.updateCode;
  738. msg->reserve = 0x00;
  739. slave_send_data_to_uart(0x04,0x2007,(uint8_t*)_buff,sizeof(updateCmd0x2007));
  740. }
  741. void ota_update_deal_upstatus(void)
  742. {
  743. static uint8_t flag = 0;
  744. if((0x01 ==g_updateDa.bResetUpdate) ) { // 连接网络且有升级
  745. if(g_updateDa.Update_Source == UP_PROG_FROM_NET){//升级来源于网络
  746. if(0x01 == g_4gMsg.bconnect){
  747. send_update_code_to_serve(g_devMsg.devType,g_devMsg.devSn,g_updateDa.taskNo,g_updateDa.updateCode,0x03);
  748. printf("上传升级标志到服务器\r\n");
  749. g_updateDa.bResetUpdate = 0;
  750. if(g_updateDa.bUpdate_slave==UPDATE_SLAVE)
  751. {
  752. g_updateDa.bOffline_s = 1;//可以离线升级
  753. g_devMsg.workMode = WORK_UPDATE;
  754. g_devMsg.ledgreen = 2;
  755. }
  756. }
  757. }
  758. else {
  759. if(timeout_isOut(&(g_otaTimer.randomTmr.timer))){ //超时,可以发送
  760. printf("发送升级标志 %d\r\n",g_updateDa.updateCode);
  761. ota_update_send_update_status(g_devMsg.devType,g_devMsg.devSn);
  762. flag++;
  763. if(flag >=3 ){
  764. bkp_data_write(BKP_DATA_2,0);//清除标志备份寄存器
  765. g_updateDa.bResetUpdate = 0x00;
  766. memset(&g_updateDa,0,sizeof(UpdateDa));
  767. flag = 0;
  768. }
  769. set_start_ota_timer(&g_otaTimer.randomTmr,(rand()%150+200));
  770. }
  771. }
  772. }
  773. }
  774. ///////////////////////离线升级////////////////////////////
  775. //读取app程序包的大小并校验
  776. uint32_t Read_APP_datalen_check(uint32_t addr, uint32_t len)
  777. {
  778. uint32_t datalen = 0;
  779. uint32_t crcVl,fixChar,fileVer,filelen,getcrc,t_addr;
  780. uint32_t bin_data[6] = {0};
  781. uint8_t flag = 0;
  782. uint8_t check_flag = 0;
  783. printf("addr=%08x\n",addr);
  784. datalen = Flash_DatalenRead(addr,len);
  785. if((datalen > (96*1024)) || (datalen < (20)))
  786. {
  787. printf("升级包长度超过128K: %d\n",datalen);
  788. datalen = 0;
  789. return datalen;
  790. }
  791. filelen = *(uint32_t*)(addr+datalen-20); // 文件总长度
  792. printf("datalen=%08x,%u; filelen=%08x,%u\n",datalen,datalen,filelen,filelen);
  793. printf("addr=%08x\n",addr);
  794. crcVl = *(uint32_t*)(addr + datalen-4); //CRC校验
  795. fixChar = *(uint32_t*)(addr + datalen-8); // 固定字符 WBJW
  796. fileVer = *(uint32_t*)(addr + datalen-12); // 固件信息
  797. filelen = *(uint32_t*)(addr + datalen-20); // 文件总长度
  798. t_addr = *(uint32_t*)(addr + datalen-16); // 文件写入的地址
  799. printf("crcVl=%08x,fixChar=%08x,fileVer=%08x,filelen=%08x,t_addr=%08x\n",crcVl,fixChar,fileVer,filelen,t_addr);
  800. //判断后20字节是否正确
  801. if((fixChar == 0x57424A57) && (t_addr == 0x08018000))//升级包中包含了后20字节
  802. {
  803. printf("升级包包含了后20字节\n");
  804. if(datalen != (filelen+20))
  805. {
  806. printf("升级包长度校验错误\n");
  807. check_flag = 1;
  808. }
  809. // else if(fileVer != device_fixed_info.Soft_ver_app)
  810. // {
  811. // printf("固件信息错误\n");
  812. // printf("filever=%08x,app=%08x\n",fileVer,device_fixed_info.Soft_ver_app);
  813. // check_flag = 1;
  814. // }
  815. else
  816. {
  817. app_check_crc(addr,datalen,&getcrc);
  818. printf("read_crc:%08x, get_crc:%08x\n",crcVl,getcrc);
  819. if(crcVl != getcrc)
  820. {
  821. printf("crc 错误\n");
  822. check_flag = 1;
  823. }
  824. }
  825. }
  826. else
  827. {
  828. check_flag = 1;
  829. }
  830. if(check_flag)//后20字节错误
  831. {
  832. if(addr==OTA_UPDATE_APP1_FLASH_START_ADDR)//app1需要计算后20个字节
  833. {
  834. bin_data[0] = datalen; //原始bin文件字节长度
  835. bin_data[1] = OTA_UPDATE_APP1_FLASH_START_ADDR; //存储地址
  836. bin_data[2] = APP_VERSION; //固件版本
  837. bin_data[3] = 0x57424A57; //固定标记,"WBJW"
  838. fileVer = bin_data[2];
  839. flag = Flash_BufferWrite(addr+datalen,bin_data,16);
  840. printf("first flag = %d\n",flag);
  841. datalen += 20;
  842. printf("datalen1=%08x\n",datalen);
  843. //app_check_crc(addr,datalen,&getcrc);
  844. rcu_periph_clock_enable(RCU_CRC); //打开crc时钟
  845. crc_data_register_reset(); //复位crc数据寄存器
  846. getcrc = crc_block_data_calculate((uint32_t*)addr,(datalen -4)/4);//计算crc数值
  847. rcu_periph_clock_disable(RCU_CRC); //关闭crc时钟
  848. bin_data[0] = getcrc;
  849. printf("crc=%08x\n",bin_data[0]);
  850. flag = Flash_BufferWrite(addr+datalen-4,bin_data,4); //crc校验
  851. printf("second flag = %d\n",flag);
  852. }
  853. else
  854. {
  855. datalen = 0;
  856. }
  857. }
  858. if(datalen)
  859. {
  860. memset(&ota_devMsg,0,sizeof(otaUpdatMsg));
  861. ota_devMsg.version = fileVer; // 升级的软件版本号
  862. ota_devMsg.totalByte = datalen; // 升级的总大小
  863. }
  864. return datalen;
  865. }
  866. void ota_master_init_update_msg_offline(uint16_t rcvdevtype,uint32_t rcvdevsn,uint16_t desdevtype,uint32_t desdevsn,uint8_t firmtype)
  867. {
  868. // memset(&ota_devMsg,0,sizeof(otaUpdatMsg));
  869. ota_devMsg.rcvDevType = rcvdevtype; // 接收设备类型
  870. ota_devMsg.rcvDevSn = rcvdevsn; // 接收设备SN
  871. ota_devMsg.desDevType = desdevtype; // 升级目标设备类型
  872. ota_devMsg.desDevSn = desdevsn; // 升级目标设备SN
  873. ota_devMsg.firmType = firmtype; // 升级固件类型
  874. // ota_devMsg.version = version; // 升级的软件版本号
  875. // ota_devMsg.totalByte = totallen; // 升级的总大小
  876. ota_devMsg.losePage = 20;
  877. ota_devMsg.sendInterval = 300;
  878. ota_devMsg.totalPage = ota_devMsg.totalByte/OTA_MASTER_SEND_PKG_SIZE;
  879. if(ota_devMsg.totalByte%OTA_MASTER_SEND_PKG_SIZE) ota_devMsg.totalPage += 1;
  880. ota_devMsg.subPkgLen = OTA_MASTER_SEND_PKG_SIZE;
  881. ota_devMsg.subPkgId = 1;
  882. ota_devMsg.lastRightPkgNum = 1;
  883. ota_devMsg.lossPkgIndex = 0;
  884. }
  885. //离线升级初始化
  886. uint8_t ota_offline_init(uint32_t addr,uint32_t len)
  887. {
  888. uint32_t total_bytes = 0;
  889. total_bytes = Read_APP_datalen_check(addr,len);
  890. if(total_bytes==0) //升级包长度错误,升级结束
  891. {
  892. printf("升级包长度错误 ");
  893. return 0;
  894. }
  895. return 1;
  896. }
  897. //离线升级过程
  898. void ota_offline_proc(void)
  899. {
  900. g_updateDa.iDentity = IDENTITY_MASTER;//标记为下发升级设备
  901. g_devMsg.workMode = WORK_UPDATE;
  902. g_devMsg.ledgreen = 2;
  903. ota_master_update_salve(&ota_devMsg,g_updateDa.bOffline_addr);
  904. }
  905. //离线升级处理函数
  906. void ota_offline_handle(void)
  907. {
  908. //离线升级
  909. if(g_updateDa.bOffline_s)
  910. {
  911. g_updateDa.bOffline_s = 0;
  912. printf("开始离线升级\n");
  913. ota_offline_proc();
  914. }
  915. }
  916. //从设备收到离线升级指令
  917. void ota_update_slave_offline(uint8_t *data,uint8_t len)
  918. {
  919. updateCmd0x1006* msg1006 = (updateCmd0x1006*)data;
  920. if(g_devMsg.workMode == WORK_UPDATE) return;
  921. if((msg1006->masterDevType==g_devMsg.devType) && (msg1006->masterDevSn==g_devMsg.devSn))
  922. {
  923. if(msg1006->firmType != 0x03) return; //不是升级app
  924. if(ota_offline_init(OTA_UPDATE_APP1_FLASH_START_ADDR,OTA_UPDATE_APP1_FLASH_SIZE))//升级包正确
  925. {
  926. ota_master_init_update_msg_offline(msg1006->slaveDevType,msg1006->slaveDevSn,msg1006->desDevType,msg1006->desDevSn,msg1006->firmType);
  927. g_updateDa.bOffline_s = 1;//可以离线升级
  928. g_updateDa.bOffline_addr = OTA_UPDATE_APP1_FLASH_START_ADDR;
  929. g_devMsg.workMode = WORK_UPDATE;
  930. g_devMsg.ledgreen = 2;
  931. printf("升级从设备\n");
  932. }
  933. }
  934. }
  935. /*-------------------------------------------------------------------------------
  936. * 按键启动离线升级
  937. * -----------------------------------------------------------------------------*/
  938. void ota_start_offline_update(void)
  939. {
  940. if(g_devMsg.workMode != WORK_UPDATE)//非升级模式
  941. {
  942. if(ota_offline_init(OTA_UPDATE_APP1_FLASH_START_ADDR,OTA_UPDATE_APP1_FLASH_SIZE))//升级包正确
  943. {
  944. ota_master_init_update_msg_offline(DEV_TYPE,0xffffffff,DEV_TYPE,0xffffffff,0x03);//升级app
  945. g_updateDa.bOffline_s = 1;//可以离线升级
  946. g_updateDa.bOffline_addr = OTA_UPDATE_APP1_FLASH_START_ADDR;
  947. printf("升级从设备\n");
  948. }
  949. g_devMsg.workMode = WORK_UPDATE;
  950. g_devMsg.ledgreen = 2;
  951. }
  952. }
  953. /*-------------------------------------------------------------------------------
  954. * 升级成功后,主设备 接收升级的状态
  955. * --------------------------------------------------------------------------------*/
  956. void master_update_status_rcv(uint8_t *data, uint32_t len)
  957. {
  958. updateCmd0x2007 *msg = (updateCmd0x2007*)data;
  959. printf("^^^^^^^rcv type = %04x sn = %08x app = %08x, status = %d\r\n",msg->desDevType, msg->desDevSn,msg->appVer,msg->updateCode);
  960. if((IDENTITY_MASTER == g_updateDa.iDentity) || (IDENTITY_MASTER == g_iDentity))
  961. {
  962. send_update_code_to_serve(msg->desDevType,msg->desDevSn,g_updateDa.taskNo,msg->updateCode,0x03);
  963. }
  964. }