Pārlūkot izejas kodu

improve auto descriptor

hathach 7 gadi atpakaļ
vecāks
revīzija
6d96b12e27

+ 3 - 3
src/class/hid/hid_device.c

@@ -346,7 +346,7 @@ tusb_error_t hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, u
     if (desc_itf->bInterfaceProtocol == HID_PROTOCOL_KEYBOARD)
     {
       p_hid = &_hidd_itf[ITF_IDX_BOOT_KBD];
-      p_hid->desc_report   = tud_desc_set.hid_report.boot_keyboard;
+      p_hid->desc_report   = usbd_desc_set->hid_report.boot_keyboard;
       p_hid->get_report_cb = tud_hid_keyboard_get_report_cb;
       p_hid->set_report_cb = tud_hid_keyboard_set_report_cb;
 
@@ -362,7 +362,7 @@ tusb_error_t hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, u
     if (desc_itf->bInterfaceProtocol == HID_PROTOCOL_MOUSE)
     {
       p_hid = &_hidd_itf[ITF_IDX_BOOT_MSE];
-      p_hid->desc_report   = tud_desc_set.hid_report.boot_mouse;
+      p_hid->desc_report   = usbd_desc_set->hid_report.boot_mouse;
       p_hid->get_report_cb = tud_hid_mouse_get_report_cb;
       p_hid->set_report_cb = tud_hid_mouse_set_report_cb;
 
@@ -383,7 +383,7 @@ tusb_error_t hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, u
     // TODO parse report ID for keyboard, mouse
     p_hid = &_hidd_itf[ITF_IDX_GENERIC];
 
-    p_hid->desc_report   = tud_desc_set.hid_report.generic;
+    p_hid->desc_report   = usbd_desc_set->hid_report.generic;
     p_hid->get_report_cb = tud_hid_generic_get_report_cb;
     p_hid->set_report_cb = tud_hid_generic_set_report_cb;
 

+ 13 - 30
src/device/usbd.c

@@ -75,6 +75,15 @@ typedef struct {
 CFG_TUSB_ATTR_USBRAM CFG_TUSB_MEM_ALIGN uint8_t _usbd_ctrl_buf[CFG_TUD_CTRL_BUFSIZE];
 static usbd_device_t _usbd_dev;
 
+
+// Auto descriptor is enabled, descriptor set point to auto generated one
+#if CFG_TUD_DESC_AUTO
+extern tud_desc_set_t const _usbd_auto_desc_set;
+tud_desc_set_t const* usbd_desc_set = &_usbd_auto_desc_set;
+#else
+tud_desc_set_t const* usbd_desc_set = &tud_desc_set;
+#endif
+
 //--------------------------------------------------------------------+
 // Class Driver
 //--------------------------------------------------------------------+
@@ -310,33 +319,6 @@ static void usbd_reset(uint8_t rhport)
   {
     if ( usbd_class_drivers[i].reset ) usbd_class_drivers[i].reset( rhport );
   }
-
-#if CFG_TUD_DESC_AUTO
-  extern tusb_desc_device_t const _desc_auto_device;
-  extern uint8_t const * const    _desc_auto_config;
-
-  tud_desc_set.device = (uint8_t const*) &_desc_auto_device;
-  tud_desc_set.config = _desc_auto_config;
-
-#if CFG_TUD_HID
-  #if CFG_TUD_HID_KEYBOARD && CFG_TUD_HID_KEYBOARD_BOOT
-  extern uint8_t const _desc_auto_hid_boot_kbd_report[];
-  tud_desc_set.hid_report.boot_keyboard = _desc_auto_hid_boot_kbd_report;
-  #endif
-
-  #if CFG_TUD_HID_MOUSE && CFG_TUD_HID_MOUSE_BOOT
-  extern uint8_t const _desc_auto_hid_boot_mse_report[];
-  tud_desc_set.hid_report.boot_mouse = _desc_auto_hid_boot_mse_report;
-  #endif
-
-  #if TUD_OPT_HID_GENERIC
-  extern uint8_t const _desc_auto_hid_generic_report[];
-  tud_desc_set.hid_report.generic = _desc_auto_hid_generic_report;
-  #endif
-#endif // CFG_TUD_HID
-
-#endif // CFG_TUD_DESC_AUTO
-
 }
 
 //--------------------------------------------------------------------+
@@ -452,7 +434,7 @@ static tusb_error_t proc_set_config_req(uint8_t rhport, uint8_t config_number)
   _usbd_dev.config_num = config_number;
 
   //------------- parse configuration & open drivers -------------//
-  uint8_t const * desc_cfg = tud_desc_set.config;
+  uint8_t const * desc_cfg = (uint8_t const *) usbd_desc_set->config;
   TU_ASSERT(desc_cfg != NULL, TUSB_ERROR_DESCRIPTOR_CORRUPTED);
   uint8_t const * p_desc = desc_cfg + sizeof(tusb_desc_configuration_t);
   uint16_t const cfg_len = ((tusb_desc_configuration_t*)desc_cfg)->wTotalLength;
@@ -511,16 +493,17 @@ static uint16_t get_descriptor(uint8_t rhport, tusb_control_request_t const * co
   switch(desc_type)
   {
     case TUSB_DESC_DEVICE:
-      desc_data = tud_desc_set.device;
+      desc_data = (uint8_t const *) usbd_desc_set->device;
       len       = sizeof(tusb_desc_device_t);
     break;
 
     case TUSB_DESC_CONFIGURATION:
-      desc_data = tud_desc_set.config;
+      desc_data = (uint8_t const *) usbd_desc_set->config;
       len       = ((tusb_desc_configuration_t const*) desc_data)->wTotalLength;
     break;
 
     case TUSB_DESC_STRING:
+      // String Descriptor always uses the desc set from user
       if ( desc_index < tud_desc_set.string_count )
       {
         desc_data = tud_desc_set.string_arr[desc_index];

+ 2 - 2
src/device/usbd.h

@@ -59,8 +59,8 @@
 
 /// \brief Descriptor pointer collector to all the needed.
 typedef struct {
-  uint8_t const * device;            ///< pointer to device descriptor \ref tusb_desc_device_t
-  uint8_t const * config;         ///< pointer to the whole configuration descriptor, starting by \ref tusb_desc_configuration_t
+  void const * device;            ///< pointer to device descriptor \ref tusb_desc_device_t
+  void const * config;            ///< pointer to the whole configuration descriptor, starting by \ref tusb_desc_configuration_t
 
   uint8_t const** string_arr;     ///< a array of pointers to string descriptors
   uint16_t        string_count;

+ 30 - 7
src/device/usbd_auto_desc.c

@@ -49,8 +49,8 @@
 // Auto Description Default Configure & Validation
 //--------------------------------------------------------------------+
 
-// IF HID Generic is required, it is multiple Report : Keyboard + Mouse + Gamepad + Joystick
-#define TUD_OPT_HID_GENERIC    (CFG_TUD_HID && ((CFG_TUD_HID_KEYBOARD && !CFG_TUD_HID_KEYBOARD_BOOT) || \
+// If HID Generic interface is generated
+#define AUTO_DESC_HID_GENERIC    (CFG_TUD_HID && ((CFG_TUD_HID_KEYBOARD && !CFG_TUD_HID_KEYBOARD_BOOT) || \
                                                 (CFG_TUD_HID_MOUSE && !CFG_TUD_HID_MOUSE_BOOT)) )
 /*------------- VID/PID -------------*/
 #ifndef CFG_TUD_DESC_VID
@@ -67,7 +67,7 @@
  */
 #define _PID_MAP(itf, n)      ( (CFG_TUD_##itf) << (n) )
 #define CFG_TUD_DESC_PID      (0x4000 | _PID_MAP(CDC, 0) | _PID_MAP(MSC, 1) | _PID_MAP(HID, 2) | \
-                               _PID_MAP(HID_KEYBOARD, 2) | _PID_MAP(HID_MOUSE, 3) | (TUD_OPT_HID_GENERIC << 4) )
+                               _PID_MAP(HID_KEYBOARD, 2) | _PID_MAP(HID_MOUSE, 3) | (AUTO_DESC_HID_GENERIC << 4) )
 #endif
 
 //--------------------------------------------------------------------+
@@ -85,7 +85,7 @@
 #define ITF_NUM_HID_BOOT_MSE    (ITF_NUM_HID_BOOT_KBD + CFG_TUD_HID_KEYBOARD_BOOT)
 #define ITF_NUM_HID_GEN         (ITF_NUM_HID_BOOT_MSE + CFG_TUD_HID_MOUSE_BOOT)
 
-#define ITF_TOTAL               (ITF_NUM_HID_GEN + TUD_OPT_HID_GENERIC)
+#define ITF_TOTAL               (ITF_NUM_HID_GEN + AUTO_DESC_HID_GENERIC)
 
 /*------------- Endpoint Numbering & Size -------------*/
 #define _EP_IN(x)               (0x80 | (x))
@@ -132,7 +132,7 @@ uint8_t const _desc_auto_hid_boot_mse_report[] = { HID_REPORT_DESC_MOUSE() };
 
 
 /*------------- Generic (composite) Descriptor -------------*/
-#if TUD_OPT_HID_GENERIC
+#if AUTO_DESC_HID_GENERIC
 
 // Report ID: 0 if there is only 1 report
 // starting from 1 if there is multiple reports
@@ -255,7 +255,7 @@ typedef struct ATTR_PACKED
   } hid_mse_boot;
 #endif
 
-#if TUD_OPT_HID_GENERIC
+#if AUTO_DESC_HID_GENERIC
 
   struct ATTR_PACKED
   {
@@ -521,7 +521,7 @@ desc_auto_cfg_t const _desc_auto_config_struct =
 
 #endif // boot mouse
 
-#if TUD_OPT_HID_GENERIC
+#if AUTO_DESC_HID_GENERIC
 
     //------------- HID Generic Multiple report -------------//
     .hid_generic =
@@ -566,6 +566,29 @@ desc_auto_cfg_t const _desc_auto_config_struct =
 
 uint8_t const * const _desc_auto_config = (uint8_t const*) &_desc_auto_config_struct;
 
+tud_desc_set_t const _usbd_auto_desc_set =
+{
+    .device = &_desc_auto_device,
+    .config = &_desc_auto_config_struct,
+
+    .hid_report =
+    {
+#if AUTO_DESC_HID_GENERIC
+        .generic = _desc_auto_hid_generic_report,
+#else
+        .generic = NULL,
+#endif
+
+#if CFG_TUD_HID_KEYBOARD && CFG_TUD_HID_KEYBOARD_BOOT
+        .boot_keyboard = _desc_auto_hid_boot_kbd_report,
+#endif
+
+#if CFG_TUD_HID_MOUSE && CFG_TUD_HID_MOUSE_BOOT
+        .boot_mouse = _desc_auto_hid_boot_mse_report
+#endif
+    }
+};
+
 #endif
 
 

+ 3 - 0
src/device/usbd_pvt.h

@@ -48,6 +48,9 @@
 extern osal_semaphore_t _usbd_ctrl_sem;
 extern uint8_t _usbd_ctrl_buf[CFG_TUD_CTRL_BUFSIZE];
 
+// Either point to tud_desc_set or usbd_auto_desc_set depending on CFG_TUD_DESC_AUTO
+extern tud_desc_set_t const* usbd_desc_set;
+
 //--------------------------------------------------------------------+
 // INTERNAL API for stack management
 //--------------------------------------------------------------------+

+ 3 - 0
src/portable/nordic/nrf5x/dcd_nrf5x.c

@@ -46,6 +46,9 @@
 #include "nrf_clock.h"
 
 #include "device/dcd.h"
+
+// TODO remove later
+#include "device/usbd.h"
 #include "device/usbd_pvt.h" // to use defer function helper
 
 /*------------------------------------------------------------------*/