From 0377fc8d926f791ea42b95075768ad65fb065731 Mon Sep 17 00:00:00 2001 From: Tomas Rezucha Date: Thu, 10 Feb 2022 14:49:11 +0100 Subject: [PATCH] tinyusb: Allow dynamic configuration descriptor and remove ringbuf.h include from public headers and unused HID descriptor code --- components/tinyusb/Kconfig | 1 - .../tinyusb/additions/include/tinyusb.h | 10 ++- .../tinyusb/additions/include/tusb_cdc_acm.h | 1 - .../tinyusb/additions/include_private/cdc.h | 1 - .../include_private/descriptors_control.h | 41 +--------- .../include_private/usb_descriptors.h | 3 +- .../additions/src/descriptors_control.c | 66 +++------------- components/tinyusb/additions/src/tinyusb.c | 9 ++- .../tinyusb/additions/src/tusb_cdc_acm.c | 1 + .../tinyusb/additions/src/usb_descriptors.c | 76 ++++++++++++++++++- 10 files changed, 103 insertions(+), 106 deletions(-) diff --git a/components/tinyusb/Kconfig b/components/tinyusb/Kconfig index 9e36f21b35..680edd39b8 100644 --- a/components/tinyusb/Kconfig +++ b/components/tinyusb/Kconfig @@ -116,7 +116,6 @@ menu "TinyUSB Stack" menu "Massive Storage Class (MSC)" config TINYUSB_MSC_ENABLED - depends on TINYUSB_CDC_COUNT < 2 bool "Enable TinyUSB MSC feature" default n help diff --git a/components/tinyusb/additions/include/tinyusb.h b/components/tinyusb/additions/include/tinyusb.h index f4cdecfaec..8cf1608142 100644 --- a/components/tinyusb/additions/include/tinyusb.h +++ b/components/tinyusb/additions/include/tinyusb.h @@ -64,9 +64,13 @@ extern "C" { * @brief Configuration structure of the tinyUSB core */ typedef struct { - tusb_desc_device_t *descriptor; /*!< Pointer to a device descriptor */ - const char **string_descriptor; /*!< Pointer to an array of string descriptors */ - bool external_phy; /*!< Should USB use an external PHY */ + union { + const tusb_desc_device_t *device_descriptor; /*!< Pointer to a device descriptor. If set to NULL, the TinyUSB device will use a default device descriptor whose values are set in Kconfig */ + const tusb_desc_device_t *descriptor __attribute__((deprecated)); /*!< Alias to `device_descriptor` for backward compatibility */ + }; + const char **string_descriptor; /*!< Pointer to an array of string descriptors */ + bool external_phy; /*!< Should USB use an external PHY */ + const uint8_t *configuration_descriptor; /*!< Pointer to a configuration descriptor. If set to NULL, TinyUSB device will use a default configuration descriptor whose values are set in Kconfig */ } tinyusb_config_t; /** diff --git a/components/tinyusb/additions/include/tusb_cdc_acm.h b/components/tinyusb/additions/include/tusb_cdc_acm.h index be3cbd07bd..da197a67f0 100644 --- a/components/tinyusb/additions/include/tusb_cdc_acm.h +++ b/components/tinyusb/additions/include/tusb_cdc_acm.h @@ -12,7 +12,6 @@ extern "C" { #include #include "freertos/FreeRTOS.h" -#include "freertos/ringbuf.h" #include "freertos/semphr.h" #include "freertos/timers.h" #include "tusb.h" diff --git a/components/tinyusb/additions/include_private/cdc.h b/components/tinyusb/additions/include_private/cdc.h index a69b446a8a..e3c85f9570 100644 --- a/components/tinyusb/additions/include_private/cdc.h +++ b/components/tinyusb/additions/include_private/cdc.h @@ -12,7 +12,6 @@ extern "C" { #include #include "freertos/FreeRTOS.h" -#include "freertos/ringbuf.h" #include "freertos/semphr.h" #include "freertos/timers.h" #include "tusb.h" diff --git a/components/tinyusb/additions/include_private/descriptors_control.h b/components/tinyusb/additions/include_private/descriptors_control.h index 63685ef081..b6516e1a75 100644 --- a/components/tinyusb/additions/include_private/descriptors_control.h +++ b/components/tinyusb/additions/include_private/descriptors_control.h @@ -6,49 +6,14 @@ #pragma once -#include -#include "usb_descriptors.h" +#include "tusb.h" +#include "tinyusb_types.h" #ifdef __cplusplus extern "C" { #endif -//------------- HID Report Descriptor -------------// -#if CFG_TUD_HID -enum { - REPORT_ID_KEYBOARD = 1, - REPORT_ID_MOUSE -}; -#endif -//------------- Configuration Descriptor -------------// -enum { -# if CFG_TUD_CDC - ITF_NUM_CDC = 0, - ITF_NUM_CDC_DATA, -# endif - -# if CFG_TUD_CDC > 1 - ITF_NUM_CDC1, - ITF_NUM_CDC1_DATA, -# endif - -# if CFG_TUD_MSC - ITF_NUM_MSC, -# endif - -# if CFG_TUD_HID - ITF_NUM_HID, -# endif - - ITF_NUM_TOTAL -}; - -enum { - TUSB_DESC_TOTAL_LEN = TUD_CONFIG_DESC_LEN + CFG_TUD_CDC * TUD_CDC_DESC_LEN + CFG_TUD_MSC * TUD_MSC_DESC_LEN + - CFG_TUD_HID * TUD_HID_DESC_LEN -}; - -void tusb_set_descriptor(tusb_desc_device_t *desc, const char **str_desc); +void tusb_set_descriptor(const tusb_desc_device_t *dev_desc, const char **str_desc, const uint8_t *cfg_desc); tusb_desc_device_t *tusb_get_active_desc(void); char **tusb_get_active_str_desc(void); void tusb_clear_descriptor(void); diff --git a/components/tinyusb/additions/include_private/usb_descriptors.h b/components/tinyusb/additions/include_private/usb_descriptors.h index 65cb9f9e9a..215010c94f 100644 --- a/components/tinyusb/additions/include_private/usb_descriptors.h +++ b/components/tinyusb/additions/include_private/usb_descriptors.h @@ -18,8 +18,9 @@ extern "C" { extern tusb_desc_device_t descriptor_tinyusb; extern tusb_desc_strarray_device_t descriptor_str_tinyusb; -extern tusb_desc_device_t descriptor_kconfig; +extern const tusb_desc_device_t descriptor_dev_kconfig; extern tusb_desc_strarray_device_t descriptor_str_kconfig; +extern const uint8_t descriptor_cfg_kconfig[]; #ifdef __cplusplus } diff --git a/components/tinyusb/additions/src/descriptors_control.c b/components/tinyusb/additions/src/descriptors_control.c index 02e4a4bf80..3857e2ebcb 100644 --- a/components/tinyusb/additions/src/descriptors_control.c +++ b/components/tinyusb/additions/src/descriptors_control.c @@ -4,49 +4,16 @@ * SPDX-License-Identifier: Apache-2.0 */ +#include #include "esp_log.h" #include "descriptors_control.h" static const char *TAG = "tusb_desc"; -static tusb_desc_device_t s_descriptor; +static tusb_desc_device_t s_device_descriptor; +static const uint8_t *s_configuration_descriptor; static char *s_str_descriptor[USB_STRING_DESCRIPTOR_ARRAY_SIZE]; #define MAX_DESC_BUF_SIZE 32 -#define EPNUM_MSC ((CFG_TUD_CDC * 2) + 1) -#define EPNUM_HID (EPNUM_MSC + 1) - -#if CFG_TUD_HID //HID Report Descriptor -uint8_t const desc_hid_report[] = { - TUD_HID_REPORT_DESC_KEYBOARD(HID_REPORT_ID(REPORT_ID_KEYBOARD), ), - TUD_HID_REPORT_DESC_MOUSE(HID_REPORT_ID(REPORT_ID_MOUSE), ) -}; -#endif - -uint8_t const desc_configuration[] = { - // interface count, string index, total length, attribute, power in mA - TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, TUSB_DESC_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100), - -# if CFG_TUD_CDC - // Interface number, string index, EP notification address and size, EP data address (out, in) and size. - TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, 0x81, 8, 0x02, 0x82, 64), -# endif - -# if CFG_TUD_CDC > 1 - // Interface number, string index, EP notification address and size, EP data address (out, in) and size. - TUD_CDC_DESCRIPTOR(ITF_NUM_CDC1, 4, 0x83, 8, 0x04, 0x84, 64), -# endif - -# if CFG_TUD_MSC - // Interface number, string index, EP Out & EP In address, EP size - TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 5, EPNUM_MSC, 0x80 | EPNUM_MSC, 64), // highspeed 512 -# endif - -# if CFG_TUD_HID - // Interface number, string index, protocol, report descriptor len, EP In address, size & polling interval - TUD_HID_DESCRIPTOR(ITF_NUM_HID, 6, HID_PROTOCOL_NONE, sizeof(desc_hid_report), 0x80 | EPNUM_HID, 16, 10) -# endif -}; - // ============================================================================= // CALLBACKS // ============================================================================= @@ -59,7 +26,7 @@ uint8_t const desc_configuration[] = { */ uint8_t const *tud_descriptor_device_cb(void) { - return (uint8_t const *)&s_descriptor; + return (uint8_t const *)&s_device_descriptor; } /** @@ -72,7 +39,7 @@ uint8_t const *tud_descriptor_device_cb(void) uint8_t const *tud_descriptor_configuration_cb(uint8_t index) { (void)index; // for multiple configurations - return desc_configuration; + return s_configuration_descriptor; } static uint16_t _desc_str[MAX_DESC_BUF_SIZE]; @@ -114,25 +81,11 @@ uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) return _desc_str; } -/** - * @brief Invoked when received GET HID REPORT DESCRIPTOR - * Application returns pointer to descriptor. Descriptor contents must exist - * long enough for transfer to complete - * - * @return uint8_t const* - */ -#if CFG_TUD_HID -uint8_t const *tud_hid_descriptor_report_cb(void) -{ - return desc_hid_report; -} -#endif - // ============================================================================= // Driver functions // ============================================================================= -void tusb_set_descriptor(tusb_desc_device_t *dev_desc, const char **str_desc) +void tusb_set_descriptor(const tusb_desc_device_t *dev_desc, const char **str_desc, const uint8_t *cfg_desc) { ESP_LOGI(TAG, "\n" "┌─────────────────────────────────┐\n" @@ -165,7 +118,8 @@ void tusb_set_descriptor(tusb_desc_device_t *dev_desc, const char **str_desc) dev_desc->idVendor, dev_desc->idProduct, dev_desc->bcdDevice, dev_desc->iManufacturer, dev_desc->iProduct, dev_desc->iSerialNumber, dev_desc->bNumConfigurations); - s_descriptor = *dev_desc; + s_device_descriptor = *dev_desc; + s_configuration_descriptor = cfg_desc; if (str_desc != NULL) { memcpy(s_str_descriptor, str_desc, @@ -175,7 +129,7 @@ void tusb_set_descriptor(tusb_desc_device_t *dev_desc, const char **str_desc) tusb_desc_device_t *tusb_get_active_desc(void) { - return &s_descriptor; + return &s_device_descriptor; } char **tusb_get_active_str_desc(void) @@ -185,6 +139,6 @@ char **tusb_get_active_str_desc(void) void tusb_clear_descriptor(void) { - memset(&s_descriptor, 0, sizeof(s_descriptor)); + memset(&s_device_descriptor, 0, sizeof(s_device_descriptor)); memset(&s_str_descriptor, 0, sizeof(s_str_descriptor)); } diff --git a/components/tinyusb/additions/src/tinyusb.c b/components/tinyusb/additions/src/tinyusb.c index d36addd95d..0b821aeda2 100644 --- a/components/tinyusb/additions/src/tinyusb.c +++ b/components/tinyusb/additions/src/tinyusb.c @@ -13,6 +13,7 @@ #include "soc/usb_pins.h" #include "tinyusb.h" #include "descriptors_control.h" +#include "usb_descriptors.h" #include "tusb.h" #include "tusb_tasks.h" @@ -21,8 +22,9 @@ static usb_phy_handle_t phy_hdl; esp_err_t tinyusb_driver_install(const tinyusb_config_t *config) { - tusb_desc_device_t *dev_descriptor; + const tusb_desc_device_t *dev_descriptor; const char **string_descriptor; + const uint8_t *cfg_descriptor; ESP_RETURN_ON_FALSE(config, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); // Configure USB PHY @@ -46,10 +48,11 @@ esp_err_t tinyusb_driver_install(const tinyusb_config_t *config) } ESP_RETURN_ON_ERROR(usb_new_phy(&phy_conf, &phy_hdl), TAG, "Install USB PHY failed"); - dev_descriptor = config->descriptor ? config->descriptor : &descriptor_kconfig; + dev_descriptor = config->device_descriptor ? config->device_descriptor : &descriptor_dev_kconfig; string_descriptor = config->string_descriptor ? config->string_descriptor : descriptor_str_kconfig; + cfg_descriptor = config->configuration_descriptor ? config->configuration_descriptor : descriptor_cfg_kconfig; - tusb_set_descriptor(dev_descriptor, string_descriptor); + tusb_set_descriptor(dev_descriptor, string_descriptor, cfg_descriptor); ESP_RETURN_ON_FALSE(tusb_init(), ESP_FAIL, TAG, "Init TinyUSB stack failed"); #if !CONFIG_TINYUSB_NO_DEFAULT_TASK diff --git a/components/tinyusb/additions/src/tusb_cdc_acm.c b/components/tinyusb/additions/src/tusb_cdc_acm.c index dac59954a4..db7159f70b 100644 --- a/components/tinyusb/additions/src/tusb_cdc_acm.c +++ b/components/tinyusb/additions/src/tusb_cdc_acm.c @@ -10,6 +10,7 @@ #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" +#include "freertos/ringbuf.h" #include "tusb.h" #include "tusb_cdc_acm.h" #include "cdc.h" diff --git a/components/tinyusb/additions/src/usb_descriptors.c b/components/tinyusb/additions/src/usb_descriptors.c index 6ccd3ec128..283e9f5faa 100644 --- a/components/tinyusb/additions/src/usb_descriptors.c +++ b/components/tinyusb/additions/src/usb_descriptors.c @@ -60,8 +60,8 @@ tusb_desc_strarray_device_t descriptor_str_tinyusb = { /* End of TinyUSB default */ /**** Kconfig driven Descriptor ****/ -tusb_desc_device_t descriptor_kconfig = { - .bLength = sizeof(descriptor_kconfig), +const tusb_desc_device_t descriptor_dev_kconfig = { + .bLength = sizeof(descriptor_dev_kconfig), .bDescriptorType = TUSB_DESC_DEVICE, .bcdUSB = 0x0200, @@ -126,4 +126,76 @@ tusb_desc_strarray_device_t descriptor_str_kconfig = { #endif }; + +//------------- HID Report Descriptor -------------// +#if CFG_TUD_HID +enum { + REPORT_ID_KEYBOARD = 1, + REPORT_ID_MOUSE +}; +#endif + +//------------- Configuration Descriptor -------------// +enum { +# if CFG_TUD_CDC + ITF_NUM_CDC = 0, + ITF_NUM_CDC_DATA, +# endif + +# if CFG_TUD_CDC > 1 + ITF_NUM_CDC1, + ITF_NUM_CDC1_DATA, +# endif + +# if CFG_TUD_MSC + ITF_NUM_MSC, +# endif + +# if CFG_TUD_HID + ITF_NUM_HID, +# endif + + ITF_NUM_TOTAL +}; + +enum { + TUSB_DESC_TOTAL_LEN = TUD_CONFIG_DESC_LEN + CFG_TUD_CDC * TUD_CDC_DESC_LEN + CFG_TUD_MSC * TUD_MSC_DESC_LEN + + CFG_TUD_HID * TUD_HID_DESC_LEN +}; + +#define EPNUM_MSC ((CFG_TUD_CDC * 2) + 1) +#define EPNUM_HID (EPNUM_MSC + 1) + +#if CFG_TUD_HID //HID Report Descriptor +uint8_t const desc_hid_report[] = { + TUD_HID_REPORT_DESC_KEYBOARD(HID_REPORT_ID(REPORT_ID_KEYBOARD), ), + TUD_HID_REPORT_DESC_MOUSE(HID_REPORT_ID(REPORT_ID_MOUSE), ) +}; +#endif + +uint8_t const descriptor_cfg_kconfig[] = { + // interface count, string index, total length, attribute, power in mA + TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, TUSB_DESC_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100), + +# if CFG_TUD_CDC + // Interface number, string index, EP notification address and size, EP data address (out, in) and size. + TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, 0x81, 8, 0x02, 0x82, 64), +# endif + +# if CFG_TUD_CDC > 1 + // Interface number, string index, EP notification address and size, EP data address (out, in) and size. + TUD_CDC_DESCRIPTOR(ITF_NUM_CDC1, 4, 0x83, 8, 0x04, 0x84, 64), +# endif + +# if CFG_TUD_MSC + // Interface number, string index, EP Out & EP In address, EP size + TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 5, EPNUM_MSC, 0x80 | EPNUM_MSC, 64), // highspeed 512 +# endif + +# if CFG_TUD_HID + // Interface number, string index, protocol, report descriptor len, EP In address, size & polling interval + TUD_HID_DESCRIPTOR(ITF_NUM_HID, 6, HID_PROTOCOL_NONE, sizeof(desc_hid_report), 0x80 | EPNUM_HID, 16, 10) +# endif +}; + /* End of Kconfig driven Descriptor */