From fe1eadf177ec42914ce156704c6d2a6d85371945 Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 27 Nov 2019 12:34:30 +0700 Subject: [PATCH] fix #229 --- src/class/cdc/cdc_device.c | 4 +-- src/class/dfu/dfu_rt_device.c | 14 ++++------ src/class/hid/hid_device.c | 52 +++++++++++++++++------------------ src/class/midi/midi_device.c | 5 ++-- src/class/msc/msc_device.c | 3 +- 5 files changed, 36 insertions(+), 42 deletions(-) diff --git a/src/class/cdc/cdc_device.c b/src/class/cdc/cdc_device.c index 6da9157bd..b124b473a 100644 --- a/src/class/cdc/cdc_device.c +++ b/src/class/cdc/cdc_device.c @@ -311,8 +311,8 @@ bool cdcd_control_complete(uint8_t rhport, tusb_control_request_t const * reques // return false to stall control endpoint (e.g unsupported request) bool cdcd_control_request(uint8_t rhport, tusb_control_request_t const * request) { - //------------- Class Specific Request -------------// - TU_ASSERT(request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS); + // Handle class request only + TU_VERIFY(request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS); // TODO Support multiple interfaces uint8_t const itf = 0; diff --git a/src/class/dfu/dfu_rt_device.c b/src/class/dfu/dfu_rt_device.c index 59adae7ef..ad1871dad 100644 --- a/src/class/dfu/dfu_rt_device.c +++ b/src/class/dfu/dfu_rt_device.c @@ -79,21 +79,17 @@ bool dfu_rtd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16 bool dfu_rtd_control_complete(uint8_t rhport, tusb_control_request_t const * request) { (void) rhport; + (void) request; - //------------- Class Specific Request -------------// - TU_VERIFY(request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS); - TU_VERIFY(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE); - + // nothing to do return true; } bool dfu_rtd_control_request(uint8_t rhport, tusb_control_request_t const * request) { - (void) rhport; - - //------------- Class Specific Request -------------// - TU_ASSERT(request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS); - TU_ASSERT(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE); + // Handle class request only + TU_VERIFY(request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS); + TU_VERIFY(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE); switch ( request->bRequest ) { diff --git a/src/class/hid/hid_device.c b/src/class/hid/hid_device.c index 1d35e63f0..8527fa5d6 100644 --- a/src/class/hid/hid_device.c +++ b/src/class/hid/hid_device.c @@ -191,89 +191,87 @@ bool hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t // Handle class control request // return false to stall control endpoint (e.g unsupported request) -bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * p_request) +bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * request) { - if (p_request->bmRequestType_bit.recipient != TUSB_REQ_RCPT_INTERFACE) - { - return false; - } - hidd_interface_t* p_hid = get_interface_by_itfnum( (uint8_t) p_request->wIndex ); + TU_VERIFY(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE); + + hidd_interface_t* p_hid = get_interface_by_itfnum( (uint8_t) request->wIndex ); TU_ASSERT(p_hid); - if (p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD) + if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD) { //------------- STD Request -------------// - uint8_t const desc_type = tu_u16_high(p_request->wValue); - uint8_t const desc_index = tu_u16_low (p_request->wValue); + uint8_t const desc_type = tu_u16_high(request->wValue); + uint8_t const desc_index = tu_u16_low (request->wValue); (void) desc_index; - if (p_request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_HID) + if (request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_HID) { TU_VERIFY(p_hid->hid_descriptor != NULL); - TU_VERIFY(tud_control_xfer(rhport, p_request, (void*) p_hid->hid_descriptor, p_hid->hid_descriptor->bLength)); + TU_VERIFY(tud_control_xfer(rhport, request, (void*) p_hid->hid_descriptor, p_hid->hid_descriptor->bLength)); } - else if (p_request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_REPORT) + else if (request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_REPORT) { uint8_t const * desc_report = tud_hid_descriptor_report_cb(); - tud_control_xfer(rhport, p_request, (void*) desc_report, p_hid->report_desc_len); + tud_control_xfer(rhport, request, (void*) desc_report, p_hid->report_desc_len); } else { return false; // stall unsupported request } } - else if (p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS) + else if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS) { //------------- Class Specific Request -------------// - switch( p_request->bRequest ) + switch( request->bRequest ) { case HID_REQ_CONTROL_GET_REPORT: { // wValue = Report Type | Report ID - uint8_t const report_type = tu_u16_high(p_request->wValue); - uint8_t const report_id = tu_u16_low(p_request->wValue); + uint8_t const report_type = tu_u16_high(request->wValue); + uint8_t const report_id = tu_u16_low(request->wValue); - uint16_t xferlen = tud_hid_get_report_cb(report_id, (hid_report_type_t) report_type, p_hid->epin_buf, p_request->wLength); + uint16_t xferlen = tud_hid_get_report_cb(report_id, (hid_report_type_t) report_type, p_hid->epin_buf, request->wLength); TU_ASSERT( xferlen > 0 ); - tud_control_xfer(rhport, p_request, p_hid->epin_buf, xferlen); + tud_control_xfer(rhport, request, p_hid->epin_buf, xferlen); } break; case HID_REQ_CONTROL_SET_REPORT: - TU_VERIFY(p_request->wLength <= sizeof(p_hid->epout_buf)); - tud_control_xfer(rhport, p_request, p_hid->epout_buf, p_request->wLength); + TU_VERIFY(request->wLength <= sizeof(p_hid->epout_buf)); + tud_control_xfer(rhport, request, p_hid->epout_buf, request->wLength); break; case HID_REQ_CONTROL_SET_IDLE: - p_hid->idle_rate = tu_u16_high(p_request->wValue); + p_hid->idle_rate = tu_u16_high(request->wValue); if ( tud_hid_set_idle_cb ) { // stall request if callback return false if ( !tud_hid_set_idle_cb(p_hid->idle_rate) ) return false; } - tud_control_status(rhport, p_request); + tud_control_status(rhport, request); break; case HID_REQ_CONTROL_GET_IDLE: // TODO idle rate of report - tud_control_xfer(rhport, p_request, &p_hid->idle_rate, 1); + tud_control_xfer(rhport, request, &p_hid->idle_rate, 1); break; case HID_REQ_CONTROL_GET_PROTOCOL: { uint8_t protocol = (uint8_t)(1-p_hid->boot_mode); // 0 is Boot, 1 is Report protocol - tud_control_xfer(rhport, p_request, &protocol, 1); + tud_control_xfer(rhport, request, &protocol, 1); } break; case HID_REQ_CONTROL_SET_PROTOCOL: - p_hid->boot_mode = 1 - p_request->wValue; // 0 is Boot, 1 is Report protocol + p_hid->boot_mode = 1 - request->wValue; // 0 is Boot, 1 is Report protocol if (tud_hid_boot_mode_cb) tud_hid_boot_mode_cb(p_hid->boot_mode); - tud_control_status(rhport, p_request); + tud_control_status(rhport, request); break; default: return false; // stall unsupported request diff --git a/src/class/midi/midi_device.c b/src/class/midi/midi_device.c index 11fe06e38..b278039bf 100644 --- a/src/class/midi/midi_device.c +++ b/src/class/midi/midi_device.c @@ -322,10 +322,9 @@ bool midid_control_complete(uint8_t rhport, tusb_control_request_t const * p_req bool midid_control_request(uint8_t rhport, tusb_control_request_t const * p_request) { (void) rhport; + (void) p_request; - //------------- Class Specific Request -------------// - if (p_request->bmRequestType_bit.type != TUSB_REQ_TYPE_CLASS) return false; - + // driver doesn't support any request yet return false; } diff --git a/src/class/msc/msc_device.c b/src/class/msc/msc_device.c index cec76b110..bf2b5bb8c 100644 --- a/src/class/msc/msc_device.c +++ b/src/class/msc/msc_device.c @@ -149,7 +149,8 @@ bool mscd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t // return false to stall control endpoint (e.g unsupported request) bool mscd_control_request(uint8_t rhport, tusb_control_request_t const * p_request) { - TU_ASSERT(p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS); + // Handle class request only + TU_VERIFY(p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS); switch ( p_request->bRequest ) {