dfota.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #ifndef _DFOTA_H
  2. #define _DFOTA_H
  3. #include <minwindef.h>
  4. #include <qtextedit.h>
  5. #include "mainwindow.h"
  6. // #define MAX_BIN_SIZE (256*1024) //单个bin文件最大值;
  7. #define MAX_BIN_SIZE (4*1024*1024) //单个bin文件最大值;
  8. #define MAX_OLDFILES_NUM 8 //旧bin文件的个数的最大值;
  9. #define BLOCK_MAX 8 //块数量的最大值;
  10. #define NEW_EP (0X80000000) //入口地址;
  11. #define PACKAGE_MAGIC "DFOTA_PK_V002"
  12. #define BLOCK_MAGIC "BLOK"
  13. #define BSDIFF_MAGIC "ENDSLEY/BSDIFF43"
  14. typedef struct InputData{
  15. uint32_t ep=NEW_EP;
  16. char newFilePath[MAX_PATH];
  17. char oldFilePath[MAX_OLDFILES_NUM][MAX_PATH];
  18. bool oldCheck[MAX_OLDFILES_NUM];
  19. char pkgFilePath[MAX_PATH];
  20. bool check_d;
  21. bool check_z;
  22. }InputData_t;
  23. class DFOTA{
  24. public:
  25. DFOTA();
  26. ~DFOTA();
  27. public:
  28. int bsdiff_task(MainWindow* ui,InputData_t* inputData);
  29. int check_task(MainWindow* ui,InputData_t* inputData);
  30. int read_task(MainWindow* ui,InputData_t* inputData);
  31. int bspatch_task(MainWindow* ui,InputData_t* inputData);
  32. };
  33. /**************************** 以下为结构体定义*****************************/
  34. typedef struct{
  35. bool ok;
  36. char* path;
  37. char drive[MAX_PATH];
  38. char dir[MAX_PATH];
  39. char filename[MAX_PATH];
  40. char ext[MAX_PATH];
  41. uint8_t* addr;
  42. uint32_t size;
  43. uint32_t app_ver;
  44. uint16_t dev_type;
  45. uint32_t crc32;
  46. }bin_file_t;
  47. #pragma pack(1) // 1字节对齐
  48. // 下载包,结构体
  49. typedef struct{
  50. uint8_t* pkg_addr; // 下载包的首地址;
  51. uint32_t pkg_size; // 下载包的大小,完整的;从数据包里解析出来的原始字段值
  52. uint32_t pkg_crc32; // 下载包的crc32;从数据包里解析出来的原始字段值
  53. uint32_t calc_pkg_size; // 下载包的大小,完整的;经过计算的值 calc_size == pkg_size
  54. uint32_t calc_pkg_crc32; // 下载包的crc32;经过计算的值 calc_crc32 = crc32(pkg_addr,calc_size - 4)
  55. }DFOTA_pkg_t;
  56. // 下载包,头,结构体,
  57. // header_size = sizeof(DFOTA_pkg_header_t)
  58. typedef struct{
  59. uint8_t pkg_magic[16]; // ="DFOTA_PK_V002"; 魔数,差分升级标记,整个下载包的起始标记
  60. uint32_t pkg_time; // 打包的时间戳;
  61. uint32_t pkg_size; // 从数据包里解析出来的原始字段值
  62. }DFOTA_pkg_header_t;
  63. // 块,结构体
  64. // DFOTA_blk_t block[BLOCK_MAX] // 数组定义
  65. typedef struct{
  66. uint8_t* blk_addr; // 第n个块的首地址;
  67. uint32_t blk_size; // 第n个块的大小,完整的;从数据包里解析出来的原始字段值
  68. uint32_t blk_crc32; // 第n个块的crc32;从数据包里解析出来的原始字段值
  69. uint32_t calc_blk_size; // 第n个块的大小,完整的;经过计算的值 calc_size == blk_size
  70. uint32_t calc_blk_crc32; // 第n个块的crc32;经过计算的值 calc_crc32 = crc32(blk_addr,calc_size - 4)
  71. uint8_t* payload_addr; // 载荷的首地址;
  72. uint32_t payload_size; // 载荷的大小,完整的
  73. }DFOTA_blk_t;
  74. //块,头,结构体,header_size = sizeof(DFOTA_pkg_header_t)
  75. typedef struct{
  76. uint8_t blk_magic[4]; // ="BLOK"//魔数,块标记
  77. uint32_t blk_size; // 此字段之后crc32之前的字节数
  78. uint8_t d_flag; // 差分算法标记
  79. uint8_t z_flag; // 压缩算法标记
  80. uint16_t reserve; // 预留
  81. uint32_t old_ver; // 旧固件[old.bin]的版本号
  82. uint32_t old_size; // 旧固件[old.bin]的字节数
  83. uint32_t old_crc32; // 旧固件[old.bin]的crc32
  84. uint32_t new_ver; // 新固件[new.bin]的版本号
  85. uint32_t new_size; // 新固件[new.bin]的字节数
  86. uint32_t new_crc32; // 新固件[new.bin]的crc32
  87. uint32_t new_ep; // 新固件[new.bin]的入口地址
  88. uint32_t pad_size; // 为了4字节对齐,而在block尾部填充的字节数,0-3。利用此字段可以精确计算压缩后字节数
  89. // uint32_t lamz_size; // 压缩后字节数
  90. }DFOTA_blk_header_t;
  91. // 载荷,结构体
  92. typedef struct{
  93. uint8_t* diff_header_addr; // 差分头首地址
  94. uint8_t* compr_header_addr; // 压缩头首地址
  95. uint8_t* data_addr; // data首地址
  96. uint32_t data_size; // data的大小;
  97. }DFOTA_payload_t;
  98. // 差分,头,结构体,header_size = sizeof(DFOTA_bsdiff_header_t)
  99. typedef struct{
  100. uint8_t diff_magic[16]; // ="ENDSLEY/BSDIFF43"
  101. uint32_t new_size; // new file size in Byte(s)(new.bin的字节数)
  102. }DFOTA_bsdiff_header_t;
  103. // 压缩,头,结构体,header_size = sizeof(DFOTA_lzma_header_t)
  104. typedef struct{
  105. //int32_t lzma_size; // 压缩后的字节数,可能不是4字节对齐
  106. uint8_t props; // Special LZMA properties (lc,lp, pb in encoded form)
  107. uint32_t dic; // Dictionary size (little endian)
  108. uint64_t raw_size; // 没压缩时的字节数diff_raw.bin的字节数
  109. }DFOTA_lzma_header_t;
  110. // DFOTA设备相关参数结构体定义
  111. typedef struct{
  112. uint32_t current_ver; // 当前版本
  113. uint32_t current_size; // 当前版本
  114. uint32_t current_crc32; // 当前版本
  115. uint32_t blk_sum; // 实际解析到的块的个数
  116. uint32_t blk_match_index; // 索引到的匹配的块下标
  117. //.....
  118. }DFOTA_dev_t;
  119. #pragma pack() // 取消1字节对齐,恢复为默认4字节对齐
  120. // 显示时间的格式,到秒 2020-01-01 00:00:00
  121. void get_time_display_s(char* str_time);
  122. // 显示时间的格式,到毫秒 2020-01-01 00:00:00.000
  123. void get_time_display_ms(char* str_time);
  124. // 由时间戳转字符串,到秒 2020-01-01 00:00:00
  125. void get_stamp2string_s(time_t stamp,char* str_time);
  126. // 生成文件名格式,到秒 20200101-000000
  127. void get_time_file_name_s(char* str_time);
  128. // 生成文件名格式,到毫秒 20200101-000000-000
  129. void get_time_file_name_ms(char* str_time);
  130. void dfota_test(void);
  131. int my_fr(const char* path,uint8_t* buff,int *size);
  132. #endif // MAINWINDOW_H