mirror of
https://github.com/hathach/tinyusb.git
synced 2025-01-31 05:52:55 +08:00
make vendor driver more flexible
- skip additional custom descriptor between interface and endpoints - can have up to 2 bulk endpoint ( 1 in & 1 out)
This commit is contained in:
parent
25ea8f9c9e
commit
b474522245
38
src/class/vendor/vendor_device.c
vendored
38
src/class/vendor/vendor_device.c
vendored
@ -175,12 +175,12 @@ void vendord_reset(uint8_t rhport)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t vendord_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len)
|
uint16_t vendord_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t max_len)
|
||||||
{
|
{
|
||||||
TU_VERIFY(TUSB_CLASS_VENDOR_SPECIFIC == itf_desc->bInterfaceClass, 0);
|
TU_VERIFY(TUSB_CLASS_VENDOR_SPECIFIC == desc_itf->bInterfaceClass, 0);
|
||||||
|
|
||||||
uint16_t const drv_len = sizeof(tusb_desc_interface_t) + itf_desc->bNumEndpoints*sizeof(tusb_desc_endpoint_t);
|
uint16_t drv_len = tu_desc_len(desc_itf);
|
||||||
TU_VERIFY(max_len >= drv_len, 0);
|
uint8_t const * p_desc = tu_desc_next(desc_itf);
|
||||||
|
|
||||||
// Find available interface
|
// Find available interface
|
||||||
vendord_interface_t* p_vendor = NULL;
|
vendord_interface_t* p_vendor = NULL;
|
||||||
@ -194,21 +194,29 @@ uint16_t vendord_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, ui
|
|||||||
}
|
}
|
||||||
TU_VERIFY(p_vendor, 0);
|
TU_VERIFY(p_vendor, 0);
|
||||||
|
|
||||||
// Open endpoint pair with usbd helper
|
p_vendor->itf_num = desc_itf->bInterfaceNumber;
|
||||||
TU_ASSERT(usbd_open_edpt_pair(rhport, tu_desc_next(itf_desc), 2, TUSB_XFER_BULK, &p_vendor->ep_out, &p_vendor->ep_in), 0);
|
if (desc_itf->bNumEndpoints)
|
||||||
|
|
||||||
p_vendor->itf_num = itf_desc->bInterfaceNumber;
|
|
||||||
|
|
||||||
// Prepare for incoming data
|
|
||||||
if ( !usbd_edpt_xfer(rhport, p_vendor->ep_out, p_vendor->epout_buf, sizeof(p_vendor->epout_buf)) )
|
|
||||||
{
|
{
|
||||||
TU_LOG_FAILED();
|
// skip non-endpoint descriptors
|
||||||
TU_BREAKPOINT();
|
while ( (TUSB_DESC_ENDPOINT != tu_desc_type(p_desc)) && (drv_len <= max_len) )
|
||||||
|
{
|
||||||
|
drv_len += tu_desc_len(p_desc);
|
||||||
|
p_desc = tu_desc_next(p_desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
maybe_transmit(p_vendor);
|
// Open endpoint pair with usbd helper
|
||||||
|
TU_ASSERT(usbd_open_edpt_pair(rhport, p_desc, desc_itf->bNumEndpoints, TUSB_XFER_BULK, &p_vendor->ep_out, &p_vendor->ep_in), 0);
|
||||||
|
|
||||||
return drv_len;
|
// Prepare for incoming data
|
||||||
|
if ( p_vendor->ep_out )
|
||||||
|
{
|
||||||
|
TU_ASSERT(usbd_edpt_xfer(rhport, p_vendor->ep_out, p_vendor->epout_buf, sizeof(p_vendor->epout_buf)), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( p_vendor->ep_in ) maybe_transmit(p_vendor);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (uint16_t) true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool vendord_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
|
bool vendord_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
|
||||||
|
@ -922,7 +922,7 @@ static bool process_set_config(uint8_t rhport, uint8_t cfg_num)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint16_t const drv_len = tu_desc_get_interface_total_len(desc_itf, assoc_itf_count, desc_end-p_desc);
|
uint16_t const drv_len = tu_desc_get_interface_total_len(desc_itf, assoc_itf_count, desc_end-p_desc);
|
||||||
TU_ASSERT(drv_len);
|
TU_ASSERT(drv_len >= sizeof(tusb_desc_interface_t));
|
||||||
|
|
||||||
// Find driver for this interface
|
// Find driver for this interface
|
||||||
uint8_t drv_id;
|
uint8_t drv_id;
|
||||||
|
@ -1016,7 +1016,7 @@ static bool parse_configuration_descriptor(uint8_t dev_addr, tusb_desc_configura
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint16_t const drv_len = tu_desc_get_interface_total_len(desc_itf, assoc_itf_count, desc_end-p_desc);
|
uint16_t const drv_len = tu_desc_get_interface_total_len(desc_itf, assoc_itf_count, desc_end-p_desc);
|
||||||
TU_ASSERT(drv_len);
|
TU_ASSERT(drv_len >= sizeof(tusb_desc_interface_t));
|
||||||
|
|
||||||
if (desc_itf->bInterfaceClass == TUSB_CLASS_HUB && dev->hub_addr != 0)
|
if (desc_itf->bInterfaceClass == TUSB_CLASS_HUB && dev->hub_addr != 0)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user