cdc_acm_multi_template.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #include "usbd_core.h"
  2. #include "usbd_cdc.h"
  3. /*!< endpoint address */
  4. #define CDC_IN_EP 0x81
  5. #define CDC_OUT_EP 0x01
  6. #define CDC_INT_EP 0x85
  7. #define CDC_IN_EP2 0x82
  8. #define CDC_OUT_EP2 0x02
  9. #define CDC_INT_EP2 0x86
  10. #define CDC_IN_EP3 0x83
  11. #define CDC_OUT_EP3 0x03
  12. #define CDC_INT_EP3 0x87
  13. #define CDC_IN_EP4 0x84
  14. #define CDC_OUT_EP4 0x04
  15. #define CDC_INT_EP4 0x88
  16. #define USBD_VID 0xFFFF
  17. #define USBD_PID 0xFFFF
  18. #define USBD_MAX_POWER 100
  19. #define USBD_LANGID_STRING 1033
  20. /*!< config descriptor size */
  21. #define USB_CONFIG_SIZE (9 + CDC_ACM_DESCRIPTOR_LEN * 4)
  22. /*!< global descriptor */
  23. static const uint8_t cdc_descriptor[] = {
  24. USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01),
  25. USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x08, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER),
  26. CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, 0x02),
  27. CDC_ACM_DESCRIPTOR_INIT(0x02, CDC_INT_EP2, CDC_OUT_EP2, CDC_IN_EP2, 0x02),
  28. CDC_ACM_DESCRIPTOR_INIT(0x04, CDC_INT_EP3, CDC_OUT_EP3, CDC_IN_EP3, 0x02),
  29. CDC_ACM_DESCRIPTOR_INIT(0x06, CDC_INT_EP4, CDC_OUT_EP4, CDC_IN_EP4, 0x02),
  30. ///////////////////////////////////////
  31. /// string0 descriptor
  32. ///////////////////////////////////////
  33. USB_LANGID_INIT(USBD_LANGID_STRING),
  34. ///////////////////////////////////////
  35. /// string1 descriptor
  36. ///////////////////////////////////////
  37. 0x14, /* bLength */
  38. USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
  39. 'C', 0x00, /* wcChar0 */
  40. 'h', 0x00, /* wcChar1 */
  41. 'e', 0x00, /* wcChar2 */
  42. 'r', 0x00, /* wcChar3 */
  43. 'r', 0x00, /* wcChar4 */
  44. 'y', 0x00, /* wcChar5 */
  45. 'U', 0x00, /* wcChar6 */
  46. 'S', 0x00, /* wcChar7 */
  47. 'B', 0x00, /* wcChar8 */
  48. ///////////////////////////////////////
  49. /// string2 descriptor
  50. ///////////////////////////////////////
  51. 0x26, /* bLength */
  52. USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
  53. 'C', 0x00, /* wcChar0 */
  54. 'h', 0x00, /* wcChar1 */
  55. 'e', 0x00, /* wcChar2 */
  56. 'r', 0x00, /* wcChar3 */
  57. 'r', 0x00, /* wcChar4 */
  58. 'y', 0x00, /* wcChar5 */
  59. 'U', 0x00, /* wcChar6 */
  60. 'S', 0x00, /* wcChar7 */
  61. 'B', 0x00, /* wcChar8 */
  62. ' ', 0x00, /* wcChar9 */
  63. 'C', 0x00, /* wcChar10 */
  64. 'D', 0x00, /* wcChar11 */
  65. 'C', 0x00, /* wcChar12 */
  66. ' ', 0x00, /* wcChar13 */
  67. 'D', 0x00, /* wcChar14 */
  68. 'E', 0x00, /* wcChar15 */
  69. 'M', 0x00, /* wcChar16 */
  70. 'O', 0x00, /* wcChar17 */
  71. ///////////////////////////////////////
  72. /// string3 descriptor
  73. ///////////////////////////////////////
  74. 0x16, /* bLength */
  75. USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
  76. '2', 0x00, /* wcChar0 */
  77. '0', 0x00, /* wcChar1 */
  78. '2', 0x00, /* wcChar2 */
  79. '2', 0x00, /* wcChar3 */
  80. '1', 0x00, /* wcChar4 */
  81. '2', 0x00, /* wcChar5 */
  82. '3', 0x00, /* wcChar6 */
  83. '4', 0x00, /* wcChar7 */
  84. '5', 0x00, /* wcChar8 */
  85. '6', 0x00, /* wcChar9 */
  86. #ifdef CONFIG_USB_HS
  87. ///////////////////////////////////////
  88. /// device qualifier descriptor
  89. ///////////////////////////////////////
  90. 0x0a,
  91. USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER,
  92. 0x00,
  93. 0x02,
  94. 0x02,
  95. 0x02,
  96. 0x01,
  97. 0x40,
  98. 0x01,
  99. 0x00,
  100. #endif
  101. 0x00
  102. };
  103. /*!< class */
  104. usbd_class_t cdc_class;
  105. /*!< interface one */
  106. usbd_interface_t cdc_cmd_intf;
  107. /*!< interface two */
  108. usbd_interface_t cdc_data_intf;
  109. /* function ------------------------------------------------------------------*/
  110. void usbd_cdc_acm_bulk_out(uint8_t ep)
  111. {
  112. uint8_t data[64];
  113. uint32_t read_byte;
  114. usbd_ep_read(ep, data, 64, &read_byte);
  115. for (uint32_t i = 0; i < read_byte; i++) {
  116. USB_LOG_RAW("%02x ", data[i]);
  117. }
  118. USB_LOG_RAW("\r\n");
  119. USB_LOG_RAW("read len:%d\r\n", read_byte);
  120. usbd_ep_read(ep, NULL, 0, NULL);
  121. }
  122. void usbd_cdc_acm_bulk_in(uint8_t ep)
  123. {
  124. USB_LOG_RAW("in\r\n");
  125. }
  126. /*!< endpoint call back */
  127. usbd_class_t cdc_class1;
  128. usbd_interface_t cdc_cmd_intf1;
  129. usbd_interface_t cdc_data_intf1;
  130. usbd_endpoint_t cdc_out_ep1 = {
  131. .ep_addr = CDC_OUT_EP,
  132. .ep_cb = usbd_cdc_acm_bulk_out
  133. };
  134. usbd_endpoint_t cdc_in_ep1 = {
  135. .ep_addr = CDC_IN_EP,
  136. .ep_cb = usbd_cdc_acm_bulk_in
  137. };
  138. usbd_class_t cdc_class2;
  139. usbd_interface_t cdc_cmd_intf2;
  140. usbd_interface_t cdc_data_intf2;
  141. usbd_endpoint_t cdc_out_ep2 = {
  142. .ep_addr = CDC_OUT_EP2,
  143. .ep_cb = usbd_cdc_acm_bulk_out
  144. };
  145. usbd_endpoint_t cdc_in_ep2 = {
  146. .ep_addr = CDC_IN_EP2,
  147. .ep_cb = usbd_cdc_acm_bulk_in
  148. };
  149. usbd_class_t cdc_class3;
  150. usbd_interface_t cdc_cmd_intf3;
  151. usbd_interface_t cdc_data_intf3;
  152. usbd_endpoint_t cdc_out_ep3 = {
  153. .ep_addr = CDC_OUT_EP3,
  154. .ep_cb = usbd_cdc_acm_bulk_out
  155. };
  156. usbd_endpoint_t cdc_in_ep3 = {
  157. .ep_addr = CDC_IN_EP3,
  158. .ep_cb = usbd_cdc_acm_bulk_in
  159. };
  160. usbd_class_t cdc_class4;
  161. usbd_interface_t cdc_cmd_intf4;
  162. usbd_interface_t cdc_data_intf4;
  163. usbd_endpoint_t cdc_out_ep4 = {
  164. .ep_addr = CDC_OUT_EP4,
  165. .ep_cb = usbd_cdc_acm_bulk_out
  166. };
  167. usbd_endpoint_t cdc_in_ep4 = {
  168. .ep_addr = CDC_IN_EP4,
  169. .ep_cb = usbd_cdc_acm_bulk_in
  170. };
  171. /* function ------------------------------------------------------------------*/
  172. void cdc_acm_multi_init(void)
  173. {
  174. usbd_desc_register(cdc_descriptor);
  175. usbd_cdc_add_acm_interface(&cdc_class1, &cdc_cmd_intf1);
  176. usbd_cdc_add_acm_interface(&cdc_class1, &cdc_data_intf1);
  177. usbd_interface_add_endpoint(&cdc_data_intf1, &cdc_out_ep1);
  178. usbd_interface_add_endpoint(&cdc_data_intf1, &cdc_in_ep1);
  179. usbd_cdc_add_acm_interface(&cdc_class2, &cdc_cmd_intf2);
  180. usbd_cdc_add_acm_interface(&cdc_class2, &cdc_data_intf2);
  181. usbd_interface_add_endpoint(&cdc_data_intf2, &cdc_out_ep2);
  182. usbd_interface_add_endpoint(&cdc_data_intf2, &cdc_in_ep2);
  183. usbd_cdc_add_acm_interface(&cdc_class3, &cdc_cmd_intf3);
  184. usbd_cdc_add_acm_interface(&cdc_class3, &cdc_data_intf3);
  185. usbd_interface_add_endpoint(&cdc_data_intf3, &cdc_out_ep3);
  186. usbd_interface_add_endpoint(&cdc_data_intf3, &cdc_in_ep3);
  187. usbd_cdc_add_acm_interface(&cdc_class4, &cdc_cmd_intf4);
  188. usbd_cdc_add_acm_interface(&cdc_class4, &cdc_data_intf4);
  189. usbd_interface_add_endpoint(&cdc_data_intf4, &cdc_out_ep4);
  190. usbd_interface_add_endpoint(&cdc_data_intf4, &cdc_in_ep4);
  191. usbd_initialize();
  192. }