usb_vendor.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #include "include.h"
  2. #include "usb_com.h"
  3. #include "usb_hid.h"
  4. #include "usb_vendor.h"
  5. #include "usb_vendor_desc.h"
  6. #include "fota_proc.h"
  7. #if USB_VENDOR_EN
  8. udv_t udv_0 AT(.usb_buf.usb);
  9. epcb_t ep_vendor_tx AT(.usb_buf.usb);
  10. epcb_t ep_vendor_rx AT(.usb_buf.usb);
  11. u8 ep_vendor_buf_out[VENDOR_EP_OUT_MAX_SIZE + 4] AT(.usb_buf.vendor); // CRC
  12. u8 ep_vendor_buf_in[VENDOR_EP_IN_MAX_SIZE] AT(.usb_buf.vendor);
  13. static usb_vendor_send_tag_t usb_vendor_send_pool[5] AT(.usb_buf.vendor);
  14. static list_t usb_vendor_send_queue AT(.usb_buf.vendor);
  15. static list_t usb_vendor_free_queue AT(.usb_buf.vendor);
  16. static bool usb_vendor_is_valid(void)
  17. {
  18. return true;
  19. }
  20. void ude_vendor_setvalid(bool valid)
  21. {
  22. udv_t *udv = &udv_0;
  23. udv->valid = valid;
  24. }
  25. void usb_vendor_receive_callback(uint8_t *buf, uint32_t size)
  26. {
  27. #if (AB_FOT_CHANNEL & AB_FOT_CHANNEL_USB)
  28. usb_vendor_pdu_t *pdu = (usb_vendor_pdu_t *)buf;
  29. if (pdu->report_id == USB_VENDOR_REPORT_ID_APP) {
  30. fota_recv_packet_handle(pdu->payload, pdu->length, FOTA_CHL_USB);
  31. }
  32. #endif
  33. }
  34. AT(.com_text.usb.vendor.kick)
  35. void usb_vendor_send_prepare(uint8_t *buf, uint32_t *size)
  36. {
  37. GLOBAL_INT_DISABLE();
  38. usb_vendor_send_tag_t *data = (usb_vendor_send_tag_t *)list_pop_front(&usb_vendor_send_queue);
  39. if (data) {
  40. memcpy(buf, &data->pdu, data->length);
  41. *size = data->length;
  42. list_push_back(&usb_vendor_free_queue, (list_hdr_t *)data);
  43. } else {
  44. *size = 0;
  45. }
  46. GLOBAL_INT_RESTORE();
  47. }
  48. AT(.usbdev.com)
  49. void udv_rx_process(void)
  50. {
  51. u16 size;
  52. udv_t *udv = &udv_0;
  53. size = usb_ep_get_rx_len(udv->int_out);
  54. usb_vendor_receive_callback(udv->int_out->buf, size);
  55. usb_ep_clear_rx_fifo(udv->int_out);
  56. }
  57. AT(.usbdev.com)
  58. void udv_tx_process(void)
  59. {
  60. usb_vendor_send_kick();
  61. }
  62. void usb_vendor_ep_reset(void)
  63. {
  64. udv_t *udv = &udv_0;
  65. /* Any usb class can't always use ep0, so it't un-init when index is zere */
  66. if (udv->int_in->index) {
  67. usb_ep_reset(udv->int_in);
  68. }
  69. if (udv->int_out->index) {
  70. usb_ep_reset(udv->int_out);
  71. }
  72. }
  73. AT(.com_text.usb.vendor.kick)
  74. void usb_vendor_send_kick(void)
  75. {
  76. udv_t *udv = &udv_0;
  77. u32 size = 0;
  78. if (!usb_vendor_is_valid()) {
  79. return;
  80. }
  81. if (usb_ep_transfer(udv->int_in)) {
  82. usb_vendor_send_prepare(udv->int_in->buf, &size);
  83. if (size) {
  84. usb_ep_start_transfer(udv->int_in, size);
  85. }
  86. }
  87. }
  88. #if (AB_FOT_CHANNEL & AB_FOT_CHANNEL_USB)
  89. int usb_vendor_app_mtu_get(uint32_t *mtu)
  90. {
  91. if (!mtu) {
  92. return -1;
  93. }
  94. /* usb_vendor_pdu_t::payload */
  95. *mtu = usb_vendor_fmt_size_get(USB_VENDOR_REPORT_ID_APP) - 2;
  96. /* No error */
  97. return 0;
  98. }
  99. AT(.com_text.usb.vendor.xfer)
  100. int usb_vendor_app_send(uint8_t *buf, uint16_t size)
  101. {
  102. GLOBAL_INT_DISABLE();
  103. usb_vendor_send_tag_t *free = (usb_vendor_send_tag_t *)list_pop_front(&usb_vendor_free_queue);
  104. int status = -1;
  105. /* ASSERT(size <= sizeof(usb_vendor_pdu_t::payload)) */
  106. if (free) {
  107. free->length = usb_vendor_fmt_size_get(USB_VENDOR_REPORT_ID_APP);
  108. free->pdu.report_id = USB_VENDOR_REPORT_ID_APP;
  109. free->pdu.length = size;
  110. memcpy(free->pdu.payload, buf, size);
  111. memset(free->pdu.payload + size, 0x00, free->length - size - 1);
  112. list_push_back(&usb_vendor_send_queue, (list_hdr_t *)free);
  113. status = 0; /* No error */
  114. thread_driver_msg_post(THREAD_DRIVER_MSG_VENDOR_IN);
  115. }
  116. GLOBAL_INT_RESTORE();
  117. return status;
  118. }
  119. #endif // (AB_FOT_CHANNEL & AB_FOT_CHANNEL_USB)
  120. void udv_init(void)
  121. {
  122. epcb_t *epcb;
  123. udv_t *udv = &udv_0;
  124. udv_0.int_in = &ep_vendor_tx;
  125. udv_0.int_out = &ep_vendor_rx;
  126. memset(udv->int_in, 0x00, sizeof(epcb_t));
  127. memset(udv->int_out, 0x00, sizeof(epcb_t));
  128. usb_ep_callback_register(udv_tx_process, USB_VENDOR_EP_IN_INDEX, EP_DIR_IN);
  129. usb_ep_callback_register(udv_rx_process, USB_VENDOR_EP_OUT_INDEX, EP_DIR_OUT);
  130. memset(ep_vendor_buf_in, 0, sizeof(ep_vendor_buf_in));
  131. epcb = udv->int_in;
  132. epcb->dir = EP_DIR_IN;
  133. epcb->index = USB_VENDOR_EP_IN_INDEX;
  134. epcb->type = EP_TYPE_INTR;
  135. epcb->epsize = VENDOR_EP_IN_MAX_SIZE;
  136. epcb->buf = ep_vendor_buf_in;
  137. usb_ep_init(epcb);
  138. memset(ep_vendor_buf_out, 0, sizeof(ep_vendor_buf_out));
  139. epcb = udv->int_out;
  140. epcb->dir = EP_DIR_OUT;
  141. epcb->index = USB_VENDOR_EP_OUT_INDEX;
  142. epcb->type = EP_TYPE_INTR;
  143. epcb->epsize = VENDOR_EP_OUT_MAX_SIZE;
  144. epcb->buf = ep_vendor_buf_out;
  145. usb_ep_init(epcb);
  146. ude_vendor_setvalid(false);
  147. }
  148. void usb_vendor_init(void)
  149. {
  150. usb_vendor_send_queue.first = NULL;
  151. usb_vendor_send_queue.last = NULL;
  152. list_pool_init(
  153. &usb_vendor_free_queue,
  154. &usb_vendor_send_pool[0],
  155. sizeof(usb_vendor_send_pool[0]),
  156. sizeof(usb_vendor_send_pool) / sizeof(usb_vendor_send_pool[0])
  157. );
  158. #if (AB_FOT_CHANNEL & AB_FOT_CHANNEL_USB)
  159. ab_fota_cb_t param;
  160. param.fota_mtu_check_handle = usb_vendor_app_mtu_get;
  161. param.fota_send_packet_handle = usb_vendor_app_send;
  162. fota_init(&param, FOTA_CHL_USB);
  163. #endif
  164. }
  165. void usb_vendor_deinit(void)
  166. {
  167. ude_vendor_setvalid(false);
  168. #if (AB_FOT_CHANNEL & AB_FOT_CHANNEL_USB)
  169. fota_disconnected_handle(FOTA_CHL_USB);
  170. #endif
  171. }
  172. void usb_vendor_process(void)
  173. {
  174. /* Add application layer initialize if need */
  175. }
  176. #endif // USB_VENDOR_EN