From 5692b84ddf3326a3cde48b09f7123cd5ec0e93cc Mon Sep 17 00:00:00 2001 From: hathach Date: Sat, 16 Jun 2018 12:30:10 +0700 Subject: adding device custom class support add usbd_open_edpt_pair --- tinyusb/device/usbd.c | 93 ++++++++++++++++++++++++++++++++--------------- tinyusb/device/usbd_pvt.h | 3 ++ 2 files changed, 66 insertions(+), 30 deletions(-) (limited to 'tinyusb/device') diff --git a/tinyusb/device/usbd.c b/tinyusb/device/usbd.c index 9fe6a5446..6718c0876 100644 --- a/tinyusb/device/usbd.c +++ b/tinyusb/device/usbd.c @@ -62,12 +62,12 @@ typedef struct { uint8_t class_code; - void (* init) (void); - tusb_error_t (* open)(uint8_t rhport, tusb_desc_interface_t const * desc_intf, uint16_t* p_length); - tusb_error_t (* control_request_st) (uint8_t rhport, tusb_control_request_t const *); - tusb_error_t (* xfer_cb) (uint8_t rhport, uint8_t ep_addr, tusb_event_t, uint32_t); - void (* sof)(uint8_t rhport); - void (* close) (uint8_t); + void (* init ) (void); + tusb_error_t (* open ) (uint8_t rhport, tusb_desc_interface_t const * desc_intf, uint16_t* p_length); + tusb_error_t (* control_req_st ) (uint8_t rhport, tusb_control_request_t const *); + tusb_error_t (* xfer_cb ) (uint8_t rhport, uint8_t ep_addr, tusb_event_t, uint32_t); + void (* sof ) (uint8_t rhport); + void (* close ) (uint8_t); } usbd_class_driver_t; @@ -94,37 +94,49 @@ static usbd_class_driver_t const usbd_class_drivers[] = { #if CFG_TUD_CDC { - .class_code = TUSB_CLASS_CDC, - .init = cdcd_init, - .open = cdcd_open, - .control_request_st = cdcd_control_request_st, - .xfer_cb = cdcd_xfer_cb, - .sof = cdcd_sof, - .close = cdcd_close + .class_code = TUSB_CLASS_CDC, + .init = cdcd_init, + .open = cdcd_open, + .control_req_st = cdcd_control_request_st, + .xfer_cb = cdcd_xfer_cb, + .sof = cdcd_sof, + .close = cdcd_close }, #endif #if DEVICE_CLASS_HID { - .class_code = TUSB_CLASS_HID, - .init = hidd_init, - .open = hidd_open, - .control_request_st = hidd_control_request_st, - .xfer_cb = hidd_xfer_cb, - .sof = NULL, - .close = hidd_close + .class_code = TUSB_CLASS_HID, + .init = hidd_init, + .open = hidd_open, + .control_req_st = hidd_control_request_st, + .xfer_cb = hidd_xfer_cb, + .sof = NULL, + .close = hidd_close }, #endif #if CFG_TUD_MSC { - .class_code = TUSB_CLASS_MSC, - .init = mscd_init, - .open = mscd_open, - .control_request_st = mscd_control_request_st, - .xfer_cb = mscd_xfer_cb, - .sof = NULL, - .close = mscd_close + .class_code = TUSB_CLASS_MSC, + .init = mscd_init, + .open = mscd_open, + .control_req_st = mscd_control_request_st, + .xfer_cb = mscd_xfer_cb, + .sof = NULL, + .close = mscd_close + }, + #endif + + #if CFG_TUD_CUSTOM_CLASS + { + .class_code = TUSB_CLASS_VENDOR_SPECIFIC, + .init = cusd_init, + .open = cusd_open, + .control_req_st = cusd_control_request_st, + .xfer_cb = cusd_xfer_cb, + .sof = NULL, + .close = cusd_close }, #endif }; @@ -358,9 +370,9 @@ static tusb_error_t proc_control_request_st(uint8_t rhport, tusb_control_request if ( usbd_class_drivers[drid].class_code == class_code ) break; } - if ( (drid < USBD_CLASS_DRIVER_COUNT) && usbd_class_drivers[drid].control_request_st ) + if ( (drid < USBD_CLASS_DRIVER_COUNT) && usbd_class_drivers[drid].control_req_st ) { - STASK_INVOKE( usbd_class_drivers[drid].control_request_st(rhport, p_request), error ); + STASK_INVOKE( usbd_class_drivers[drid].control_req_st(rhport, p_request), error ); }else { dcd_control_stall(rhport); // Stall unsupported request @@ -427,7 +439,7 @@ static tusb_error_t proc_set_config_req(uint8_t rhport, uint8_t config_number) } TU_ASSERT( drid < USBD_CLASS_DRIVER_COUNT, TUSB_ERROR_NOT_SUPPORTED_YET ); - // duplicate interface number TODO support alternate setting + // Check duplicate interface number TODO support alternate setting TU_ASSERT( 0 == usbd_devices[rhport].interface2class[p_desc_itf->bInterfaceNumber], TUSB_ERROR_FAILED); usbd_devices[rhport].interface2class[p_desc_itf->bInterfaceNumber] = class_code; @@ -587,5 +599,26 @@ void dcd_xfer_complete(uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, //--------------------------------------------------------------------+ // HELPER //--------------------------------------------------------------------+ +tusb_error_t usbd_open_edpt_pair(uint8_t rhport, tusb_desc_endpoint_t const* p_desc_ep, uint8_t xfer_type, uint8_t* ep_out, uint8_t* ep_in) +{ + for(int i=0; i<2; i++) + { + TU_ASSERT(TUSB_DESC_ENDPOINT == p_desc_ep->bDescriptorType && + xfer_type == p_desc_ep->bmAttributes.xfer, TUSB_ERROR_DESCRIPTOR_CORRUPTED); + + TU_ASSERT( dcd_edpt_open(rhport, p_desc_ep), TUSB_ERROR_DCD_OPEN_PIPE_FAILED ); + + if ( p_desc_ep->bEndpointAddress & TUSB_DIR_IN_MASK ) + { + (*ep_in) = p_desc_ep->bEndpointAddress; + }else + { + (*ep_out) = p_desc_ep->bEndpointAddress; + } + p_desc_ep = (tusb_desc_endpoint_t const *) descriptor_next( (uint8_t const*) p_desc_ep ); + } + + return TUSB_ERROR_NONE; +} #endif diff --git a/tinyusb/device/usbd_pvt.h b/tinyusb/device/usbd_pvt.h index 0b9f3e81e..067d7e937 100644 --- a/tinyusb/device/usbd_pvt.h +++ b/tinyusb/device/usbd_pvt.h @@ -50,6 +50,9 @@ extern osal_semaphore_t _usbd_ctrl_sem; tusb_error_t usbd_init(void); void usbd_task( void* param); +// helper to parse an pair of In and Out endpoint descriptors. They must be consecutive +tusb_error_t usbd_open_edpt_pair(uint8_t rhport, tusb_desc_endpoint_t const* p_desc_ep, uint8_t xfer_type, uint8_t* ep_out, uint8_t* ep_in); + // Carry out Data and Status stage of control transfer //tusb_error_t usbd_control_xfer_st(uint8_t rhport, tusb_dir_t dir, uint8_t * buffer, uint16_t length); -- cgit v1.3.1