| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- #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
|