#ifndef _OTA_UPDATE_H_ #define _OTA_UPDATE_H_ #include "../User/gd32f10x_it.h" #include "../Hardware/boardinit.h" enum { // 升级结果类型 UPDATE_RECEIVE_UPDATEFLAG = 0x11, // 收到服务器的升级指令 UPDATE_SAMEVERSION, // 和当前版本相同 UPDATE_FAILE_NOCOLLECT, // 此采集器不在本网关下 UPDATE_HTTP_ERROR, //HTTP返回错误码 UPDATE_DOWNLOADFILE_FAILED, //文件下载失败,即文件大小小于2个字节 UPDATE_DOWNLOADFILE_SUCCESS, // 文件下载成功 UPDATE_CRCERROR, // 文件包中的CRC与实际不符 UPDATE_URL_FILE_TYPE_ERROR, // URL中的文件信息与文件包中的信息不一致 UPDATE_DEVICETYPEERROR, // 升级设备类型不匹配 UPdATE_FILE_LEN_ERROR, // 升级文件长度超过128个字节 UPDATE_SUCCESS, // 升级成功 UPDATE_RETURN_SUCESS, // 回退 }; //升级状态 #define START_UPDATA 0x21 //已收到正确的升级指令 #define PACKET_LOSS_MORE 0x22 //丢包超标,升级结束 #define RETRANSMIT_TIMEOUT 0x23 //重传阶段超时,升级失败 #define UPDATA_CRC_ERROR 0x24 //升级包CRC校验失败 #define DEVICE_TYPE_ERROR 0x25 //目标设备类型不匹配 #define UPDATA_PACKAGE_LENGTH_ERROR 0x26 //长度不符 #define FIXED_CHARACTER_ERROR 0x27 //固定字符错误 #define UPDATA_DATA_SUCCESS 0x28 //升级包接收正确 #define UPDATA_TOTAL_TIMEOUT 0x29 //升级总时间超时 #define UPDATA_SUCCESS 0x2A //升级成功 #define UPDATA_BACK 0x2B //回退 #define UPDATE_SLAVE 0x5AA5 enum { UP_PROG_FROM_NET = 0x22, // 来源来网络 UP_PROG_FROM_GAT = 0x44, //来源来网关 }; #define OTA_UPDATE_BOOTROM_FLASH_START_ADDR (0x08000000) // #define OTA_UPDATE_PT_FLASH_SIZE (0x8000) // #define OTA_UPDATE_PT_FLASH_START_ADDR (0x08008000) // #define OTA_UPDATE_PT_FLASH_END_ADDR (OTA_UPDATE_PT_FLASH_START_ADDR+OTA_UPDATE_PT_FLASH_SIZE-1) #define OTA_UPDATE_APP1_FLASH_SIZE (0x18000) // #define OTA_UPDATE_APP1_FLASH_START_ADDR (0x08018000) // #define OTA_UPDATE_APP1_FLASH_END_ADDR (OTA_UPDATE_APP1_FLASH_START_ADDR+OTA_UPDATE_APP1_FLASH_SIZE-1) // #define OTA_UPDATE_APP2_FLASH_SIZE (0x18000) // #define OTA_UPDATE_APP2_FLASH_START_ADDR (0x08030000) // #define OTA_UPDATE_APP2_FLASH_END_ADDR (OTA_UPDATE_APP2_FLASH_START_ADDR+OTA_UPDATE_APP2_FLASH_SIZE-1) // #define OTA_UPDATE_APP3_FLASH_SIZE (0x18000) // #define OTA_UPDATE_APP3_FLASH_START_ADDR (0x08048000) // #define OTA_UPDATE_APP3_FLASH_END_ADDR (OTA_UPDATE_APP3_FLASH_START_ADDR+OTA_UPDATE_APP3_FLASH_SIZE-1) // typedef struct _UPDATE_DATA_{ uint16_t updateCode; // 升级状态码, uint8_t bResetUpdate; // 升级完成后,需要上报升级的状态(包含从设备通过485上报,或是主设备通过4G上报) uint8_t bReadUpdateCode; // 可以允许读取升级状态码了 uint16_t taskNo; // 升级任务号 uint8_t bupdateFinish; // 升级是否完成 uint8_t brcvCmd0x16; // 收到16指令 uint8_t Work_State; // 当前升级状态 uint8_t bRetransmit; // 是否允许重传 1:不允许, 0:允许 uint8_t iDentity; //升级时的身份(下发设备或被升级设备) uint8_t retransmit_s;//是否发送了重传指令 uint8_t ResetUpdate_s;//是否需要上报升级状态 uint8_t Update_Source;//升级来源 uint16_t bUpdate_slave;//是否需要升级从设备 uint8_t bOffline_s; //是否开始离线升级 uint32_t bOffline_addr; //离线升级首地址 uint8_t bfirmware_type;//升级的固件类型 }__attribute__((packed))UpdateDa; extern UpdateDa g_updateDa; #define OTA_TIM_ONLOOKER 5000 // 旁观都 5S #define OTA_TIM_TOTALTMR (60000*5) // 升级总定时器 #define OTA_TIM_REPEAT (60*1000) // 重传定时器10S #define OTA_TIM_REPEAR_MASTER (10*1000) //重传定时器(主设备) //#define OTA_TIM_REPEAR_SLAVE_FAST (rand()%100+300) //重传定时器快(从设备) //#define OTA_TIM_REPEAR_SLAVE_SLOW (rand()%100+500) //重传定时器慢 #define OTA_TIM_CONTINUE 3000 // 连续接收时间 3S enum { OTA_TIMER_NULL = 0x00, OTA_TIMER_START = 0x01, OTA_TIMER_END = 0x02, }; typedef struct _ota_update_time_set_{ timeout_t timer; uint8_t status; }__attribute__((packed))otaTimeSet; typedef struct _ota_update_time_{ otaTimeSet totalTmr; // 升级总时间 otaTimeSet continueTmr; // 连续接收时间 otaTimeSet repeatTmr; // 重传时间 otaTimeSet onlookerTmr; // 旁观者时间 otaTimeSet randomTmr; // 随机定时器 otaTimeSet upstatusTmr; // 读取状态时间 otaTimeSet repeatRandomTmr;//重传随机时间 }__attribute__((packed))OtaUpdateTime; extern OtaUpdateTime g_otaTimer; /*-----------------------------------------------升级标记----------------------------------*/ #define UPDATE_FLAG 0x81 // 升级标志 #define UPDATE_SUCCESS_FLAG 0x82 // 升级成功标志 #define BACKOFF_OVER 0x83 // 回滚成功 /*---------------------------------------------升级协议开始-------------------------------------*/ enum { OTA_UPDATE_NULL = 0x00, // 默认状态 OTA_UPDATE_ONLOOKER = 0x01, // 旁观者模式 OTA_UPDATE_BEGIN = 0x02, // 启动升级 OTA_UPDATE_CONTINUE = 0x03, // 连续续传模式 OTA_UPDATE_REPEAT = 0x04, // 重传模式 OTA_UPDATE_RCVEND = 0x05, // 升级包接收完成 OTA_UPDATE_CONTINUE_END = 0x06, // 连续包结束 OTA_UPDATE_REPEAT_END = 0x07, // 重传包结束 }; typedef struct _ota_update_msg_{ uint16_t rcvDevType; // 接收设备类型 uint32_t rcvDevSn; // 接收设备SN uint16_t desDevType; // 升级目标设备类型 uint32_t desDevSn; // 升级目标设备SN uint8_t firmType; // 固件类型 uint32_t version; // 升级版本号 uint32_t totalByte; // 升级总总长度 uint16_t eachMaxByte; // 单包最大字节类 uint16_t losePage; // 最大丢包百分比 最小为10%,最大为60% uint16_t loseTotalPage; // 最大丢包个数 uint16_t sendInterval; // 连续阶段发 送包的时间间隔(单位:ms) uint16_t totalPage; // 升级包总个数 uint16_t subPkgId; // 升级包编号 uint16_t subPkgLen; // 本升级包的长度 uint8_t losePkgNum; // 丢包的个数 uint16_t lastRightPkgNum; uint16_t lossPkgId[250]; uint8_t retransLossPkts; //重传丢包个数 uint8_t lossPkgIndex; }__attribute__((packed))otaUpdatMsg; typedef struct _update_cmd_0x1003_{ // 启动升级下行 uint16_t rcvDevType; // 接收设备类型 uint32_t rcvDevSn; // 接收设备SN uint16_t desDevType; // 升级目标设备类型 uint32_t desDevSn; // 升级目标设备SN uint8_t firmType; // 固件类型 uint32_t updateVer; // 升级包版本 uint32_t totalByte; // 升级总总长度 uint16_t eachMaxByte; // 单包最大字节类 uint16_t losePage; // 最大丢包面分比 最小为10%,最大为60% uint16_t sendInterval; // 连续阶段发 送包的时间间隔(单位:ms) }__attribute__((packed))updateCmd0x1003; typedef struct _update_cmd_0x1004_{ // 连续包下行 uint16_t rcvDevType; // 接收设备类型 uint32_t rcvDevSn; // 接收设备SN uint16_t desDevType; // 升级目标设备类型 uint32_t desDevSn; // 升级目标设备SN uint16_t totalPage; // 升级包总个数 uint16_t subPkgId; // 升级包编号 uint16_t subPkgLen; // 本升级包的长度 }__attribute__((packed))updateCmd0x1004; typedef struct _update_cmd_0x1005_{ // 重传包 uint16_t rcvDevType; // 接收设备类型 uint32_t rcvDevSn; // 接收设备SN uint16_t desDevType; // 升级目标设备类型 uint32_t desDevSn; // 升级目标设备SN uint16_t totalPage; // 升级包总个数 uint16_t subPkgId; // 升级包编号 uint16_t subPkgLen; // 本升级包的长度 }__attribute__((packed))updateCmd0x1005; typedef struct _update_cmd_0x2005_{ // 重传包请求上行 uint16_t slaveDevType; uint32_t slaveDevSn; uint16_t repDevType; // 发起请求的设备类型 uint32_t repDevSn; // 发起请求的设备SN uint16_t repPkgId; // 升级包编号 }__attribute__((packed))updateCmd0x2005; typedef struct _update_cmd_0x1006_{ // 离线升级指令 uint16_t masterDevType; // 主设备类型 uint32_t masterDevSn; // 主设备SN uint16_t slaveDevType; // 从设备类型 uint32_t slaveDevSn; // 从设备SN uint16_t desDevType; // 升级目标设备类型 uint32_t desDevSn; // 升级目标设备SN uint8_t firmType; // 固件类型 uint32_t reserve; // 预留 }__attribute__((packed))updateCmd0x1006; typedef struct _update_cmd_0x1007_{ // 升级状态读取下行 uint16_t rcvDevType; // 接收设备类型 uint32_t rcvDevSn; // 接收设备SN uint16_t pointDevType; // 指定读取的设备类型 uint32_t pointDevSn; // 指定读取的设备SN uint32_t reserve; // 预留 }__attribute__((packed))updateCmd0x1007; typedef struct _update_cmd_0x2007_{ // 升级状态读取上行 uint16_t slaveDevType; // 从设备类型 uint32_t slaveDevSn; // 从设备SN uint16_t desDevType; // 升级目标设备类型 uint32_t desDevSn; // 升级目标设备SN uint32_t bootVer; // 升级目标bootloader版本 uint32_t ptVer; // 升级目标的产测版本 uint32_t appVer; // 升级目标的app版本 uint8_t updateCode; // 升级状态码 uint32_t reserve; // 预留 }__attribute__((packed))updateCmd0x2007; #define OTA_START_INFO_LEN sizeof(updateCmd0x1003) #define OTA_CONTINUES_INFO_LEN sizeof(updateCmd0x1004) #define OTA_RETRNSMIT_INFO_LEN sizeof(updateCmd0x1005) #define OTA_MASTER_SEND_PKG_SIZE 128 // 主下发每包的大小 /*---------------------------------------------升级协议结束-------------------------------------*/ extern void ota_repeat_rand_timer(uint8_t status); extern void ota_update_master_retransmit(uint8_t *data); extern void ota_timer_stop(otaTimeSet *timer); extern void set_start_ota_timer(otaTimeSet *timer, uint32_t delay); extern void ota_power_up_read_update_status(void); extern void ota_update_slave_task(uint16_t cmd, uint8_t *data, uint8_t len); extern void ota_check_update_timer(void); extern void ota_update_deal_upstatus(void); extern void ota_update_slave_continue_end(uint8_t workMode); extern void ota_master_init_update_msg_offline(uint16_t rcvdevtype,uint32_t rcvdevsn,uint16_t desdevtype,uint32_t desdevsn,uint8_t firmtype); extern uint8_t ota_offline_init(uint32_t addr,uint32_t len); extern void ota_offline_proc(void); extern void ota_offline_handle(void); extern void ota_update_slave_offline(uint8_t *data,uint8_t len); extern void master_update_status_rcv(uint8_t *data, uint32_t len); extern void ota_start_offline_update(void); #endif