1
0

usbdevice.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /*
  2. * File : hid.c
  3. * COPYRIGHT (C) 2006 - 2021, RT-Thread Development Team
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Change Logs:
  8. * Date Author Notes
  9. * 2012-10-02 Yi Qiu first version
  10. */
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. #include <rtservice.h>
  14. #ifdef RT_USING_USB_DEVICE
  15. #define USB_DEVICE_CONTROLLER_NAME "usbd"
  16. #ifdef RT_USB_DEVICE_COMPOSITE
  17. const static char* ustring[] =
  18. {
  19. "Language",
  20. "RT-Thread Team.",
  21. "RTT Composite Device",
  22. "320219198301",
  23. "Configuration",
  24. "Interface",
  25. USB_STRING_OS
  26. };
  27. static struct udevice_descriptor compsit_desc =
  28. {
  29. USB_DESC_LENGTH_DEVICE, //bLength;
  30. USB_DESC_TYPE_DEVICE, //type;
  31. USB_BCD_VERSION, //bcdUSB;
  32. USB_CLASS_MISC, //bDeviceClass;
  33. 0x02, //bDeviceSubClass;
  34. 0x01, //bDeviceProtocol;
  35. 0x40, //bMaxPacketSize0;
  36. _VENDOR_ID, //idVendor;
  37. _PRODUCT_ID, //idProduct;
  38. USB_BCD_DEVICE, //bcdDevice;
  39. USB_STRING_MANU_INDEX, //iManufacturer;
  40. USB_STRING_PRODUCT_INDEX, //iProduct;
  41. USB_STRING_SERIAL_INDEX, //iSerialNumber;
  42. USB_DYNAMIC, //bNumConfigurations;
  43. };
  44. //FS and HS needed
  45. static struct usb_qualifier_descriptor dev_qualifier =
  46. {
  47. sizeof(dev_qualifier), //bLength
  48. USB_DESC_TYPE_DEVICEQUALIFIER, //bDescriptorType
  49. 0x0200, //bcdUSB
  50. USB_CLASS_MISC, //bDeviceClass
  51. 0x02, //bDeviceSubClass
  52. 0x01, //bDeviceProtocol
  53. 64, //bMaxPacketSize0
  54. 0x01, //bNumConfigurations
  55. 0,
  56. };
  57. #endif
  58. struct usb_os_comp_id_descriptor usb_comp_id_desc =
  59. {
  60. //head section
  61. {
  62. USB_DYNAMIC,
  63. 0x0100,
  64. 0x04,
  65. USB_DYNAMIC,
  66. {0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  67. },
  68. };
  69. static rt_list_t class_list;
  70. int rt_usbd_class_list_init(void)
  71. {
  72. rt_list_init(&class_list);
  73. return 0;
  74. }
  75. INIT_BOARD_EXPORT(rt_usbd_class_list_init);
  76. rt_err_t rt_usbd_class_register(udclass_t udclass)
  77. {
  78. #ifndef RT_USB_DEVICE_COMPOSITE
  79. if(!rt_list_isempty(&class_list))
  80. {
  81. rt_kprintf("[D/USBD] If you want to use usb composite device please define RT_USB_DEVICE_COMPOSITE\n");
  82. return RT_ERROR;
  83. }
  84. #endif
  85. rt_list_insert_before(&class_list,&udclass->list);
  86. return RT_EOK;
  87. }
  88. rt_err_t rt_usb_device_init(void)
  89. {
  90. rt_device_t udc;
  91. udevice_t udevice;
  92. uconfig_t cfg;
  93. ufunction_t func;
  94. rt_list_t *i;
  95. udclass_t udclass;
  96. if(rt_list_isempty(&class_list))
  97. {
  98. rt_kprintf("[D/USBD] No class register on usb device\n");
  99. return RT_ERROR;
  100. }
  101. /* create and startup usb device thread */
  102. rt_usbd_core_init();
  103. /* create a device object */
  104. udevice = rt_usbd_device_new();
  105. udc = rt_device_find(USB_DEVICE_CONTROLLER_NAME);
  106. if(udc == RT_NULL)
  107. {
  108. rt_kprintf("can't find usb device controller %s\n", USB_DEVICE_CONTROLLER_NAME);
  109. return -RT_ERROR;
  110. }
  111. /* set usb controller driver to the device */
  112. rt_usbd_device_set_controller(udevice, (udcd_t)udc);
  113. /* create a configuration object */
  114. cfg = rt_usbd_config_new();
  115. rt_usbd_device_set_os_comp_id_desc(udevice, &usb_comp_id_desc);
  116. for(i = class_list.next; i!= &class_list; i = i->next)
  117. {
  118. /* get a class creater */
  119. udclass = rt_list_entry(i, struct udclass, list);
  120. /* create a function object */
  121. func = udclass->rt_usbd_function_create(udevice);
  122. /* add the function to the configuration */
  123. rt_usbd_config_add_function(cfg, func);
  124. }
  125. /* set device descriptor to the device */
  126. #ifdef RT_USB_DEVICE_COMPOSITE
  127. rt_usbd_device_set_descriptor(udevice, &compsit_desc);
  128. rt_usbd_device_set_string(udevice, ustring);
  129. if(udevice->dcd->device_is_hs)
  130. {
  131. rt_usbd_device_set_qualifier(udevice, &dev_qualifier);
  132. }
  133. #else
  134. rt_usbd_device_set_descriptor(udevice, func->dev_desc);
  135. #endif
  136. /* add the configuration to the device */
  137. rt_usbd_device_add_config(udevice, cfg);
  138. /* initialize usb device controller */
  139. rt_device_init(udc);
  140. /* set default configuration to 1 */
  141. rt_usbd_set_config(udevice, 1);
  142. return RT_EOK;
  143. }
  144. #endif