| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- /*
- * @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
|