summaryrefslogtreecommitdiff
path: root/src/class
diff options
context:
space:
mode:
authorPeter Lawrence <[email protected]>2019-12-22 18:18:54 -0600
committerPeter Lawrence <[email protected]>2019-12-28 14:27:32 -0600
commitff0e7d2bed64592c16e73e83cead8d76eda66f36 (patch)
treea2cfedf2c3bd3f05e1ba2865264a6639eafc5660 /src/class
parenta601f59df5e61801cbbe87467c70a48b740d4bfd (diff)
implement multiple interfaces support
Diffstat (limited to 'src/class')
-rw-r--r--src/class/cdc/cdc_device.c39
-rw-r--r--src/class/hid/hid_device.c27
-rw-r--r--src/class/midi/midi_device.c12
-rw-r--r--src/class/vendor/vendor_device.c12
4 files changed, 69 insertions, 21 deletions
diff --git a/src/class/cdc/cdc_device.c b/src/class/cdc/cdc_device.c
index b124b473a..3ff72b00c 100644
--- a/src/class/cdc/cdc_device.c
+++ b/src/class/cdc/cdc_device.c
@@ -294,9 +294,16 @@ bool cdcd_control_complete(uint8_t rhport, tusb_control_request_t const * reques
//------------- Class Specific Request -------------//
TU_VERIFY (request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);
- // TODO Support multiple interfaces
- uint8_t const itf = 0;
- cdcd_interface_t* p_cdc = &_cdcd_itf[itf];
+ uint8_t itf = 0;
+ cdcd_interface_t* p_cdc = _cdcd_itf;
+
+ // Identify which interface to use
+ for ( ; ; itf++, p_cdc++)
+ {
+ if (itf >= TU_ARRAY_SIZE(_cdcd_itf)) return false;
+
+ if ( p_cdc->itf_num == request->wIndex ) break;
+ }
// Invoke callback
if ( CDC_REQUEST_SET_LINE_CODING == request->bRequest )
@@ -314,9 +321,16 @@ bool cdcd_control_request(uint8_t rhport, tusb_control_request_t const * request
// Handle class request only
TU_VERIFY(request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);
- // TODO Support multiple interfaces
- uint8_t const itf = 0;
- cdcd_interface_t* p_cdc = &_cdcd_itf[itf];
+ uint8_t itf = 0;
+ cdcd_interface_t* p_cdc = _cdcd_itf;
+
+ // Identify which interface to use
+ for ( ; ; itf++, p_cdc++)
+ {
+ if (itf >= TU_ARRAY_SIZE(_cdcd_itf)) return false;
+
+ if ( p_cdc->itf_num == request->wIndex ) break;
+ }
switch ( request->bRequest )
{
@@ -353,9 +367,16 @@ bool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
(void) rhport;
(void) result;
- // TODO Support multiple interfaces
- uint8_t const itf = 0;
- cdcd_interface_t* p_cdc = &_cdcd_itf[itf];
+ uint8_t itf = 0;
+ cdcd_interface_t* p_cdc = _cdcd_itf;
+
+ // Identify which interface to use
+ for ( ; ; itf++, p_cdc++)
+ {
+ if (itf >= TU_ARRAY_SIZE(_cdcd_itf)) return false;
+
+ if ( ( ep_addr == p_cdc->ep_out ) || ( ep_addr == p_cdc->ep_in ) ) break;
+ }
// Received new data
if ( ep_addr == p_cdc->ep_out )
diff --git a/src/class/hid/hid_device.c b/src/class/hid/hid_device.c
index 8527fa5d6..7cb35f1ce 100644
--- a/src/class/hid/hid_device.c
+++ b/src/class/hid/hid_device.c
@@ -162,9 +162,18 @@ bool hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t
{
uint8_t const *p_desc = (uint8_t const *) desc_itf;
- // TODO support multiple HID interface
- uint8_t const itf = 0;
- hidd_interface_t * p_hid = &_hidd_itf[itf];
+ // Find available interface
+ hidd_interface_t * p_hid = NULL;
+ uint8_t hid_id;
+ for(hid_id=0; hid_id<CFG_TUD_HID; hid_id++)
+ {
+ if ( _hidd_itf[hid_id].ep_in == 0 )
+ {
+ p_hid = &_hidd_itf[hid_id];
+ break;
+ }
+ }
+ TU_ASSERT(p_hid);
//------------- HID descriptor -------------//
p_desc = tu_desc_next(p_desc);
@@ -309,9 +318,15 @@ bool hidd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
{
(void) result;
- // TODO support multiple HID interface
- uint8_t const itf = 0;
- hidd_interface_t * p_hid = &_hidd_itf[itf];
+ uint8_t itf = 0;
+ hidd_interface_t * p_hid = _hidd_itf;
+
+ for ( ; ; itf++, p_hid++)
+ {
+ if (itf >= TU_ARRAY_SIZE(_hidd_itf)) return false;
+
+ if ( ep_addr == p_hid->ep_out ) break;
+ }
if (ep_addr == p_hid->ep_out)
{
diff --git a/src/class/midi/midi_device.c b/src/class/midi/midi_device.c
index b278039bf..0c68f8e71 100644
--- a/src/class/midi/midi_device.c
+++ b/src/class/midi/midi_device.c
@@ -332,9 +332,15 @@ bool midid_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32
{
(void) result;
- // TODO Support multiple interfaces
- uint8_t const itf = 0;
- midid_interface_t* p_midi = &_midid_itf[itf];
+ uint8_t itf = 0;
+ midid_interface_t* p_midi = _midid_itf;
+
+ for ( ; ; itf++, p_midi++)
+ {
+ if (itf >= TU_ARRAY_SIZE(_midid_itf)) return false;
+
+ if ( ep_addr == p_midi->ep_out ) break;
+ }
// receive new data
if ( ep_addr == p_midi->ep_out )
diff --git a/src/class/vendor/vendor_device.c b/src/class/vendor/vendor_device.c
index a00257476..8db5005f4 100644
--- a/src/class/vendor/vendor_device.c
+++ b/src/class/vendor/vendor_device.c
@@ -197,9 +197,15 @@ bool vendord_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint
(void) rhport;
(void) result;
- // TODO Support multiple interfaces
- uint8_t const itf = 0;
- vendord_interface_t* p_itf = &_vendord_itf[itf];
+ uint8_t itf = 0;
+ vendord_interface_t* p_itf = _vendord_itf;
+
+ for ( ; ; itf++, p_itf++)
+ {
+ if (itf >= TU_ARRAY_SIZE(_vendord_itf)) return false;
+
+ if ( ( ep_addr == p_itf->ep_out ) || ( ep_addr == p_itf->ep_in ) ) break;
+ }
if ( ep_addr == p_itf->ep_out )
{