follow up to suggestion to pr 155

This commit is contained in:
hathach 2019-09-16 11:13:17 +07:00 committed by Nathan Conrad
parent ff36957c05
commit 8e17fb4910
2 changed files with 15 additions and 7 deletions

View File

@ -125,7 +125,8 @@ typedef enum
{ {
TUSB_REQ_TYPE_STANDARD = 0, TUSB_REQ_TYPE_STANDARD = 0,
TUSB_REQ_TYPE_CLASS, TUSB_REQ_TYPE_CLASS,
TUSB_REQ_TYPE_VENDOR TUSB_REQ_TYPE_VENDOR,
TUSB_REQ_TYPE_INVALID
} tusb_request_type_t; } tusb_request_type_t;
typedef enum typedef enum

View File

@ -62,7 +62,7 @@ typedef struct {
static usbd_device_t _usbd_dev = { 0 }; static usbd_device_t _usbd_dev = { 0 };
// Invalid driver ID in itf2drv[] ep2drv[][] mapping // Invalid driver ID in itf2drv[] ep2drv[][] mapping
enum { DRVID_INVALID = 0xff }; enum { DRVID_INVALID = 0xFFu };
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// Class Driver // Class Driver
@ -365,6 +365,8 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const
{ {
usbd_control_set_complete_callback(NULL); usbd_control_set_complete_callback(NULL);
TU_ASSERT(p_request->bmRequestType_bit.type < TUSB_REQ_TYPE_INVALID);
// Vendor request // Vendor request
if ( p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_VENDOR ) if ( p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_VENDOR )
{ {
@ -486,7 +488,8 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const
// GET HID REPORT DESCRIPTOR falls into this case // GET HID REPORT DESCRIPTOR falls into this case
// stall control endpoint if driver return false // stall control endpoint if driver return false
usbd_control_set_complete_callback(usbd_class_drivers[drvid].control_complete); usbd_control_set_complete_callback(usbd_class_drivers[drvid].control_complete);
TU_ASSERT(usbd_class_drivers[drvid].control_request(rhport, p_request)); TU_ASSERT(usbd_class_drivers[drvid].control_request != NULL &&
usbd_class_drivers[drvid].control_request(rhport, p_request));
break; break;
} }
}else }else
@ -494,7 +497,8 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const
// forward to class driver: "non-STD request to Interface" // forward to class driver: "non-STD request to Interface"
// stall control endpoint if driver return false // stall control endpoint if driver return false
usbd_control_set_complete_callback(usbd_class_drivers[drvid].control_complete); usbd_control_set_complete_callback(usbd_class_drivers[drvid].control_complete);
TU_ASSERT(usbd_class_drivers[drvid].control_request(rhport, p_request)); TU_ASSERT(usbd_class_drivers[drvid].control_request != NULL &&
usbd_class_drivers[drvid].control_request(rhport, p_request));
} }
} }
break; break;
@ -515,7 +519,7 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const
// We will forward all request targeted endpoint to its class driver // We will forward all request targeted endpoint to its class driver
// - For non-standard request: driver can ACK or Stall the request by return true/false // - For non-standard request: driver can ACK or Stall the request by return true/false
// - For standard request: usbd decide the ACK stage regardless of driver return value // - For standard request: usbd decide the ACK stage regardless of driver return value
bool ret; bool ret = false;
if ( TUSB_REQ_TYPE_STANDARD != p_request->bmRequestType_bit.type ) if ( TUSB_REQ_TYPE_STANDARD != p_request->bmRequestType_bit.type )
{ {
@ -523,8 +527,11 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const
usbd_control_set_complete_callback(usbd_class_drivers[drv_id].control_complete); usbd_control_set_complete_callback(usbd_class_drivers[drv_id].control_complete);
} }
// Invoke class driver first // Invoke class driver first if available
ret = usbd_class_drivers[drv_id].control_request(rhport, p_request); if ( usbd_class_drivers[drv_id].control_request )
{
ret = usbd_class_drivers[drv_id].control_request(rhport, p_request);
}
// Then handle if it is standard request // Then handle if it is standard request
if ( TUSB_REQ_TYPE_STANDARD == p_request->bmRequestType_bit.type ) if ( TUSB_REQ_TYPE_STANDARD == p_request->bmRequestType_bit.type )