ota_update.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #ifndef _OTA_UPDATE_H_
  2. #define _OTA_UPDATE_H_
  3. #include "../User/gd32f10x_it.h"
  4. #include "../Hardware/boardinit.h"
  5. enum { // 升级结果类型
  6. UPDATE_RECEIVE_UPDATEFLAG = 0x11, // 收到服务器的升级指令
  7. UPDATE_SAMEVERSION, // 和当前版本相同
  8. UPDATE_FAILE_NOCOLLECT, // 此采集器不在本网关下
  9. UPDATE_HTTP_ERROR, //HTTP返回错误码
  10. UPDATE_DOWNLOADFILE_FAILED, //文件下载失败,即文件大小小于2个字节
  11. UPDATE_DOWNLOADFILE_SUCCESS, // 文件下载成功
  12. UPDATE_CRCERROR, // 文件包中的CRC与实际不符
  13. UPDATE_URL_FILE_TYPE_ERROR, // URL中的文件信息与文件包中的信息不一致
  14. UPDATE_DEVICETYPEERROR, // 升级设备类型不匹配
  15. UPdATE_FILE_LEN_ERROR, // 升级文件长度超过128个字节
  16. UPDATE_SUCCESS, // 升级成功
  17. UPDATE_RETURN_SUCESS, // 回退
  18. };
  19. //升级状态
  20. #define START_UPDATA 0x21 //已收到正确的升级指令
  21. #define PACKET_LOSS_MORE 0x22 //丢包超标,升级结束
  22. #define RETRANSMIT_TIMEOUT 0x23 //重传阶段超时,升级失败
  23. #define UPDATA_CRC_ERROR 0x24 //升级包CRC校验失败
  24. #define DEVICE_TYPE_ERROR 0x25 //目标设备类型不匹配
  25. #define UPDATA_PACKAGE_LENGTH_ERROR 0x26 //长度不符
  26. #define FIXED_CHARACTER_ERROR 0x27 //固定字符错误
  27. #define UPDATA_DATA_SUCCESS 0x28 //升级包接收正确
  28. #define UPDATA_TOTAL_TIMEOUT 0x29 //升级总时间超时
  29. #define UPDATA_SUCCESS 0x2A //升级成功
  30. #define UPDATA_BACK 0x2B //回退
  31. #define UPDATE_SLAVE 0x5AA5
  32. enum {
  33. UP_PROG_FROM_NET = 0x22, // 来源来网络
  34. UP_PROG_FROM_GAT = 0x44, //来源来网关
  35. };
  36. #define OTA_UPDATE_BOOTROM_FLASH_START_ADDR (0x08000000) //
  37. #define OTA_UPDATE_PT_FLASH_SIZE (0x8000) //
  38. #define OTA_UPDATE_PT_FLASH_START_ADDR (0x08008000) //
  39. #define OTA_UPDATE_PT_FLASH_END_ADDR (OTA_UPDATE_PT_FLASH_START_ADDR+OTA_UPDATE_PT_FLASH_SIZE-1)
  40. #define OTA_UPDATE_APP1_FLASH_SIZE (0x18000) //
  41. #define OTA_UPDATE_APP1_FLASH_START_ADDR (0x08018000) //
  42. #define OTA_UPDATE_APP1_FLASH_END_ADDR (OTA_UPDATE_APP1_FLASH_START_ADDR+OTA_UPDATE_APP1_FLASH_SIZE-1) //
  43. #define OTA_UPDATE_APP2_FLASH_SIZE (0x18000) //
  44. #define OTA_UPDATE_APP2_FLASH_START_ADDR (0x08030000) //
  45. #define OTA_UPDATE_APP2_FLASH_END_ADDR (OTA_UPDATE_APP2_FLASH_START_ADDR+OTA_UPDATE_APP2_FLASH_SIZE-1) //
  46. #define OTA_UPDATE_APP3_FLASH_SIZE (0x18000) //
  47. #define OTA_UPDATE_APP3_FLASH_START_ADDR (0x08048000) //
  48. #define OTA_UPDATE_APP3_FLASH_END_ADDR (OTA_UPDATE_APP3_FLASH_START_ADDR+OTA_UPDATE_APP3_FLASH_SIZE-1) //
  49. typedef struct _UPDATE_DATA_{
  50. uint16_t updateCode; // 升级状态码,
  51. uint8_t bResetUpdate; // 升级完成后,需要上报升级的状态(包含从设备通过485上报,或是主设备通过4G上报)
  52. uint8_t bReadUpdateCode; // 可以允许读取升级状态码了
  53. uint16_t taskNo; // 升级任务号
  54. uint8_t bupdateFinish; // 升级是否完成
  55. uint8_t brcvCmd0x16; // 收到16指令
  56. uint8_t Work_State; // 当前升级状态
  57. uint8_t bRetransmit; // 是否允许重传 1:不允许, 0:允许
  58. uint8_t iDentity; //升级时的身份(下发设备或被升级设备)
  59. uint8_t retransmit_s;//是否发送了重传指令
  60. uint8_t ResetUpdate_s;//是否需要上报升级状态
  61. uint8_t Update_Source;//升级来源
  62. uint16_t bUpdate_slave;//是否需要升级从设备
  63. uint8_t bOffline_s; //是否开始离线升级
  64. uint32_t bOffline_addr; //离线升级首地址
  65. uint8_t bfirmware_type;//升级的固件类型
  66. }__attribute__((packed))UpdateDa;
  67. extern UpdateDa g_updateDa;
  68. #define OTA_TIM_ONLOOKER 5000 // 旁观都 5S
  69. #define OTA_TIM_TOTALTMR (60000*5) // 升级总定时器
  70. #define OTA_TIM_REPEAT (60*1000) // 重传定时器10S
  71. #define OTA_TIM_REPEAR_MASTER (10*1000) //重传定时器(主设备)
  72. //#define OTA_TIM_REPEAR_SLAVE_FAST (rand()%100+300) //重传定时器快(从设备)
  73. //#define OTA_TIM_REPEAR_SLAVE_SLOW (rand()%100+500) //重传定时器慢
  74. #define OTA_TIM_CONTINUE 3000 // 连续接收时间 3S
  75. enum {
  76. OTA_TIMER_NULL = 0x00,
  77. OTA_TIMER_START = 0x01,
  78. OTA_TIMER_END = 0x02,
  79. };
  80. typedef struct _ota_update_time_set_{
  81. timeout_t timer;
  82. uint8_t status;
  83. }__attribute__((packed))otaTimeSet;
  84. typedef struct _ota_update_time_{
  85. otaTimeSet totalTmr; // 升级总时间
  86. otaTimeSet continueTmr; // 连续接收时间
  87. otaTimeSet repeatTmr; // 重传时间
  88. otaTimeSet onlookerTmr; // 旁观者时间
  89. otaTimeSet randomTmr; // 随机定时器
  90. otaTimeSet upstatusTmr; // 读取状态时间
  91. otaTimeSet repeatRandomTmr;//重传随机时间
  92. }__attribute__((packed))OtaUpdateTime;
  93. extern OtaUpdateTime g_otaTimer;
  94. /*-----------------------------------------------升级标记----------------------------------*/
  95. #define UPDATE_FLAG 0x81 // 升级标志
  96. #define UPDATE_SUCCESS_FLAG 0x82 // 升级成功标志
  97. #define BACKOFF_OVER 0x83 // 回滚成功
  98. /*---------------------------------------------升级协议开始-------------------------------------*/
  99. enum {
  100. OTA_UPDATE_NULL = 0x00, // 默认状态
  101. OTA_UPDATE_ONLOOKER = 0x01, // 旁观者模式
  102. OTA_UPDATE_BEGIN = 0x02, // 启动升级
  103. OTA_UPDATE_CONTINUE = 0x03, // 连续续传模式
  104. OTA_UPDATE_REPEAT = 0x04, // 重传模式
  105. OTA_UPDATE_RCVEND = 0x05, // 升级包接收完成
  106. OTA_UPDATE_CONTINUE_END = 0x06, // 连续包结束
  107. OTA_UPDATE_REPEAT_END = 0x07, // 重传包结束
  108. };
  109. typedef struct _ota_update_msg_{
  110. uint16_t rcvDevType; // 接收设备类型
  111. uint32_t rcvDevSn; // 接收设备SN
  112. uint16_t desDevType; // 升级目标设备类型
  113. uint32_t desDevSn; // 升级目标设备SN
  114. uint8_t firmType; // 固件类型
  115. uint32_t version; // 升级版本号
  116. uint32_t totalByte; // 升级总总长度
  117. uint16_t eachMaxByte; // 单包最大字节类
  118. uint16_t losePage; // 最大丢包百分比 最小为10%,最大为60%
  119. uint16_t loseTotalPage; // 最大丢包个数
  120. uint16_t sendInterval; // 连续阶段发 送包的时间间隔(单位:ms)
  121. uint16_t totalPage; // 升级包总个数
  122. uint16_t subPkgId; // 升级包编号
  123. uint16_t subPkgLen; // 本升级包的长度
  124. uint8_t losePkgNum; // 丢包的个数
  125. uint16_t lastRightPkgNum;
  126. uint16_t lossPkgId[250];
  127. uint8_t retransLossPkts; //重传丢包个数
  128. uint8_t lossPkgIndex;
  129. }__attribute__((packed))otaUpdatMsg;
  130. typedef struct _update_cmd_0x1003_{ // 启动升级下行
  131. uint16_t rcvDevType; // 接收设备类型
  132. uint32_t rcvDevSn; // 接收设备SN
  133. uint16_t desDevType; // 升级目标设备类型
  134. uint32_t desDevSn; // 升级目标设备SN
  135. uint8_t firmType; // 固件类型
  136. uint32_t updateVer; // 升级包版本
  137. uint32_t totalByte; // 升级总总长度
  138. uint16_t eachMaxByte; // 单包最大字节类
  139. uint16_t losePage; // 最大丢包面分比 最小为10%,最大为60%
  140. uint16_t sendInterval; // 连续阶段发 送包的时间间隔(单位:ms)
  141. }__attribute__((packed))updateCmd0x1003;
  142. typedef struct _update_cmd_0x1004_{ // 连续包下行
  143. uint16_t rcvDevType; // 接收设备类型
  144. uint32_t rcvDevSn; // 接收设备SN
  145. uint16_t desDevType; // 升级目标设备类型
  146. uint32_t desDevSn; // 升级目标设备SN
  147. uint16_t totalPage; // 升级包总个数
  148. uint16_t subPkgId; // 升级包编号
  149. uint16_t subPkgLen; // 本升级包的长度
  150. }__attribute__((packed))updateCmd0x1004;
  151. typedef struct _update_cmd_0x1005_{ // 重传包
  152. uint16_t rcvDevType; // 接收设备类型
  153. uint32_t rcvDevSn; // 接收设备SN
  154. uint16_t desDevType; // 升级目标设备类型
  155. uint32_t desDevSn; // 升级目标设备SN
  156. uint16_t totalPage; // 升级包总个数
  157. uint16_t subPkgId; // 升级包编号
  158. uint16_t subPkgLen; // 本升级包的长度
  159. }__attribute__((packed))updateCmd0x1005;
  160. typedef struct _update_cmd_0x2005_{ // 重传包请求上行
  161. uint16_t slaveDevType;
  162. uint32_t slaveDevSn;
  163. uint16_t repDevType; // 发起请求的设备类型
  164. uint32_t repDevSn; // 发起请求的设备SN
  165. uint16_t repPkgId; // 升级包编号
  166. }__attribute__((packed))updateCmd0x2005;
  167. typedef struct _update_cmd_0x1006_{ // 离线升级指令
  168. uint16_t masterDevType; // 主设备类型
  169. uint32_t masterDevSn; // 主设备SN
  170. uint16_t slaveDevType; // 从设备类型
  171. uint32_t slaveDevSn; // 从设备SN
  172. uint16_t desDevType; // 升级目标设备类型
  173. uint32_t desDevSn; // 升级目标设备SN
  174. uint8_t firmType; // 固件类型
  175. uint32_t reserve; // 预留
  176. }__attribute__((packed))updateCmd0x1006;
  177. typedef struct _update_cmd_0x1007_{ // 升级状态读取下行
  178. uint16_t rcvDevType; // 接收设备类型
  179. uint32_t rcvDevSn; // 接收设备SN
  180. uint16_t pointDevType; // 指定读取的设备类型
  181. uint32_t pointDevSn; // 指定读取的设备SN
  182. uint32_t reserve; // 预留
  183. }__attribute__((packed))updateCmd0x1007;
  184. typedef struct _update_cmd_0x2007_{ // 升级状态读取上行
  185. uint16_t slaveDevType; // 从设备类型
  186. uint32_t slaveDevSn; // 从设备SN
  187. uint16_t desDevType; // 升级目标设备类型
  188. uint32_t desDevSn; // 升级目标设备SN
  189. uint32_t bootVer; // 升级目标bootloader版本
  190. uint32_t ptVer; // 升级目标的产测版本
  191. uint32_t appVer; // 升级目标的app版本
  192. uint8_t updateCode; // 升级状态码
  193. uint32_t reserve; // 预留
  194. }__attribute__((packed))updateCmd0x2007;
  195. #define OTA_START_INFO_LEN sizeof(updateCmd0x1003)
  196. #define OTA_CONTINUES_INFO_LEN sizeof(updateCmd0x1004)
  197. #define OTA_RETRNSMIT_INFO_LEN sizeof(updateCmd0x1005)
  198. #define OTA_MASTER_SEND_PKG_SIZE 128 // 主下发每包的大小
  199. /*---------------------------------------------升级协议结束-------------------------------------*/
  200. extern void ota_repeat_rand_timer(uint8_t status);
  201. extern void ota_update_master_retransmit(uint8_t *data);
  202. extern void ota_timer_stop(otaTimeSet *timer);
  203. extern void set_start_ota_timer(otaTimeSet *timer, uint32_t delay);
  204. extern void ota_power_up_read_update_status(void);
  205. extern void ota_update_slave_task(uint16_t cmd, uint8_t *data, uint8_t len);
  206. extern void ota_check_update_timer(void);
  207. extern void ota_update_deal_upstatus(void);
  208. extern void ota_update_slave_continue_end(uint8_t workMode);
  209. extern void ota_master_init_update_msg_offline(uint16_t rcvdevtype,uint32_t rcvdevsn,uint16_t desdevtype,uint32_t desdevsn,uint8_t firmtype);
  210. extern uint8_t ota_offline_init(uint32_t addr,uint32_t len);
  211. extern void ota_offline_proc(void);
  212. extern void ota_offline_handle(void);
  213. extern void ota_update_slave_offline(uint8_t *data,uint8_t len);
  214. extern void master_update_status_rcv(uint8_t *data, uint32_t len);
  215. extern void ota_start_offline_update(void);
  216. #endif