From 6d96b12e27ae60ca500365ee2137105145ada9dd Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 1 Aug 2018 00:50:04 +0700 Subject: [PATCH] improve auto descriptor --- src/class/hid/hid_device.c | 6 ++-- src/device/usbd.c | 43 ++++++++------------------- src/device/usbd.h | 4 +-- src/device/usbd_auto_desc.c | 37 ++++++++++++++++++----- src/device/usbd_pvt.h | 3 ++ src/portable/nordic/nrf5x/dcd_nrf5x.c | 3 ++ 6 files changed, 54 insertions(+), 42 deletions(-) diff --git a/src/class/hid/hid_device.c b/src/class/hid/hid_device.c index 2616155b8..0527c14bf 100644 --- a/src/class/hid/hid_device.c +++ b/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; 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 //--------------------------------------------------------------------+ diff --git a/src/portable/nordic/nrf5x/dcd_nrf5x.c b/src/portable/nordic/nrf5x/dcd_nrf5x.c index 339b8df1f..b9bd6ef1a 100644 --- a/src/portable/nordic/nrf5x/dcd_nrf5x.c +++ b/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 /*------------------------------------------------------------------*/