ota_update.c 34 KB

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