diff options
| author | hathach <[email protected]> | 2018-06-16 12:30:10 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2018-06-16 12:32:07 +0700 |
| commit | 5692b84ddf3326a3cde48b09f7123cd5ec0e93cc (patch) | |
| tree | d5cb6098281e9a0be3a719da797d3f07d1860611 /tinyusb/device | |
| parent | 2b85a8fd460dd75cc12b11c9de137bf33f910cc7 (diff) | |
adding device custom class support
add usbd_open_edpt_pair
Diffstat (limited to 'tinyusb/device')
| -rw-r--r-- | tinyusb/device/usbd.c | 93 | ||||
| -rw-r--r-- | tinyusb/device/usbd_pvt.h | 3 |
2 files changed, 66 insertions, 30 deletions
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); |
