From ff0e7d2bed64592c16e73e83cead8d76eda66f36 Mon Sep 17 00:00:00 2001 From: Peter Lawrence <12226419+majbthrd@users.noreply.github.com> Date: Sun, 22 Dec 2019 18:18:54 -0600 Subject: implement multiple interfaces support --- src/class/cdc/cdc_device.c | 39 ++++++++++++++++++++++++++++++--------- src/class/hid/hid_device.c | 27 +++++++++++++++++++++------ src/class/midi/midi_device.c | 12 +++++++++--- src/class/vendor/vendor_device.c | 12 +++++++++--- 4 files changed, 69 insertions(+), 21 deletions(-) (limited to 'src/class') 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= 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 ) { -- cgit v1.3.1