Skip to content

Commit 1b95e24

Browse files
committed
HID and CDC can work together, SerialUSB breaks on open()
1 parent f90a35f commit 1b95e24

File tree

3 files changed

+30
-9
lines changed

3 files changed

+30
-9
lines changed

cores/arduino/PluggableUSBDevice.cpp

+15-4
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,10 @@ void PluggableUSBDevice::callback_request(const setup_packet_t *setup)
129129

130130
for (node = rootNode; node; node = node->next) {
131131
size = node->callback_request(setup, &result, &data);
132+
if (result != USBDevice::PassThrough) {
133+
complete_request(result, data, size);
134+
return;
135+
}
132136
}
133137
complete_request(result, data, size);
134138
}
@@ -139,13 +143,16 @@ void PluggableUSBDevice::callback_request_xfer_done(const setup_packet_t *setup,
139143
complete_request_xfer_done(false);
140144
return;
141145
}
142-
146+
bool ret = false;
143147
arduino::internal::PluggableUSBModule* node;
144148
for (node = rootNode; node; node = node->next) {
145-
node->callback_request_xfer_done(setup, aborted);
149+
ret = node->callback_request_xfer_done(setup, aborted);
150+
if (ret) {
151+
complete_request_xfer_done(ret);
152+
return;
153+
}
146154
}
147-
// FIXME!
148-
complete_request_xfer_done(true);
155+
complete_request_xfer_done(ret);
149156
}
150157

151158
void PluggableUSBDevice::callback_set_configuration(uint8_t configuration)
@@ -154,6 +161,10 @@ void PluggableUSBDevice::callback_set_configuration(uint8_t configuration)
154161
bool ret = false;
155162
for (node = rootNode; node; node = node->next) {
156163
ret = node->callback_set_configuration(configuration);
164+
if (ret) {
165+
complete_set_configuration(ret);
166+
return;
167+
}
157168
}
158169
complete_set_configuration(ret);
159170
}

libraries/USBHID/USBHID.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,9 @@ uint32_t USBHID::callback_request(const setup_packet_t *setup, USBDevice::Reques
300300
uint32_t size = 0;
301301

302302
// Process additional standard requests
303+
if (setup->wIndex != pluggedInterface) {
304+
return size;
305+
}
303306

304307
if ((setup->bmRequestType.Type == STANDARD_TYPE)) {
305308
switch (setup->bRequest) {
@@ -355,6 +358,9 @@ uint32_t USBHID::callback_request(const setup_packet_t *setup, USBDevice::Reques
355358
bool USBHID::callback_request_xfer_done(const setup_packet_t *setup, bool aborted)
356359
{
357360
(void)aborted;
361+
if (setup->wIndex != pluggedInterface) {
362+
return false;
363+
}
358364
return true;
359365
}
360366

@@ -367,10 +373,6 @@ bool USBHID::callback_request_xfer_done(const setup_packet_t *setup, bool aborte
367373
// configuration is not supported
368374
bool USBHID::callback_set_configuration(uint8_t configuration)
369375
{
370-
if (configuration == DEFAULT_CONFIGURATION) {
371-
return false;
372-
}
373-
374376
// Configure endpoints > 0
375377
PluggableUSBD().endpoint_add(_int_in, MAX_HID_REPORT_SIZE, USB_EP_TYPE_INT, mbed::callback(this, &USBHID::_send_isr));
376378
PluggableUSBD().endpoint_add(_int_out, MAX_HID_REPORT_SIZE, USB_EP_TYPE_INT, mbed::callback(this, &USBHID::_read_isr));
@@ -461,7 +463,7 @@ const uint8_t *USBHID::configuration_desc(uint8_t index)
461463

462464
INTERFACE_DESCRIPTOR_LENGTH, // bLength
463465
INTERFACE_DESCRIPTOR, // bDescriptorType
464-
0x00, // bInterfaceNumber
466+
pluggedInterface, // bInterfaceNumber
465467
0x00, // bAlternateSetting
466468
0x02, // bNumEndpoints
467469
HID_CLASS, // bInterfaceClass

libraries/USBSerial/USBCDC.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,10 @@ uint32_t USBCDC::callback_request(const USBDevice::setup_packet_t *setup, USBDev
208208
*result = USBDevice::PassThrough;
209209
uint32_t size = 0;
210210

211+
if (setup->wIndex != pluggedInterface) {
212+
return size;
213+
}
214+
211215
/* Only process class-specific requests */
212216
if (setup->bmRequestType.Type == CLASS_TYPE) {
213217
switch (setup->bRequest) {
@@ -245,6 +249,10 @@ bool USBCDC::callback_request_xfer_done(const USBDevice::setup_packet_t *setup,
245249

246250
bool success = false;
247251

252+
if (setup->wIndex != pluggedInterface) {
253+
return success;
254+
}
255+
248256
/* Process class-specific requests */
249257
if (setup->bmRequestType.Type == CLASS_TYPE) {
250258
if ((setup->bRequest == CDC_SET_LINE_CODING) && (setup->wLength == 7)) {

0 commit comments

Comments
 (0)