summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2021-03-10 12:10:52 +0700
committerGitHub <[email protected]>2021-03-10 12:10:52 +0700
commitf9817da397d9e24801bb1b7e2b8ed0ddcef36d62 (patch)
treee26998c4995e0c662cbb2645b736801462829eba
parentccb599f84bf26e979e209bfe03307ce582e021af (diff)
parenteeea19c0ab1c6e66c56eabac49e2c0f190e9a080 (diff)
Merge pull request #711 from hathach/usbd-handle-set-interface
Usbd handle set interface
-rw-r--r--examples/device/webusb_serial/src/main.c81
-rw-r--r--src/device/usbd.c20
2 files changed, 58 insertions, 43 deletions
diff --git a/examples/device/webusb_serial/src/main.c b/examples/device/webusb_serial/src/main.c
index 6a5a9fa61..c85b3cc9a 100644
--- a/examples/device/webusb_serial/src/main.c
+++ b/examples/device/webusb_serial/src/main.c
@@ -169,52 +169,59 @@ void tud_resume_cb(void)
bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request)
{
// nothing to with DATA & ACK stage
- if (stage != CONTROL_STAGE_SETUP ) return true;
+ if (stage != CONTROL_STAGE_SETUP) return true;
- if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_VENDOR) {
- switch (request->bRequest)
- {
- case VENDOR_REQUEST_WEBUSB:
- // match vendor request in BOS descriptor
- // Get landing page url
- return tud_control_xfer(rhport, request, (void*) &desc_url, desc_url.bLength);
+ switch (request->bmRequestType_bit.type)
+ {
+ case TUSB_REQ_TYPE_VENDOR:
+ switch (request->bRequest)
+ {
+ case VENDOR_REQUEST_WEBUSB:
+ // match vendor request in BOS descriptor
+ // Get landing page url
+ return tud_control_xfer(rhport, request, (void*) &desc_url, desc_url.bLength);
+
+ case VENDOR_REQUEST_MICROSOFT:
+ if ( request->wIndex == 7 )
+ {
+ // Get Microsoft OS 2.0 compatible descriptor
+ uint16_t total_len;
+ memcpy(&total_len, desc_ms_os_20+8, 2);
+
+ return tud_control_xfer(rhport, request, (void*) desc_ms_os_20, total_len);
+ }else
+ {
+ return false;
+ }
+
+ default: break;
+ }
+ break;
+
+ case TUSB_REQ_TYPE_CLASS:
+ if (request->bRequest == 0x22)
+ {
+ // Webserial simulate the CDC_REQUEST_SET_CONTROL_LINE_STATE (0x22) to connect and disconnect.
+ web_serial_connected = (request->wValue != 0);
- case VENDOR_REQUEST_MICROSOFT:
- if ( request->wIndex == 7 )
+ // Always lit LED if connected
+ if ( web_serial_connected )
{
- // Get Microsoft OS 2.0 compatible descriptor
- uint16_t total_len;
- memcpy(&total_len, desc_ms_os_20+8, 2);
+ board_led_write(true);
+ blink_interval_ms = BLINK_ALWAYS_ON;
- return tud_control_xfer(rhport, request, (void*) desc_ms_os_20, total_len);
+ tud_vendor_write_str("\r\nTinyUSB WebUSB device example\r\n");
}else
{
- return false;
+ blink_interval_ms = BLINK_MOUNTED;
}
- default:
- return false;
- }
- } else if (
- request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS &&
- request->bRequest == 0x22) {
- // Webserial simulate the CDC_REQUEST_SET_CONTROL_LINE_STATE (0x22) to
- // connect and disconnect.
- web_serial_connected = (request->wValue != 0);
-
- // Always lit LED if connected
- if ( web_serial_connected ) {
- board_led_write(true);
- blink_interval_ms = BLINK_ALWAYS_ON;
-
- tud_vendor_write_str("\r\nTinyUSB WebUSB device example\r\n");
- }else
- {
- blink_interval_ms = BLINK_MOUNTED;
- }
+ // response with status OK
+ return tud_control_status(rhport, request);
+ }
+ break;
- // response with status OK
- return tud_control_status(rhport, request);
+ default: break;
}
// stall unknown request
diff --git a/src/device/usbd.c b/src/device/usbd.c
index 911977eb0..ca5a482fc 100644
--- a/src/device/usbd.c
+++ b/src/device/usbd.c
@@ -699,13 +699,21 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const
// notable requests are: GET HID REPORT DESCRIPTOR, SET_INTERFACE, GET_INTERFACE
if ( !invoke_class_control(rhport, driver, p_request) )
{
- // For GET_INTERFACE, it is mandatory to respond even if the class
- // driver doesn't use alternate settings.
- TU_VERIFY( TUSB_REQ_TYPE_STANDARD == p_request->bmRequestType_bit.type &&
- TUSB_REQ_GET_INTERFACE == p_request->bRequest);
+ // For GET_INTERFACE and SET_INTERFACE, it is mandatory to respond even if the class
+ // driver doesn't use alternate settings or implement this
+ TU_VERIFY(TUSB_REQ_TYPE_STANDARD == p_request->bmRequestType_bit.type);
- uint8_t alternate = 0;
- tud_control_xfer(rhport, p_request, &alternate, 1);
+ if (TUSB_REQ_GET_INTERFACE == p_request->bRequest)
+ {
+ uint8_t alternate = 0;
+ tud_control_xfer(rhport, p_request, &alternate, 1);
+ }else if (TUSB_REQ_SET_INTERFACE == p_request->bRequest)
+ {
+ tud_control_status(rhport, p_request);
+ } else
+ {
+ return false;
+ }
}
}
break;