drv_IAP.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. #include "drv_IAP.h"
  2. #include "usbd_cdc_if.h"
  3. //#include "CRC.h"
  4. #include "CRC16.h"
  5. #include "usb_device.h"
  6. #include "usbd_cdc.h"
  7. static void short_to_buf(unsigned char *buf, short *tshort){
  8. int i;
  9. unsigned char *p1 = (unsigned char *)tshort;
  10. unsigned char *p2 = buf;
  11. for(i = 0;i < 2;i++){
  12. *p2 = *p1;
  13. p1++;
  14. p2++;
  15. }
  16. }
  17. static void buf_to_short(short *tshort, unsigned char *buf){
  18. int i;
  19. unsigned char *p1 = (unsigned char *)tshort;
  20. unsigned char *p2 = buf;
  21. for(i = 0;i < 2;i++){
  22. *p1 = *p2;
  23. p1++;
  24. p2++;
  25. }
  26. }
  27. static void buf_to_int(int *tint, unsigned char *buf){
  28. int i;
  29. unsigned char *p1 = (unsigned char *)tint;
  30. unsigned char *p2 = buf;
  31. for(i = 0;i < 4;i++){
  32. *p1 = *p2;
  33. p1++;
  34. p2++;
  35. }
  36. }
  37. unsigned char send_what = 0;
  38. uint8_t ack_id = 0;
  39. short id_cont = 0;
  40. bool IAP_STATUS_FLAG = true;
  41. uint32_t usb_rx_index = 0;
  42. __ALIGN_BEGIN uint8_t usb_rx_buf[IAP_PACK_SIZE + 2] __ALIGN_END= {0};
  43. uint8_t usb_tx_buf[IAP_PACK_SIZE] = {0};
  44. uint32_t usb_tx_index = 0;
  45. bool recv_aid_flag = false,
  46. recv_init_flag = false,
  47. recv_erasure_flag = false,
  48. recv_finish_flag = false,
  49. recv_onepack_flag = false;
  50. IAP_STATUS recv_iap_flag = DEFAULT;
  51. int iap_bin_Size = 0;
  52. short iap_bin_num = 0, pre_iap_bin_num = 0;
  53. unsigned char one_pack_size = 0;
  54. bool pack_send_flag = true;
  55. mavlink_system_t mavlink_system = {
  56. .stx = 254,
  57. .headbytes = 6,
  58. .checkbytes = 2,
  59. .sysid = 0,
  60. .compid = 0,
  61. .tx_seq = 0,
  62. .rx_seq = 0
  63. };
  64. mavlink_msg_t mavlink_msg = {
  65. .stx = 254,
  66. .sysid = 0,
  67. .compid = 5
  68. };
  69. bool receive_mavlink_msg = false;
  70. //除最后一包,前面固件包固定大小 0xF0 240字节
  71. const uint8_t pack_size = 0xF0;
  72. extern uint32_t rec_err , crc_err;
  73. //发送MAVLINK_ACK
  74. void send_mavlink_ack(void){
  75. int index = 0;
  76. uint16_t checksum = 0;
  77. usb_tx_buf[index++] = mavlink_system.stx;
  78. usb_tx_buf[index++] = mavlink_system.stx;
  79. usb_tx_buf[index++] = mavlink_system.tx_seq;
  80. usb_tx_buf[index++] = mavlink_system.sysid;
  81. usb_tx_buf[index++] = mavlink_system.compid;
  82. usb_tx_buf[index++] = MAVLINK_ACK_ID;
  83. usb_tx_buf[index++] = ack_id;
  84. short_to_buf(&usb_tx_buf[index], &id_cont);
  85. index += 2;
  86. // 计算有效载荷长度
  87. usb_tx_buf[1] = index - 6;
  88. checksum = Get_Crc16(usb_tx_buf,(uint16_t) index);
  89. usb_tx_buf[index++] = checksum & 0xff;
  90. usb_tx_buf[index++] = (checksum >> 8) & 0xff;
  91. CDC_Transmit_FS(usb_tx_buf, index);
  92. }
  93. uint16_t offset;
  94. //上报MAVLINK_BOOTLOADER_STATUS
  95. void send_mavlink_bootloader_status(uint8_t bootloader_status){
  96. uint16_t index = 0;
  97. offset = 0;
  98. uint16_t checksum = 0;
  99. memset(usb_tx_buf,0,sizeof(usb_tx_buf));
  100. usb_tx_buf[offset++] = mavlink_system.stx;
  101. usb_tx_buf[offset++] = mavlink_system.stx;
  102. usb_tx_buf[offset++] = mavlink_system.tx_seq;
  103. usb_tx_buf[offset++] = mavlink_system.sysid;
  104. usb_tx_buf[offset++] = mavlink_system.compid;
  105. usb_tx_buf[offset++] = MAVLINK_BOOTLOADER_STATUS;
  106. usb_tx_buf[offset++] = bootloader_status;
  107. usb_tx_buf[1] = offset - 6;
  108. checksum = Get_Crc16(usb_tx_buf,(uint16_t) offset);
  109. usb_tx_buf[offset++] = checksum & 0xff;
  110. usb_tx_buf[offset++] = (checksum >> 8) & 0xff;
  111. CDC_Transmit_FS(usb_tx_buf, offset);
  112. }
  113. uint8_t first_rxdata = 0, second_rxdata = 0, third_rxdata = 0, fourth_rxdata = 0, fifth_rxdata = 0, sixth_rxdata = 0;
  114. void recv_iap_station_data_hookfunction(unsigned char rec_data){
  115. sixth_rxdata = fifth_rxdata;
  116. fifth_rxdata = fourth_rxdata;
  117. fourth_rxdata = third_rxdata;
  118. third_rxdata = second_rxdata;
  119. second_rxdata = first_rxdata;
  120. first_rxdata = rec_data;
  121. //如果接收到协议数据包
  122. if (receive_mavlink_msg == true){
  123. usb_rx_buf[usb_rx_index++] = rec_data;
  124. //如果数据包超出协议规定的最大长度
  125. if(mavlink_msg.payload > IAP_PACK_SIZE - mavlink_system.headbytes
  126. - mavlink_system.checkbytes){
  127. receive_mavlink_msg = false;
  128. usb_rx_index = 0;
  129. }
  130. //如果到达数据包尾
  131. if(usb_rx_index >= mavlink_msg.payload + mavlink_system.headbytes +
  132. mavlink_system.checkbytes){
  133. receive_mavlink_msg = false;
  134. usb_rx_index = 0;
  135. if(Get_Crc16(usb_rx_buf, mavlink_msg.payload + mavlink_system.headbytes
  136. + mavlink_system.checkbytes) == 0x0000){
  137. switch(mavlink_msg.msgid){
  138. case 200: // 固件信息初始化包
  139. buf_to_int(&iap_bin_Size, &usb_rx_buf[6]);
  140. recv_iap_flag = INIT; // 进入初始化状态
  141. recv_init_flag = true;
  142. break;
  143. case 201: // 固件数据传输包
  144. if(recv_iap_flag == TRANSMIT){ //如果是传输状态
  145. if(recv_onepack_flag != true){
  146. //USBD_Stop(&hUsbDeviceFS); // 停止USB接收
  147. //USBD_CDC_Stop(&hUsbDeviceFS); // 停止USB接收
  148. pack_send_flag = false; // 停止发送
  149. recv_onepack_flag = true; // 设置包接收标志
  150. buf_to_short(&iap_bin_num, &usb_rx_buf[6]);
  151. one_pack_size = mavlink_msg.payload - 2;
  152. //保护usb_rx_buf数组不被更新
  153. }
  154. }
  155. else if(recv_iap_flag == INIT){ //如果是初始化状态
  156. buf_to_short(&iap_bin_num, &usb_rx_buf[6]);
  157. if(iap_bin_num == 1){
  158. recv_erasure_flag = true; //进行擦除
  159. }
  160. }
  161. break;
  162. case 202:
  163. //考虑到固件包大小刚好能被250字节整除和不被乘除的情况
  164. if(pre_iap_bin_num >= iap_bin_Size / pack_size){
  165. if(recv_iap_flag == TRANSMIT){
  166. recv_iap_flag = FINISH;
  167. }
  168. recv_finish_flag = true;
  169. }
  170. break;
  171. default:
  172. break;
  173. }
  174. }
  175. else{
  176. crc_err++;
  177. }
  178. }
  179. //如果接收到协议头
  180. }else if(sixth_rxdata == mavlink_msg.stx &&
  181. third_rxdata == mavlink_msg.sysid &&
  182. second_rxdata == mavlink_msg.compid){
  183. receive_mavlink_msg = true;
  184. usb_rx_index = 0;
  185. mavlink_msg.payload = fifth_rxdata;
  186. mavlink_msg.seq = fourth_rxdata;
  187. mavlink_msg.msgid = first_rxdata;
  188. //填充rx_buf头
  189. usb_rx_buf[0] = sixth_rxdata;
  190. usb_rx_buf[1] = fifth_rxdata;
  191. usb_rx_buf[2] = fourth_rxdata;
  192. usb_rx_buf[3] = third_rxdata;
  193. usb_rx_buf[4] = second_rxdata;
  194. usb_rx_buf[5] = first_rxdata;
  195. usb_rx_index = 6;
  196. }
  197. //如果接收到急救指令
  198. else if((fourth_rxdata == '$') && (third_rxdata == 'A') && (second_rxdata == 'I')
  199. && (first_rxdata == 'D')){
  200. recv_aid_flag = true;
  201. }
  202. }