| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- /*
- * @Description:
- * @Version: 2.0
- * @Author: Seven
- * @Date: 2022-11-22 10:52:19
- * @LastEditors: Seven
- * @LastEditTime: 2022-12-08 11:46:01
- */
- #include "ota_display.h"
- #include "includes.h"
- uint32_t XSP_OTA_VER = 0;//显示屏升级版本号
- uint8_t XSP_update_state[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
- ota_xsp_pack_info_t ota_xsp_pack_info;
- xsp_ota_info_t xsp_ota_info;
- uint8_t coll_xsp[1024];
- uint32_t XSPL_addr=0,XSPL_len=0,XSPA_len=0;
- uint16_t XSP_crc = 0;
- uint32_t XSPL_APP_Addr,XSPL_APP_Len,XSPL_APP_Crc,XSPH_APP_Addr,XSPH_APP_Len,XSPH_APP_Crc;
- //显示屏升级开始
- void xsp_ota_start(void)
- {
- printf("xsp ota start\n");
- device_fixed_info.Work_State = DEV_WORK_STATE_XSP_UPDATING;
- timeout_setValue(&ota_xsp_pack_info.tt_total,XSP_OTA_TOTAL_TIME,1);
- ota_xsp_info.xsp_count = 0;
- ota_xsp_info.error_num = 0;
- ota_xsp_info.xsp_ota_step = FIRST_READ_0xC0;
- }
- //显示屏升级结束
- void xsp_ota_over(void)
- {
- printf("xsp ota over\n");
- //清除屏升级标志存储
- BKP_WriteBackupRegister_code(BKP_DR4,0);
- device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
- ota_xsp_info.error_num = 0;
- ota_xsp_info.xsp_ota_begin = 0;
- timeout_stop(&ota_xsp_pack_info.tt_total);
- memset(&ota_state,0,sizeof(ota_state));
- }
- //读取显示屏升级信息
- void get_xsp_ota_info(uint32_t addr, uint32_t len)
- {
- int i,j;
- uint32_t size = 0;
- Flash_BufferRead(addr,coll_xsp,len);
- memset(&xsp_ota_info,0,sizeof(xsp_ota_info_t));
- memcpy(&xsp_ota_info,coll_xsp,4);
- // if(coll_xsp[0] <= 16)
- printf("coll num:%d\n",xsp_ota_info.coll_num);
- if(xsp_ota_info.coll_num <= 16)
- {
- // xsp_ota_info.coll_num = coll_xsp[0];
- size = 4;
- for(i = 0; i < xsp_ota_info.coll_num;i++)
- {
- memcpy(&xsp_ota_info.coll_xsp[i],&coll_xsp[size],12);
- 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);
- size += 12;
- memcpy(xsp_ota_info.coll_xsp[i].xsp_info,&coll_xsp[size],xsp_ota_info.coll_xsp[i].xsp_num*8);
- size += xsp_ota_info.coll_xsp[i].xsp_num*8;
- for(j = 0; j < xsp_ota_info.coll_xsp[i].xsp_num; j++)
- {
- 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);
- }
- }
- }
- }
- //查找路由内是否有本设备
- uint8_t check_route_xsp_ota(void)
- {
- uint8_t ret = 0;
- int i;
- for(i = 0; i < xsp_ota_info.coll_num; i++)
- {
- 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))
- {
- ota_xsp_info.xsp_index = i;
- ota_xsp_info.xsp_total_num = xsp_ota_info.coll_xsp[i].xsp_num;
- if(ota_xsp_info.xsp_total_num)
- {
- ret = 1;
- }
- break;
- }
- }
- return ret;
- }
- //显示屏校验计算
- uint16_t xsp_update_crc(uint32_t start, uint32_t len)
- {
- // uint32_t temp[16] = {0};
- uint32_t verify[2] = {0};
- uint16_t g_crc = 0;
- GetCodeVerify(start,len,verify);
- g_crc = CRC16_get((uint8_t *)verify,8);
- // printf("crc1 = 0x%04x\n",g_crc);
- //
- // GetCodeVerify_t(start,len,verify);
- // g_crc = CRC16_get((uint8_t *)verify,8);
- // printf("crc2 = 0x%04x\n",g_crc);
-
-
- // Flash_BufferRead(start,(uint8_t *)temp,len);
-
- return g_crc;
- }
- ////获取升级显示屏的sn
- //void get_ota_xsp_sn(void)
- //{
- //// ota_xsp_info.txsp_info.xsp_sn = 12345;
- //}
- void ota_xsp_info_read_test(void)
- {
- uint8_t ret;
- uint32_t datalen = 0,fixChar;
- datalen = Flash_DatalenRead(OTA_UPDATE_APP3_FLASH_START_ADDR,OTA_UPDATE_APP3_FLASH_SIZE);
- printf("data len = %d\n",datalen);
- if(datalen > (128*1024) || datalen == 0)
- {
- printf("升级包长度错误: %d\n",datalen);
- return;
- }
- fixChar = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-8); // 固定字符 WBJW
- if(fixChar == XSPL_CHAR)//有路由表
- {
- ota_slave.total_bytes = datalen;
- ret = ota_update_pkg_check(DISPLAY,0);
- if(!ret)
- {
- printf("update pkg err\n");
- return;
- }
-
- get_xsp_ota_info(XSPL_addr,XSPL_len);
- if(!check_route_xsp_ota())
- {
- printf("no xsp\n");
- return;
- }
- //显示屏升级标志存储
- BKP_WriteBackupRegister_code(BKP_DR4,XSP_UPDATE);
- //显示屏升级次数存储
- BKP_WriteBackupRegister_code(BKP_DR5,0);
- xsp_ota_start();
- ota_xsp_init();
- }
- // else if(fixChar == XSPA_CHAR)
- // {
- // //没有路由表
- // XSPH_APP_Len = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-2);
- // XSPH_APP_Addr = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-4);
- // XSPL_APP_Len = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-6);
- // XSPL_APP_Addr = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-8);
- // XSPL_APP_Crc = xsp_update_crc(OTA_UPDATE_APP3_FLASH_START_ADDR+XSPL_APP_Addr,XSPL_APP_Len);
- // XSPH_APP_Crc = xsp_update_crc(OTA_UPDATE_APP3_FLASH_START_ADDR+XSPH_APP_Addr,XSPH_APP_Len);
- // printf("xspl addr=0x%04x, xspl len=%d, xspl crc=0x%04x\n",XSPL_APP_Addr,XSPL_APP_Len,XSPL_APP_Crc);
- // printf("xsph addr=0x%04x, xsph len=%d, xsph crc=0x%04x\n",XSPH_APP_Addr,XSPH_APP_Len,XSPH_APP_Crc);
- // xsp_ota_start();
- // ota_xsp_info.txsp_info.xsp_type = 0x1023;
- // ota_xsp_info.txsp_info.xsp_sn = 4294000000;
- // ota_xsp_info.xsp_ota_step = FIRST_READ_0xC0;//;SEND_IAP_0x02
- // get_iap_key(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key_iap);
- // ota_xsp_info.xsp_ota_begin = 1;
- //
- // }
- }
- //显示屏升级初始化
- void ota_xsp_init(void)
- {
-
- #if 0
- uint8_t ret;
- uint32_t datalen = 0;
- datalen = Flash_DatalenRead(OTA_UPDATE_APP3_FLASH_START_ADDR,OTA_UPDATE_APP3_FLASH_SIZE);
- printf("data len = %d\n",datalen);
- if(datalen > (128*1024) || datalen == 0)
- {
- printf("升级包长度错误: %d\n",datalen);
- return;
- }
- //没有路由表
- XSPH_APP_Len = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-2);
- XSPH_APP_Addr = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-4);
- XSPL_APP_Len = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-6);
- XSPL_APP_Addr = *(uint16_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+datalen-20-8);
- XSPL_APP_Crc = xsp_update_crc(OTA_UPDATE_APP3_FLASH_START_ADDR+XSPL_APP_Addr,XSPL_APP_Len);
- XSPH_APP_Crc = xsp_update_crc(OTA_UPDATE_APP3_FLASH_START_ADDR+XSPH_APP_Addr,XSPH_APP_Len);
- printf("xspl addr=0x%04x, xspl len=%d, xspl crc=0x%04x\n",XSPL_APP_Addr,XSPL_APP_Len,XSPL_APP_Crc);
- printf("xsph addr=0x%04x, xsph len=%d, xsph crc=0x%04x\n",XSPH_APP_Addr,XSPH_APP_Len,XSPH_APP_Crc);
- ota_xsp_info.txsp_info.xsp_type = 0x0401;
- ota_xsp_info.txsp_info.xsp_sn = 10000123;
- ota_xsp_info.xsp_ota_step = FIRST_READ_0xC0;//;SEND_IAP_0x02
- get_iap_key(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key_iap);
- #endif
-
- #if 1
- //有路由表
- while(ota_xsp_info.xsp_count < ota_xsp_info.xsp_total_num)
- {
- 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))
- {
- 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;
- ota_xsp_info.txsp_info.xsp_type = (XSP_OTA_VER&0xffff0000)>>16;
- get_iap_key(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key_iap);
- ota_xsp_info.xsp_ota_step = FIRST_READ_0xC0;
- ota_xsp_info.xsp_ota_begin = 1;
- break;
- }
- else
- {
- ota_xsp_info.xsp_count++;
- }
- }
- if(ota_xsp_info.xsp_count >= ota_xsp_info.xsp_total_num)//升级结束
- {
- xsp_ota_over();
- }
- #endif
- }
- //接收到iap 0x01返回后处理
- uint8_t rcv_iap_0x01_handle(void *data)
- {
- uint8_t ret = 0;
- xsp_iap_0x01_info_t *p_xsp = (xsp_iap_0x01_info_t *)data;
- if(p_xsp->iapVer == ota_xsp_pack_info.update_ver)//无需升级
- {
- return ret;
- }
- else
- {
- if(p_xsp->curAppBase == XSP_APPL_ADDR)
- {
- ota_xsp_pack_info.startaddr = XSP_APPH_ADDR;
- ota_xsp_pack_info.app3_startaddr = OTA_UPDATE_APP3_FLASH_START_ADDR+XSPH_APP_Addr;
- ota_xsp_pack_info.total_bytes = XSPH_APP_Len;
- ota_xsp_pack_info.total_crc = XSPH_APP_Crc;
- }
- else if(p_xsp->curAppBase == XSP_APPH_ADDR)
- {
- ota_xsp_pack_info.startaddr = XSP_APPL_ADDR;
- ota_xsp_pack_info.app3_startaddr = OTA_UPDATE_APP3_FLASH_START_ADDR+XSPL_APP_Addr;
- ota_xsp_pack_info.total_bytes = XSPL_APP_Len;
- ota_xsp_pack_info.total_crc = XSPL_APP_Crc;
- }
- ota_xsp_pack_info.total_pkgs = ota_xsp_pack_info.total_bytes/OTA_XSP_PACK_LEN;
- if(ota_xsp_pack_info.total_bytes%OTA_XSP_PACK_LEN)
- {
- ota_xsp_pack_info.total_pkgs++;
- }
- printf("xsp crc=%04x\n",ota_xsp_pack_info.total_crc);
- }
- return ret;
- }
- //显示屏升级
- void ota_xsp_send(void)
- {
- uint32_t times = 0;
- switch(ota_xsp_info.xsp_ota_step)
- {
- case FIRST_READ_0xC0:
- xsp_0xC0_send(ota_xsp_info.txsp_info.xsp_sn);
- break;
- case SECOND_AUTH_0xC1_STEP01:
- xsp_0xC1_send(ota_xsp_info.txsp_info.xsp_sn,1,xsp_comm_info,ota_xsp_info.txsp_info.curkey);
- break;
- case SECOND_AUTH_0xC1_STEP02:
- xsp_0xC1_send(ota_xsp_info.txsp_info.xsp_sn,2,xsp_comm_info,ota_xsp_info.txsp_info.curkey);
- break;
- // case READ_XSP_0xC3:
- // xsp_0xC3_send(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key);
- // break;
- case SEND_IAP_0x01:
- xsp_iap_0x01_send(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key_iap,ota_xsp_info.txsp_info.key);
- break;
- case SEND_IAP_0x02:
- 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);
- break;
- case SEND_IAP_0x03:
- 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);
- break;
- case SEND_IAP_0x04:
- // 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
- 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
- break;
- case SEND_IAP_0x07:
- times = RTC_GetCounter();
- 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);
- break;
- case SEND_IAP_0x0F:
- xsp_iap_0x0F_send(ota_xsp_info.txsp_info.xsp_sn,ota_xsp_info.txsp_info.key_iap,ota_xsp_info.txsp_info.key);
- lora_xsp_ota_updatestate_resp(UPDATA_SUCCESS);
- ota_xsp_info.xsp_count++;
- // ota_xsp_info.xsp_ota_begin = 1;
- ota_xsp_init();
- // device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
- break;
- default:
- break;
- }
- }
- //显示屏升级状态返回
- void lora_xsp_ota_updatestate_resp(uint8_t updatestate)
- {
- collect_gateway_msg_format_t msg;
- ota_state_upload_t *p_ota = (ota_state_upload_t *)msg.info;
- p_ota->rcv_device_type = device_info.device_type;
- p_ota->rcv_device_sn = device_info.device_sn;
- p_ota->des_device_type = ota_xsp_info.txsp_info.xsp_type;
- p_ota->des_device_sn = ota_xsp_info.txsp_info.xsp_sn;
- p_ota->des_bt_ver = 0;
- p_ota->des_app_ver = ota_xsp_pack_info.update_ver;
- p_ota->update_state = updatestate;
- p_ota->reserve = 0;
- coll_msg_send(&msg, net_msg_type_update_status_upload, OTA_STATE_UPLOAD_LEN);
-
- data_dump("xsp update",(uint8_t *)&msg,msg.msg_len+FRAME_HEADER_LEN);
-
- // slave_upload_info.num++;//上报次数
- // printf("slave send %d ",slave_upload_info.num);
- // data_dump("times",(uint8_t *)&msg,FRAME_HEADER_LEN + OTA_STATE_UPLOAD_LEN+2);
- }
- uint8_t xsp_update_state;
- void xsp_update_handle(void)
- {
- //显示屏升级
- if(device_fixed_info.xsp_update_start)
- {
- device_fixed_info.xsp_update_start = 0;
- xsp_update_reboot();
- }
- if(device_fixed_info.Work_State == DEV_WORK_STATE_XSP_UPDATING)
- {
- if(timeout_isOut(&ota_xsp_pack_info.tt_total))
- {
- xsp_ota_over();
- }
-
- if(ota_xsp_info.error_num > 3)
- {
- ota_xsp_info.xsp_ota_begin = 0;
- ota_xsp_info.error_num = 0;
- // device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
-
- xsp_update_state = XSP_update_state[ota_xsp_info.xsp_ota_step];
- lora_xsp_ota_updatestate_resp(xsp_update_state);
- ota_xsp_info.xsp_count++;
-
- ota_xsp_init();
- }
-
- if(ota_xsp_info.xsp_ota_begin)
- {
- ota_xsp_send();
- ota_xsp_info.xsp_ota_begin = 0;
- }
- if(timeout_isOut(&ota_xsp_info.tt_uart))
- {
- ota_xsp_info.error_num++;
- if(ota_xsp_info.error_num <= 3)
- ota_xsp_info.xsp_ota_begin = 1;
- }
- }
- }
|