summaryrefslogtreecommitdiff
path: root/src/device
diff options
context:
space:
mode:
authorhathach <[email protected]>2018-08-01 00:50:04 +0700
committerhathach <[email protected]>2018-08-01 00:50:04 +0700
commit6d96b12e27ae60ca500365ee2137105145ada9dd (patch)
tree9c4435313a565499ba35184525589b4b0b9b4218 /src/device
parent9444d45af6dfff6a34ac290cf5a221abd0c2529b (diff)
improve auto descriptor
Diffstat (limited to 'src/device')
-rw-r--r--src/device/usbd.c43
-rw-r--r--src/device/usbd.h4
-rw-r--r--src/device/usbd_auto_desc.c37
-rw-r--r--src/device/usbd_pvt.h3
4 files changed, 48 insertions, 39 deletions
diff --git a/src/device/usbd.c b/src/device/usbd.c
index 5f83728ef..219562fa6 100644
--- a/src/device/usbd.c
+++ b/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];
diff --git a/src/device/usbd.h b/src/device/usbd.h
index 8ef1209e1..1e59c0a7e 100644
--- a/src/device/usbd.h
+++ b/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;
diff --git a/src/device/usbd_auto_desc.c b/src/device/usbd_auto_desc.c
index eaa866af0..a42af1ef5 100644
--- a/src/device/usbd_auto_desc.c
+++ b/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
diff --git a/src/device/usbd_pvt.h b/src/device/usbd_pvt.h
index 205057db6..707e8036f 100644
--- a/src/device/usbd_pvt.h
+++ b/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
//--------------------------------------------------------------------+