ota.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. /*
  2. * @Description:
  3. * @Version: 2.0
  4. * @Author: Seven
  5. * @Date: 2022-08-22 17:13:45
  6. * @LastEditors: Seven
  7. * @LastEditTime: 2022-12-19 10:32:41
  8. */
  9. #ifndef __OTA_H__
  10. #define __OTA_H__
  11. #include "stm32f10x.h"
  12. #include "os.h"
  13. #include "tools.h"
  14. #include "gw_ctrl.h"
  15. //#define XSP_TYPE 0x1FFF //显示屏设备类型0x10xx~0x1Fxx
  16. #define OPEN 1
  17. #define CLOSE 0
  18. #define ONLOOKER_TIMEOUT_TIME (10*1000)
  19. #define CONTINUOUS_TIMEOUT_TIME (300*1000)
  20. #define RETRANSMIT_TIMEOUT_TIME (10*1000) //重传时间
  21. #define CONTINUOUS_TIMEOUT_TIME_MUX (900*1000)
  22. #define CONTINUOUS_TIMEOUT_DELAY_TIME (3*1000)
  23. // #define OTA_TOTAL_TIMEOUT_TIME 900 //ucos定时器时间
  24. #define OTA_TOTAL_TIMEOUT_TIME_TICK (15*60*1000)//滴答定时器定时时间
  25. #define OTA_MASTER_WAIT_TIME_TICK (15*1000)
  26. #define OTA_SLAVE_UPLOADE_TIME_TICK (60*1000)
  27. #define WBJW_CHAR 0x57424A57
  28. #define XSPA_CHAR 0x58535041
  29. #define XSPL_CHAR 0x5853504C
  30. #define UPDATE_EACH_TIME 300 //离线升级时,升级包连续下发最小间隔
  31. //重传请求延时
  32. #define RETRANSMIT_DELAY_TIMEOUT_MIN (300+rand()%70)
  33. #define RETRANSMIT_DELAY_TIMEOUT_MAX (500+rand()%70) //
  34. //上报上级状态延时
  35. #define SLAVE_CAD_TIME_MIN (300+rand()%70)
  36. #define SLAVE_CAD_TIME_MAX (500+rand()%70) //
  37. #define SLAVE_UPLOAD_NUM 5 //上报升级状态次数
  38. //升级状态
  39. #define START_UPDATA_NONE 0x20 //未收到升级开始指令
  40. #define START_UPDATA 0x21 //已收到正确的升级指令
  41. #define PACKET_LOSS_MORE 0x22 //丢包超标,升级结束
  42. #define RETRANSMIT_TIMEOUT 0x23 //重传阶段超时,升级失败
  43. #define UPDATA_CRC_ERROR 0x24 //升级包CRC校验失败
  44. #define DEVICE_TYPE_ERROR 0x25 //目标设备类型不匹配
  45. #define UPDATA_PACKAGE_LENGTH_ERROR 0x26 //长度不符
  46. #define FIXED_CHARACTER_ERROR 0x27 //固定字符错误
  47. #define UPDATA_DATA_SUCCESS 0x28 //升级包接收正确
  48. #define UPDATA_TOTAL_TIMEOUT 0x29 //升级总时间超时
  49. #define UPDATA_SUCCESS 0x2A //升级成功
  50. #define UPDATA_BACK 0x2B //回退
  51. //离线升级触发方式
  52. #define KEY_TRIGGER 1 //按键触发
  53. #define GATEWAY_TRIGGER 2 //网关下发触发
  54. //升级标记
  55. #define UPDATA_FLAG 0x81
  56. #define BACKOFF_FLAG 0x82
  57. #define BACKOFF_OVER 0x83
  58. #define OTA_UPDATE_BOOTROM_SIZE
  59. #define OTA_UPDATE_BOOTROM_FLASH_START_ADDR (0x08000000) //
  60. #define OTA_UPDATE_BOOTROM_FLASH_END_ADDR (OTA_UPDATE_BOOTROM_FLASH_START_ADDR+OTA_UPDATE_BOOTROM_SIZE-1)
  61. #define OTA_UPDATE_PT_FLASH_SIZE (0x18000)
  62. #define OTA_UPDATE_PT_FLASH_START_ADDR (0x08008000)
  63. #define OTA_UPDATE_PT_FLASH_END_ADDR (OTA_UPDATA_PT_FLASH_START_ADDR+OTA_UPDATA_PT_FLASH_SIZE-1)
  64. #define OTA_UPDATE_APP1_FLASH_SIZE (0x20000) //
  65. #define OTA_UPDATE_APP1_FLASH_START_ADDR (0x08020000) //
  66. #define OTA_UPDATE_APP1_FLASH_END_ADDR (OTA_UPDATE_APP1_FLASH_START_ADDR+OTA_UPDATE_APP1_FLASH_SIZE-1) //
  67. #define OTA_UPDATE_APP2_FLASH_SIZE (0x20000) //
  68. #define OTA_UPDATE_APP2_FLASH_START_ADDR (0x08040000) //
  69. #define OTA_UPDATE_APP2_FLASH_END_ADDR (OTA_UPDATE_APP2_FLASH_START_ADDR+OTA_UPDATE_APP2_FLASH_SIZE-1) //
  70. #define OTA_UPDATE_APP3_FLASH_SIZE (0x20000) //
  71. #define OTA_UPDATE_APP3_FLASH_START_ADDR (0x08060000) //
  72. #define OTA_UPDATE_APP3_FLASH_END_ADDR (OTA_UPDATE_APP3_FLASH_START_ADDR+OTA_UPDATE_APP3_FLASH_SIZE-1) //
  73. #define OTA_UPDATE_APP_FLASH_SIZE (0x20000)
  74. #define OFFLINE_MASTER_DOWN_ADDR OTA_UPDATE_APP3_FLASH_START_ADDR //离线升级主设备下发的app地址
  75. //升级模式和状态
  76. enum {
  77. OTA_WORK_STATE_MASTER=1, //主设备
  78. OTA_WORK_STATE_SLAVE, //从设备
  79. OTA_WORK_STATE_ONLOOKER, //旁观者
  80. OTA_WORK_STATE_UPLOAD, //从设备主动上报阶段
  81. OTA_WORK_STATE_XSP, //升级显示屏
  82. OTA_WORK_STATE_START, //开始升级阶段
  83. OTA_WORK_STATE_CONTINUOUS, //连续阶段
  84. OTA_WORK_STATE_RETRANSMIT, //重传阶段
  85. OTA_WORK_STATE_RCV_END, //接收完成
  86. };
  87. //升级指令
  88. enum{
  89. net_msg_type_update_start = 0x13, //网关下发开始升级指令
  90. net_msg_type_update_continues = 0x14, //网关连续下发升级包
  91. net_msg_type_update_retransmit_rsp = 0x15, //网关下发重传升级包
  92. net_msg_type_update_offline = 0x16, //网关下发开始离线升级
  93. net_msg_type_update_ack_status = 0x11,
  94. /* Node ----> Gateway */
  95. net_msg_type_update_retransmit_req = 0x22, //采集器发送重传请求
  96. net_msg_type_update_status_upload = 0x23, //从设备上报升级状态
  97. net_msg_type_update_status = 0x21,
  98. };
  99. typedef struct _ota_state_t
  100. {
  101. uint8_t update_mode; //设备升级模式(主设备、从设备、旁观者)
  102. uint8_t update_state_slave; //从设备模式升级状态
  103. uint8_t update_state_master; //主设备模式升级状态
  104. uint8_t flash_erase; //是否执行擦除flash
  105. uint8_t offline_mode; //离线升级触发方式(0:按键触发,1:命令触发)
  106. }ota_state_t;
  107. extern ota_state_t ota_state;
  108. //开始升级指令
  109. typedef struct _ota_start_info {
  110. uint16_t rcv_device_type; //接收设备类型
  111. uint32_t rcv_device_sn; //接收设备sn
  112. uint16_t des_device_type; //被升级设备类型
  113. uint32_t des_device_sn; //被升级设备sn
  114. uint32_t update_version; //升级包版本
  115. uint32_t total_bytes; //升级包总长度
  116. uint16_t Send_interval; //发送间隔
  117. }__attribute__((packed)) ota_start_info_t;
  118. //连续发包指令
  119. typedef struct _ota_continues_info {
  120. uint16_t rcv_device_type; //接收设备类型
  121. uint32_t rcv_device_sn; //接收设备sn
  122. uint16_t des_device_type; //被升级设备类型
  123. uint32_t des_device_sn; //被升级设备sn
  124. uint16_t total_pkgs; //总包数
  125. uint16_t sub_pkg_id; //当前包id
  126. uint8_t sub_pkg_len; //当前包长度
  127. uint8_t pkg_content[128]; //数据
  128. // uint32_t *pkg_content;
  129. }__attribute__((packed)) ota_continues_info_t;
  130. typedef struct _ota_retransmit_req {//重传请求
  131. uint16_t repeat_devict_type;
  132. uint32_t repeat_device_sn;
  133. uint16_t repeat_sub_pkg_id;
  134. }__attribute__((packed)) ota_retransmit_req_t;
  135. #define MAX_LOSS_PKG_COUNT 150 //最大丢包数,超过此数直接标记下载升级包失败。
  136. typedef struct ota_pkg_info {
  137. uint16_t des_device_type; //目标设备类型
  138. uint32_t des_device_sn; //目标设备sn
  139. uint16_t rcv_device_type; //接收设备的设备类型
  140. uint32_t rcv_device_sn; //接收设备的sn
  141. uint32_t update_type; //升级包类型
  142. uint32_t update_version; //升级包版本
  143. uint32_t total_bytes; //总字节
  144. uint32_t total_crc; //校验码
  145. uint16_t total_pkgs; //总包数
  146. uint16_t sub_pkg_id; //当前包编号
  147. uint16_t lastRightPkgNum; //上次接收的包编号
  148. uint16_t lossPkgIndex; //丢包数组的下标
  149. uint16_t lossPkgCounter; //丢包个数
  150. uint16_t lossPkgId[MAX_LOSS_PKG_COUNT]; //保存丢包编号的数组
  151. uint16_t retransLossPkts; //重传丢包个数
  152. uint16_t Send_interval; //发送间隔
  153. timeout_t tt_ota_onlooker; //旁观者定时
  154. timeout_t tt_ota_continuous; //连续发包定时
  155. timeout_t tt_ota_retransmit; //重传定时
  156. timeout_t tt_ota_total; //总定时
  157. timeout_t tt_ota_retransmit_delay; //发送重传包延时定时
  158. } ota_pkg_info_t;
  159. extern ota_pkg_info_t ota_slave,ota_master;
  160. //升级状态上传
  161. typedef struct _ota_state_upload
  162. {
  163. uint16_t rcv_device_type; //接收设备类型
  164. uint32_t rcv_device_sn; //接收设备sn
  165. uint16_t des_device_type; //目标设备类型
  166. uint32_t des_device_sn; //目标设备sn
  167. uint32_t des_bt_ver; //被升级设备的bootloader版本
  168. uint32_t des_app_ver; //被升级设备的app版本
  169. uint8_t update_state; //升级状态码
  170. uint32_t reserve; //预留
  171. }__attribute__((packed)) ota_state_upload_t;
  172. //网关下发开始离线升级
  173. typedef struct _gateway_coll_offline_upgrade
  174. {
  175. uint16_t master_device_type; //主设备类型
  176. uint32_t master_device_sn; //主设备sn
  177. uint16_t slave_device_type; //从设备类型
  178. uint32_t slave_device_sn; //从设备sn
  179. uint16_t des_device_type; //被升级设备类型
  180. uint32_t des_device_sn; //被升级设备sn
  181. uint32_t reserve; //预留
  182. }__attribute__((packed)) gateway_coll_offline_upgrade_t;
  183. //主设备收到的升级状态
  184. typedef struct _master_rcv_update
  185. {
  186. uint16_t des_type; //设备类型
  187. uint32_t des_sn; //设备sn
  188. uint32_t des_bt; //设备bootloader版本
  189. uint32_t des_app; //设备app版本
  190. uint8_t state; //设备升级状态
  191. }master_rcv_update_t;
  192. //主设备接收的升级状态信息存储
  193. typedef struct _master_rcv_info
  194. {
  195. uint16_t rcv_print_num; //接收的命令个数
  196. uint16_t rcv_total_num; //接收的采集器个数
  197. uint16_t rcv_success_num; //升级成功的个数
  198. master_rcv_update_t master_rcv_update[64]; //记录接收的采集器信息
  199. }master_rcv_info_t;
  200. extern master_rcv_info_t master_rcv_info;
  201. //从设备上报状态信息
  202. typedef struct _slave_upload_info
  203. {
  204. uint8_t num; //上传次数
  205. uint8_t send_flag;
  206. uint32_t delay_time; //延时时间
  207. timeout_t upload_total_time; //总定时
  208. timeout_t upload_cad_time; //每次上传间隔定时
  209. }slave_upload_info_t;
  210. extern slave_upload_info_t slave_upload_info;
  211. #define OTA_START_INFO_LEN sizeof(ota_start_info_t)
  212. #define OTA_CONTINUES_INFO_LEN 17 //sizeof(ota_continues_info_t)
  213. #define OTA_RETRNSMIT_INFO_LEN sizeof(ota_retransmit_req_t)
  214. #define OTA_UPDATE_PAYLAOA_LEN 128
  215. #define OTA_STATE_UPLOAD_LEN sizeof(ota_state_upload_t)
  216. #define OTA_OFFLINE_LEN sizeof(gateway_coll_offline_upgrade_t)
  217. enum {
  218. OTA_START,
  219. OTA_CONTINUE,
  220. OTA_RETRANSMIT,
  221. };
  222. //离线升级状态机
  223. typedef struct _offline_ota_state_t
  224. {
  225. uint8_t flag;
  226. uint8_t state;
  227. uint8_t start_num;
  228. uint16_t pkg_id;
  229. timeout_t tt_send;
  230. }offline_ota_state_t;
  231. extern offline_ota_state_t offline_ota_state;
  232. extern offline_ota_state_t xsp_ota_state;;
  233. #define OFFLINE_OTA_START_TIME (2000)
  234. #define OFFLINE_OTA_CONTINUE_TIME (300)
  235. extern uint8_t updata_state;
  236. void coll_msg_send(collect_gateway_msg_format_t *p_msg, uint8_t msg_type, uint16_t len);
  237. void updata_state_save(uint8_t state);
  238. void BKP_WriteBackupRegister_code(uint16_t BKP_DR, uint8_t Data);
  239. void gateway_lora_ota_proc(collect_gateway_msg_format_t *p_msg);
  240. void ota_continuous_end_handle(void);
  241. void ota_timer_retransmit_slave_set(uint8_t state, uint32_t timeout);
  242. void ota_timer_continuous_slave_set(uint8_t state, uint32_t timeout);
  243. void ota_timer_total_slave_set(uint8_t state, uint32_t timeout);
  244. void ota_slave_time_handle(void);
  245. void ota_timer_retransmit_require_slave_set(uint8_t state, uint32_t timeout);
  246. void ota_timer_upload_cad_slave_set(uint8_t state, uint32_t timeout);
  247. void ota_timer_upload_total_slave_set(uint8_t state, uint32_t timeout);
  248. void lora_slave_ota_updatestate_resp(uint8_t updatestate);
  249. void ota_timer_total_master_set(uint8_t state, uint32_t timeout);
  250. void ota_timer_retransmit_master_set(uint8_t state, uint32_t timeout);
  251. void Offline_upgrade_master(void);
  252. void slave_upload_end(void);
  253. void ota_master_time_handle(void);
  254. void master_rcv_total_proc(void);
  255. int lora_master_ota_gateway_info_init(gateway_coll_offline_upgrade_t *p_off);
  256. int lora_master_ota_key_info_Init(uint32_t total_len, uint32_t total_crc);
  257. void lora_master_ota_proc(collect_gateway_msg_format_t *p_msg);
  258. void lora_offline_update(uint32_t master_sn, uint32_t slave_sn, uint32_t des_sn);
  259. uint32_t xsp_update_reboot(void);
  260. uint8_t ota_update_pkg_check(uint16_t type, uint8_t state);
  261. #endif