/* * @Description: * @Version: 2.0 * @Author: Seven * @Date: 2022-08-22 17:13:45 * @LastEditors: Seven * @LastEditTime: 2022-12-19 10:32:41 */ #ifndef __OTA_H__ #define __OTA_H__ #include "stm32f10x.h" #include "os.h" #include "tools.h" #include "gw_ctrl.h" //#define XSP_TYPE 0x1FFF //显示屏设备类型0x10xx~0x1Fxx #define OPEN 1 #define CLOSE 0 #define ONLOOKER_TIMEOUT_TIME (10*1000) #define CONTINUOUS_TIMEOUT_TIME (300*1000) #define RETRANSMIT_TIMEOUT_TIME (10*1000) //重传时间 #define CONTINUOUS_TIMEOUT_TIME_MUX (900*1000) #define CONTINUOUS_TIMEOUT_DELAY_TIME (3*1000) // #define OTA_TOTAL_TIMEOUT_TIME 900 //ucos定时器时间 #define OTA_TOTAL_TIMEOUT_TIME_TICK (15*60*1000)//滴答定时器定时时间 #define OTA_MASTER_WAIT_TIME_TICK (15*1000) #define OTA_SLAVE_UPLOADE_TIME_TICK (60*1000) #define WBJW_CHAR 0x57424A57 #define XSPA_CHAR 0x58535041 #define XSPL_CHAR 0x5853504C #define UPDATE_EACH_TIME 300 //离线升级时,升级包连续下发最小间隔 //重传请求延时 #define RETRANSMIT_DELAY_TIMEOUT_MIN (300+rand()%70) #define RETRANSMIT_DELAY_TIMEOUT_MAX (500+rand()%70) // //上报上级状态延时 #define SLAVE_CAD_TIME_MIN (300+rand()%70) #define SLAVE_CAD_TIME_MAX (500+rand()%70) // #define SLAVE_UPLOAD_NUM 5 //上报升级状态次数 //升级状态 #define START_UPDATA_NONE 0x20 //未收到升级开始指令 #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 KEY_TRIGGER 1 //按键触发 #define GATEWAY_TRIGGER 2 //网关下发触发 //升级标记 #define UPDATA_FLAG 0x81 #define BACKOFF_FLAG 0x82 #define BACKOFF_OVER 0x83 #define OTA_UPDATE_BOOTROM_SIZE #define OTA_UPDATE_BOOTROM_FLASH_START_ADDR (0x08000000) // #define OTA_UPDATE_BOOTROM_FLASH_END_ADDR (OTA_UPDATE_BOOTROM_FLASH_START_ADDR+OTA_UPDATE_BOOTROM_SIZE-1) #define OTA_UPDATE_PT_FLASH_SIZE (0x18000) #define OTA_UPDATE_PT_FLASH_START_ADDR (0x08008000) #define OTA_UPDATE_PT_FLASH_END_ADDR (OTA_UPDATA_PT_FLASH_START_ADDR+OTA_UPDATA_PT_FLASH_SIZE-1) #define OTA_UPDATE_APP1_FLASH_SIZE (0x20000) // #define OTA_UPDATE_APP1_FLASH_START_ADDR (0x08020000) // #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 (0x20000) // #define OTA_UPDATE_APP2_FLASH_START_ADDR (0x08040000) // #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 (0x20000) // #define OTA_UPDATE_APP3_FLASH_START_ADDR (0x08060000) // #define OTA_UPDATE_APP3_FLASH_END_ADDR (OTA_UPDATE_APP3_FLASH_START_ADDR+OTA_UPDATE_APP3_FLASH_SIZE-1) // #define OTA_UPDATE_APP_FLASH_SIZE (0x20000) #define OFFLINE_MASTER_DOWN_ADDR OTA_UPDATE_APP3_FLASH_START_ADDR //离线升级主设备下发的app地址 //升级模式和状态 enum { OTA_WORK_STATE_MASTER=1, //主设备 OTA_WORK_STATE_SLAVE, //从设备 OTA_WORK_STATE_ONLOOKER, //旁观者 OTA_WORK_STATE_UPLOAD, //从设备主动上报阶段 OTA_WORK_STATE_XSP, //升级显示屏 OTA_WORK_STATE_START, //开始升级阶段 OTA_WORK_STATE_CONTINUOUS, //连续阶段 OTA_WORK_STATE_RETRANSMIT, //重传阶段 OTA_WORK_STATE_RCV_END, //接收完成 }; //升级指令 enum{ net_msg_type_update_start = 0x13, //网关下发开始升级指令 net_msg_type_update_continues = 0x14, //网关连续下发升级包 net_msg_type_update_retransmit_rsp = 0x15, //网关下发重传升级包 net_msg_type_update_offline = 0x16, //网关下发开始离线升级 net_msg_type_update_ack_status = 0x11, /* Node ----> Gateway */ net_msg_type_update_retransmit_req = 0x22, //采集器发送重传请求 net_msg_type_update_status_upload = 0x23, //从设备上报升级状态 net_msg_type_update_status = 0x21, }; typedef struct _ota_state_t { uint8_t update_mode; //设备升级模式(主设备、从设备、旁观者) uint8_t update_state_slave; //从设备模式升级状态 uint8_t update_state_master; //主设备模式升级状态 uint8_t flash_erase; //是否执行擦除flash uint8_t offline_mode; //离线升级触发方式(0:按键触发,1:命令触发) }ota_state_t; extern ota_state_t ota_state; //开始升级指令 typedef struct _ota_start_info { uint16_t rcv_device_type; //接收设备类型 uint32_t rcv_device_sn; //接收设备sn uint16_t des_device_type; //被升级设备类型 uint32_t des_device_sn; //被升级设备sn uint32_t update_version; //升级包版本 uint32_t total_bytes; //升级包总长度 uint16_t Send_interval; //发送间隔 }__attribute__((packed)) ota_start_info_t; //连续发包指令 typedef struct _ota_continues_info { uint16_t rcv_device_type; //接收设备类型 uint32_t rcv_device_sn; //接收设备sn uint16_t des_device_type; //被升级设备类型 uint32_t des_device_sn; //被升级设备sn uint16_t total_pkgs; //总包数 uint16_t sub_pkg_id; //当前包id uint8_t sub_pkg_len; //当前包长度 uint8_t pkg_content[128]; //数据 // uint32_t *pkg_content; }__attribute__((packed)) ota_continues_info_t; typedef struct _ota_retransmit_req {//重传请求 uint16_t repeat_devict_type; uint32_t repeat_device_sn; uint16_t repeat_sub_pkg_id; }__attribute__((packed)) ota_retransmit_req_t; #define MAX_LOSS_PKG_COUNT 150 //最大丢包数,超过此数直接标记下载升级包失败。 typedef struct ota_pkg_info { uint16_t des_device_type; //目标设备类型 uint32_t des_device_sn; //目标设备sn uint16_t rcv_device_type; //接收设备的设备类型 uint32_t rcv_device_sn; //接收设备的sn uint32_t update_type; //升级包类型 uint32_t update_version; //升级包版本 uint32_t total_bytes; //总字节 uint32_t total_crc; //校验码 uint16_t total_pkgs; //总包数 uint16_t sub_pkg_id; //当前包编号 uint16_t lastRightPkgNum; //上次接收的包编号 uint16_t lossPkgIndex; //丢包数组的下标 uint16_t lossPkgCounter; //丢包个数 uint16_t lossPkgId[MAX_LOSS_PKG_COUNT]; //保存丢包编号的数组 uint16_t retransLossPkts; //重传丢包个数 uint16_t Send_interval; //发送间隔 timeout_t tt_ota_onlooker; //旁观者定时 timeout_t tt_ota_continuous; //连续发包定时 timeout_t tt_ota_retransmit; //重传定时 timeout_t tt_ota_total; //总定时 timeout_t tt_ota_retransmit_delay; //发送重传包延时定时 } ota_pkg_info_t; extern ota_pkg_info_t ota_slave,ota_master; //升级状态上传 typedef struct _ota_state_upload { uint16_t rcv_device_type; //接收设备类型 uint32_t rcv_device_sn; //接收设备sn uint16_t des_device_type; //目标设备类型 uint32_t des_device_sn; //目标设备sn uint32_t des_bt_ver; //被升级设备的bootloader版本 uint32_t des_app_ver; //被升级设备的app版本 uint8_t update_state; //升级状态码 uint32_t reserve; //预留 }__attribute__((packed)) ota_state_upload_t; //网关下发开始离线升级 typedef struct _gateway_coll_offline_upgrade { uint16_t master_device_type; //主设备类型 uint32_t master_device_sn; //主设备sn uint16_t slave_device_type; //从设备类型 uint32_t slave_device_sn; //从设备sn uint16_t des_device_type; //被升级设备类型 uint32_t des_device_sn; //被升级设备sn uint32_t reserve; //预留 }__attribute__((packed)) gateway_coll_offline_upgrade_t; //主设备收到的升级状态 typedef struct _master_rcv_update { uint16_t des_type; //设备类型 uint32_t des_sn; //设备sn uint32_t des_bt; //设备bootloader版本 uint32_t des_app; //设备app版本 uint8_t state; //设备升级状态 }master_rcv_update_t; //主设备接收的升级状态信息存储 typedef struct _master_rcv_info { uint16_t rcv_print_num; //接收的命令个数 uint16_t rcv_total_num; //接收的采集器个数 uint16_t rcv_success_num; //升级成功的个数 master_rcv_update_t master_rcv_update[64]; //记录接收的采集器信息 }master_rcv_info_t; extern master_rcv_info_t master_rcv_info; //从设备上报状态信息 typedef struct _slave_upload_info { uint8_t num; //上传次数 uint8_t send_flag; uint32_t delay_time; //延时时间 timeout_t upload_total_time; //总定时 timeout_t upload_cad_time; //每次上传间隔定时 }slave_upload_info_t; extern slave_upload_info_t slave_upload_info; #define OTA_START_INFO_LEN sizeof(ota_start_info_t) #define OTA_CONTINUES_INFO_LEN 17 //sizeof(ota_continues_info_t) #define OTA_RETRNSMIT_INFO_LEN sizeof(ota_retransmit_req_t) #define OTA_UPDATE_PAYLAOA_LEN 128 #define OTA_STATE_UPLOAD_LEN sizeof(ota_state_upload_t) #define OTA_OFFLINE_LEN sizeof(gateway_coll_offline_upgrade_t) enum { OTA_START, OTA_CONTINUE, OTA_RETRANSMIT, }; //离线升级状态机 typedef struct _offline_ota_state_t { uint8_t flag; uint8_t state; uint8_t start_num; uint16_t pkg_id; timeout_t tt_send; }offline_ota_state_t; extern offline_ota_state_t offline_ota_state; extern offline_ota_state_t xsp_ota_state;; #define OFFLINE_OTA_START_TIME (2000) #define OFFLINE_OTA_CONTINUE_TIME (300) extern uint8_t updata_state; void coll_msg_send(collect_gateway_msg_format_t *p_msg, uint8_t msg_type, uint16_t len); void updata_state_save(uint8_t state); void BKP_WriteBackupRegister_code(uint16_t BKP_DR, uint8_t Data); void gateway_lora_ota_proc(collect_gateway_msg_format_t *p_msg); void ota_continuous_end_handle(void); void ota_timer_retransmit_slave_set(uint8_t state, uint32_t timeout); void ota_timer_continuous_slave_set(uint8_t state, uint32_t timeout); void ota_timer_total_slave_set(uint8_t state, uint32_t timeout); void ota_slave_time_handle(void); void ota_timer_retransmit_require_slave_set(uint8_t state, uint32_t timeout); void ota_timer_upload_cad_slave_set(uint8_t state, uint32_t timeout); void ota_timer_upload_total_slave_set(uint8_t state, uint32_t timeout); void lora_slave_ota_updatestate_resp(uint8_t updatestate); void ota_timer_total_master_set(uint8_t state, uint32_t timeout); void ota_timer_retransmit_master_set(uint8_t state, uint32_t timeout); void Offline_upgrade_master(void); void slave_upload_end(void); void ota_master_time_handle(void); void master_rcv_total_proc(void); int lora_master_ota_gateway_info_init(gateway_coll_offline_upgrade_t *p_off); int lora_master_ota_key_info_Init(uint32_t total_len, uint32_t total_crc); void lora_master_ota_proc(collect_gateway_msg_format_t *p_msg); void lora_offline_update(uint32_t master_sn, uint32_t slave_sn, uint32_t des_sn); uint32_t xsp_update_reboot(void); uint8_t ota_update_pkg_check(uint16_t type, uint8_t state); #endif