drv_IAP.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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. uint8_t usb_rx_buf[IAP_PACK_SIZE + 2] = {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. extern uint32_t rec_err , crc_err;
  71. //发送MAVLINK_ACK
  72. void send_mavlink_ack(void){
  73. int index = 0;
  74. uint16_t checksum = 0;
  75. usb_tx_buf[index++] = mavlink_system.stx;
  76. usb_tx_buf[index++] = mavlink_system.stx;
  77. usb_tx_buf[index++] = mavlink_system.tx_seq;
  78. usb_tx_buf[index++] = mavlink_system.sysid;
  79. usb_tx_buf[index++] = mavlink_system.compid;
  80. usb_tx_buf[index++] = MAVLINK_ACK_ID;
  81. usb_tx_buf[index++] = ack_id;
  82. short_to_buf(&usb_tx_buf[index], &id_cont);
  83. index += 2;
  84. // 计算有效载荷长度
  85. usb_tx_buf[1] = index - 6;
  86. checksum = Get_Crc16(usb_tx_buf,(uint16_t) index);
  87. usb_tx_buf[index++] = checksum & 0xff;
  88. usb_tx_buf[index++] = (checksum >> 8) & 0xff;
  89. CDC_Transmit_FS(usb_tx_buf, index);
  90. }
  91. uint16_t offset;
  92. //上报MAVLINK_BOOTLOADER_STATUS
  93. void send_mavlink_bootloader_status(uint8_t bootloader_status){
  94. uint16_t index = 0;
  95. offset = 0;
  96. uint16_t checksum = 0;
  97. memset(usb_tx_buf,0,sizeof(usb_tx_buf));
  98. usb_tx_buf[offset++] = mavlink_system.stx;
  99. usb_tx_buf[offset++] = mavlink_system.stx;
  100. usb_tx_buf[offset++] = mavlink_system.tx_seq;
  101. usb_tx_buf[offset++] = mavlink_system.sysid;
  102. usb_tx_buf[offset++] = mavlink_system.compid;
  103. usb_tx_buf[offset++] = MAVLINK_BOOTLOADER_STATUS;
  104. usb_tx_buf[offset++] = bootloader_status;
  105. usb_tx_buf[1] = offset - 6;
  106. checksum = Get_Crc16(usb_tx_buf,(uint16_t) offset);
  107. usb_tx_buf[offset++] = checksum & 0xff;
  108. usb_tx_buf[offset++] = (checksum >> 8) & 0xff;
  109. CDC_Transmit_FS(usb_tx_buf, offset);
  110. }
  111. uint8_t first_rxdata = 0, second_rxdata = 0, third_rxdata = 0, fourth_rxdata = 0, fifth_rxdata = 0, sixth_rxdata = 0;
  112. void recv_iap_station_data_hookfunction(unsigned char rec_data){
  113. sixth_rxdata = fifth_rxdata;
  114. fifth_rxdata = fourth_rxdata;
  115. fourth_rxdata = third_rxdata;
  116. third_rxdata = second_rxdata;
  117. second_rxdata = first_rxdata;
  118. first_rxdata = rec_data;
  119. //如果接收到协议数据包
  120. if (receive_mavlink_msg == true){
  121. usb_rx_buf[usb_rx_index++] = rec_data;
  122. //如果数据包超出协议规定的最大长度
  123. if(mavlink_msg.payload > IAP_PACK_SIZE - mavlink_system.headbytes
  124. - mavlink_system.checkbytes){
  125. receive_mavlink_msg = false;
  126. usb_rx_index = 0;
  127. }
  128. //如果到达数据包尾
  129. if(usb_rx_index >= mavlink_msg.payload + mavlink_system.headbytes +
  130. mavlink_system.checkbytes){
  131. receive_mavlink_msg = false;
  132. usb_rx_index = 0;
  133. if(Get_Crc16(usb_rx_buf, mavlink_msg.payload + mavlink_system.headbytes
  134. + mavlink_system.checkbytes) == 0x0000){
  135. switch(mavlink_msg.msgid){
  136. case 200: // 固件信息初始化包
  137. buf_to_int(&iap_bin_Size, &usb_rx_buf[6]);
  138. recv_iap_flag = INIT; // 进入初始化状态
  139. recv_init_flag = true;
  140. break;
  141. case 201: // 固件数据传输包
  142. if(recv_iap_flag == TRANSMIT){ //如果是传输状态
  143. if(recv_onepack_flag != true){
  144. //USBD_Stop(&hUsbDeviceFS); // 停止USB接收
  145. //USBD_CDC_Stop(&hUsbDeviceFS); // 停止USB接收
  146. pack_send_flag = false; // 停止发送
  147. recv_onepack_flag = true; // 设置包接收标志
  148. buf_to_short(&iap_bin_num, &usb_rx_buf[6]);
  149. one_pack_size = mavlink_msg.payload - 2;
  150. //保护usb_rx_buf数组不被更新
  151. }
  152. }
  153. else if(recv_iap_flag == INIT){ //如果是初始化状态
  154. buf_to_short(&iap_bin_num, &usb_rx_buf[6]);
  155. if(iap_bin_num == 1){
  156. recv_erasure_flag = true; //进行擦除
  157. }
  158. }
  159. break;
  160. case 202:
  161. if(pre_iap_bin_num != iap_bin_Size / one_pack_size){
  162. if(recv_iap_flag == TRANSMIT){
  163. recv_iap_flag = FINISH;
  164. }
  165. recv_finish_flag = true;
  166. }
  167. break;
  168. default:
  169. break;
  170. }
  171. }
  172. else{
  173. crc_err++;
  174. }
  175. }
  176. //如果接收到协议头
  177. }else if(sixth_rxdata == mavlink_msg.stx &&
  178. third_rxdata == mavlink_msg.sysid &&
  179. second_rxdata == mavlink_msg.compid){
  180. receive_mavlink_msg = true;
  181. usb_rx_index = 0;
  182. mavlink_msg.payload = fifth_rxdata;
  183. mavlink_msg.seq = fourth_rxdata;
  184. mavlink_msg.msgid = first_rxdata;
  185. //填充rx_buf头
  186. usb_rx_buf[0] = sixth_rxdata;
  187. usb_rx_buf[1] = fifth_rxdata;
  188. usb_rx_buf[2] = fourth_rxdata;
  189. usb_rx_buf[3] = third_rxdata;
  190. usb_rx_buf[4] = second_rxdata;
  191. usb_rx_buf[5] = first_rxdata;
  192. usb_rx_index = 6;
  193. }
  194. //如果接收到急救指令
  195. else if((fourth_rxdata == '$') && (third_rxdata == 'A') && (second_rxdata == 'I')
  196. && (first_rxdata == 'D')){
  197. recv_aid_flag = true;
  198. }
  199. }