summaryrefslogtreecommitdiff
path: root/src/class
diff options
context:
space:
mode:
authorhathach <[email protected]>2021-09-14 21:30:38 +0700
committerhathach <[email protected]>2021-09-14 21:30:38 +0700
commitb4745222457d2a2c6c6e6a0747dd6082557c4c8e (patch)
tree7d7074ea9d40eff2e01a47f61539565c86e8810d /src/class
parent25ea8f9c9e65d1617382a7896df07afd0dc90ce3 (diff)
make vendor driver more flexible
- skip additional custom descriptor between interface and endpoints - can have up to 2 bulk endpoint ( 1 in & 1 out)
Diffstat (limited to 'src/class')
-rw-r--r--src/class/vendor/vendor_device.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/src/class/vendor/vendor_device.c b/src/class/vendor/vendor_device.c
index 8c59b4ea7..c73ca2538 100644
--- a/src/class/vendor/vendor_device.c
+++ b/src/class/vendor/vendor_device.c
@@ -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);
- TU_VERIFY(max_len >= drv_len, 0);
+ uint16_t drv_len = tu_desc_len(desc_itf);
+ uint8_t const * p_desc = tu_desc_next(desc_itf);
// Find available interface
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);
- // Open endpoint pair with usbd helper
- 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);
+ p_vendor->itf_num = desc_itf->bInterfaceNumber;
+ if (desc_itf->bNumEndpoints)
+ {
+ // skip non-endpoint descriptors
+ 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);
+ }
- p_vendor->itf_num = itf_desc->bInterfaceNumber;
+ // 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);
- // 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();
- TU_BREAKPOINT();
- }
+ // 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);
+ }
- maybe_transmit(p_vendor);
+ if ( p_vendor->ep_in ) maybe_transmit(p_vendor);
+ }
- return drv_len;
+ return (uint16_t) true;
}
bool vendord_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)