summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2023-02-01 11:18:04 +0700
committerGitHub <[email protected]>2023-02-01 11:18:04 +0700
commitd6354a2aa76ba1e991248faadc53734edce6eeae (patch)
tree15cc7d429dc4c5fe9492a731a11316825d026d0e
parent49628d8c1806fc9bf08e1402c2f8271582c9169a (diff)
parent9b6d6a983a32ecbfe6c5f09e1380549e45abe16f (diff)
Merge pull request #1877 from hathach/fix-host-cdc-without-iad
Fix host cdc without iad
-rw-r--r--README.rst4
-rw-r--r--examples/device/hid_generic_inout/src/usb_descriptors.c2
-rw-r--r--src/host/usbh.c13
3 files changed, 16 insertions, 3 deletions
diff --git a/README.rst b/README.rst
index 8504b92c8..7825a1b0a 100644
--- a/README.rst
+++ b/README.rst
@@ -1,7 +1,7 @@
.. figure:: docs/assets/logo.svg
:alt: TinyUSB
-|Build Status| |Documentation Status| |License|
+|Build Status| |Documentation Status| |Fuzzing Status| |License|
TinyUSB is an open-source cross-platform USB Host/Device stack for
embedded system, designed to be memory-safe with no dynamic allocation
@@ -130,6 +130,8 @@ in your project.
:target: https://github.com/hathach/tinyusb/actions
.. |Documentation Status| image:: https://readthedocs.org/projects/tinyusb/badge/?version=latest
:target: https://docs.tinyusb.org/en/latest/?badge=latest
+.. |Fuzzing Status| image:: https://oss-fuzz-build-logs.storage.googleapis.com/badges/tinyusb.svg
+ :target: https://oss-fuzz-build-logs.storage.googleapis.com/index.html#tinyusb
.. |License| image:: https://img.shields.io/badge/license-MIT-brightgreen.svg
:target: https://opensource.org/licenses/MIT
diff --git a/examples/device/hid_generic_inout/src/usb_descriptors.c b/examples/device/hid_generic_inout/src/usb_descriptors.c
index c2b4792c8..cd4838407 100644
--- a/examples/device/hid_generic_inout/src/usb_descriptors.c
+++ b/examples/device/hid_generic_inout/src/usb_descriptors.c
@@ -103,7 +103,7 @@ uint8_t const desc_configuration[] =
// Config number, interface count, string index, total length, attribute, power in mA
TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),
- // Interface number, string index, protocol, report descriptor len, EP In & Out address, size & polling interval
+ // Interface number, string index, protocol, report descriptor len, EP Out & In address, size & polling interval
TUD_HID_INOUT_DESCRIPTOR(ITF_NUM_HID, 0, HID_ITF_PROTOCOL_NONE, sizeof(desc_hid_report), EPNUM_HID, 0x80 | EPNUM_HID, CFG_TUD_HID_EP_BUFSIZE, 10)
};
diff --git a/src/host/usbh.c b/src/host/usbh.c
index 5ac9e9cca..12b0ed203 100644
--- a/src/host/usbh.c
+++ b/src/host/usbh.c
@@ -1522,7 +1522,7 @@ static bool _parse_configuration_descriptor(uint8_t dev_addr, tusb_desc_configur
#if CFG_TUH_MIDI
// MIDI has 2 interfaces (Audio Control v1 + MIDIStreaming) but does not have IAD
- // manually increase the associated count
+ // manually force associated count = 2
if (1 == assoc_itf_count &&
TUSB_CLASS_AUDIO == desc_itf->bInterfaceClass &&
AUDIO_SUBCLASS_CONTROL == desc_itf->bInterfaceSubClass &&
@@ -1532,6 +1532,17 @@ static bool _parse_configuration_descriptor(uint8_t dev_addr, tusb_desc_configur
}
#endif
+#if CFG_TUH_CDC
+ // Some legacy CDC device does not use IAD but rather use device class as hint to combine 2 interfaces
+ // manually force associated count = 2
+ if (1 == assoc_itf_count &&
+ TUSB_CLASS_CDC == desc_itf->bInterfaceClass &&
+ CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL == desc_itf->bInterfaceSubClass)
+ {
+ assoc_itf_count = 2;
+ }
+#endif
+
uint16_t const drv_len = tu_desc_get_interface_total_len(desc_itf, assoc_itf_count, (uint16_t) (desc_end-p_desc));
TU_ASSERT(drv_len >= sizeof(tusb_desc_interface_t));