/* * @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; } } }