Skip to content

Commit 4502e13

Browse files
committed
shared/tinyusb: Add USB device qualifier descriptor.
USB 2.0 requires high-speed capable devices to provide a Device Qualifier descriptor. Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
1 parent 7d23620 commit 4502e13

4 files changed

Lines changed: 37 additions & 0 deletions

File tree

extmod/machine_usb_device.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ static mp_obj_t usb_device_make_new(const mp_obj_type_t *type, size_t n_args, si
5858
o->desc_dev = mp_const_none;
5959
o->desc_cfg = mp_const_none;
6060
o->desc_strs = mp_const_none;
61+
o->desc_qual = mp_const_none;
6162
o->open_itf_cb = mp_const_none;
6263
o->reset_cb = mp_const_none;
6364
o->control_xfer_cb = mp_const_none;

shared/tinyusb/mp_usbd.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ void mp_usbd_hex_str(char *out_str, const uint8_t *bytes, size_t bytes_len);
9898
// Built-in USB device and configuration descriptor values
9999
extern const tusb_desc_device_t mp_usbd_builtin_desc_dev;
100100
extern const uint8_t mp_usbd_builtin_desc_cfg[MP_USBD_BUILTIN_DESC_CFG_LEN];
101+
#if (CFG_TUD_MAX_SPEED == OPT_MODE_HIGH_SPEED)
102+
extern const tusb_desc_device_qualifier_t mp_usbd_builtin_desc_qual;
103+
#endif
101104

102105
void mp_usbd_task_callback(mp_sched_node_t *node);
103106

@@ -130,6 +133,7 @@ typedef struct {
130133
mp_obj_t desc_dev; // Device descriptor bytes
131134
mp_obj_t desc_cfg; // Configuration descriptor bytes
132135
mp_obj_t desc_strs; // List/dict/similar to look up string descriptors by index
136+
mp_obj_t desc_qual; // Device qualifier descriptor for high-speed devices.
133137

134138
// Runtime device driver callback functions
135139
mp_obj_t open_itf_cb;

shared/tinyusb/mp_usbd_descriptor.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,21 @@ const tusb_desc_device_t mp_usbd_builtin_desc_dev = {
5353
.bNumConfigurations = 1,
5454
};
5555

56+
#if (CFG_TUD_MAX_SPEED == OPT_MODE_HIGH_SPEED)
57+
// Device qualifier descriptor for high-speed devices.
58+
const tusb_desc_device_qualifier_t mp_usbd_builtin_desc_qual = {
59+
.bLength = sizeof(tusb_desc_device_qualifier_t),
60+
.bDescriptorType = TUSB_DESC_DEVICE_QUALIFIER,
61+
.bcdUSB = 0x0200,
62+
.bDeviceClass = TUSB_CLASS_MISC,
63+
.bDeviceSubClass = MISC_SUBCLASS_COMMON,
64+
.bDeviceProtocol = MISC_PROTOCOL_IAD,
65+
.bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,
66+
.bNumConfigurations = 0x01,
67+
.bReserved = 0x00,
68+
};
69+
#endif
70+
5671
const uint8_t mp_usbd_builtin_desc_cfg[MP_USBD_BUILTIN_DESC_CFG_LEN] = {
5772
TUD_CONFIG_DESCRIPTOR(1, USBD_ITF_BUILTIN_MAX, USBD_STR_0, MP_USBD_BUILTIN_DESC_CFG_LEN,
5873
0, USBD_MAX_POWER_MA),
@@ -149,6 +164,12 @@ const uint8_t *tud_descriptor_configuration_cb(uint8_t index) {
149164
return mp_usbd_builtin_desc_cfg;
150165
}
151166

167+
#if (CFG_TUD_MAX_SPEED == OPT_MODE_HIGH_SPEED)
168+
uint8_t const *tud_descriptor_device_qualifier_cb(void) {
169+
return (uint8_t const *) &mp_usbd_builtin_desc_qual;
170+
}
171+
#endif
172+
152173
#else
153174

154175
// If runtime device support is enabled, descriptor callbacks are implemented in usbd.c

shared/tinyusb/mp_usbd_runtime.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,17 @@ const uint8_t *tud_descriptor_configuration_cb(uint8_t index) {
126126
return result ? result : &mp_usbd_builtin_desc_cfg;
127127
}
128128

129+
#if (CFG_TUD_MAX_SPEED == OPT_MODE_HIGH_SPEED)
130+
uint8_t const *tud_descriptor_device_qualifier_cb(void) {
131+
mp_obj_usb_device_t *usbd = MP_OBJ_TO_PTR(MP_STATE_VM(usbd));
132+
const void *result = NULL;
133+
if (usbd) {
134+
result = usbd_get_buffer_in_cb(usbd->desc_qual, MP_BUFFER_READ);
135+
}
136+
return result ? result : &mp_usbd_builtin_desc_qual;
137+
}
138+
#endif
139+
129140
const char *mp_usbd_runtime_string_cb(uint8_t index) {
130141
mp_obj_usb_device_t *usbd = MP_OBJ_TO_PTR(MP_STATE_VM(usbd));
131142
nlr_buf_t nlr;

0 commit comments

Comments
 (0)