diff options
| author | hathach <[email protected]> | 2019-07-04 02:09:12 +0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2019-07-04 02:09:12 +0700 |
| commit | 2dd8dba4a7dc7b288a94054080932513ab1e98e3 (patch) | |
| tree | 9759fd0cdf4fab9eb4a7674c37e1ea6aa61f1927 /src/class | |
| parent | 393492823ce037a2e46d367d61fad1235859af2e (diff) | |
| parent | 3ec279b424ea463577420e75db54deebf409be2b (diff) | |
Merge pull request #84 from hathach/develop
better support device MIDI
Diffstat (limited to 'src/class')
| -rw-r--r-- | src/class/audio/audio.h | 44 | ||||
| -rw-r--r-- | src/class/cdc/cdc.h | 20 | ||||
| -rw-r--r-- | src/class/cdc/cdc_device.c | 19 | ||||
| -rw-r--r-- | src/class/cdc/cdc_device.h | 100 | ||||
| -rw-r--r-- | src/class/cdc/cdc_host.c | 2 | ||||
| -rw-r--r-- | src/class/midi/midi.h | 117 | ||||
| -rw-r--r-- | src/class/midi/midi_device.c | 27 | ||||
| -rw-r--r-- | src/class/midi/midi_device.h | 84 |
8 files changed, 322 insertions, 91 deletions
diff --git a/src/class/audio/audio.h b/src/class/audio/audio.h index c655e79e2..83b8906d2 100644 --- a/src/class/audio/audio.h +++ b/src/class/audio/audio.h @@ -29,8 +29,8 @@ * Currently only MIDI subclass is supported
* @{ */
-#ifndef _TUSB_CDC_H__
-#define _TUSB_CDC_H__
+#ifndef _TUSB_AUDIO_H__
+#define _TUSB_AUDIO_H__
#include "common/tusb_common.h"
@@ -41,9 +41,9 @@ /// Audio Interface Subclass Codes
typedef enum
{
- AUDIO_SUBCLASS_AUDIO_CONTROL = 0x01 , ///< Audio Control
- AUDIO_SUBCLASS_AUDIO_STREAMING , ///< Audio Streaming
- AUDIO_SUBCLASS_MIDI_STREAMING , ///< MIDI Streaming
+ AUDIO_SUBCLASS_CONTROL = 0x01 , ///< Audio Control
+ AUDIO_SUBCLASS_STREAMING , ///< Audio Streaming
+ AUDIO_SUBCLASS_MIDI_STREAMING , ///< MIDI Streaming
} audio_subclass_type_t;
/// Audio Protocol Codes
@@ -54,6 +54,40 @@ typedef enum AUDIO_PROTOCOL_V3 = 0x30, ///< Version 3.0
} audio_protocol_type_t;
+/// Audio Function Category Codes
+typedef enum
+{
+ AUDIO_FUNC_DESKTOP_SPEAKER = 0x01,
+ AUDIO_FUNC_HOME_THEATER = 0x02,
+ AUDIO_FUNC_MICROPHONE = 0x03,
+ AUDIO_FUNC_HEADSET = 0x04,
+ AUDIO_FUNC_TELEPHONE = 0x05,
+ AUDIO_FUNC_CONVERTER = 0x06,
+ AUDIO_FUNC_SOUND_RECODER = 0x07,
+ AUDIO_FUNC_IO_BOX = 0x08,
+ AUDIO_FUNC_MUSICAL_INSTRUMENT = 0x09,
+ AUDIO_FUNC_PRO_AUDIO = 0x0A,
+ AUDIO_FUNC_AUDIO_VIDEO = 0x0B,
+ AUDIO_FUNC_CONTROL_PANEL = 0x0C
+} audio_function_t;
+
+/// Audio Class-Specific AC Interface Descriptor Subtypes
+typedef enum
+{
+ AUDIO_CS_INTERFACE_HEADER = 0x01,
+ AUDIO_CS_INTERFACE_INPUT_TERMINAL = 0x02,
+ AUDIO_CS_INTERFACE_OUTPUT_TERMINAL = 0x03,
+ AUDIO_CS_INTERFACE_MIXER_UNIT = 0x04,
+ AUDIO_CS_INTERFACE_SELECTOR_UNIT = 0x05,
+ AUDIO_CS_INTERFACE_FEATURE_UNIT = 0x06,
+ AUDIO_CS_INTERFACE_EFFECT_UNIT = 0x07,
+ AUDIO_CS_INTERFACE_PROCESSING_UNIT = 0x08,
+ AUDIO_CS_INTERFACE_EXTENSION_UNIT = 0x09,
+ AUDIO_CS_INTERFACE_CLOCK_SOURCE = 0x0A,
+ AUDIO_CS_INTERFACE_CLOCK_SELECTOR = 0x0B,
+ AUDIO_CS_INTERFACE_CLOCK_MULTIPLIER = 0x0C,
+ AUDIO_CS_INTERFACE_SAMPLE_RATE_CONVERTER = 0x0D,
+} audio_cs_interface_subtype_t;
/** @} */
diff --git a/src/class/cdc/cdc.h b/src/class/cdc/cdc.h index 2e865bdbb..9cc8b82e3 100644 --- a/src/class/cdc/cdc.h +++ b/src/class/cdc/cdc.h @@ -41,7 +41,7 @@ /** \defgroup ClassDriver_CDC_Common Common Definitions
* @{ */
-
+// TODO remove
/// CDC Pipe ID, used to indicate which pipe the API is addressing to (Notification, Out, In)
typedef enum
{
@@ -52,8 +52,9 @@ typedef enum }cdc_pipeid_t;
//--------------------------------------------------------------------+
-// CDC COMMUNICATION INTERFACE CLASS
+// CDC Communication Interface Class
//--------------------------------------------------------------------+
+
/// Communication Interface Subclass Codes
typedef enum
{
@@ -117,7 +118,7 @@ typedef enum }cdc_func_desc_type_t;
//--------------------------------------------------------------------+
-// CDC DATA INTERFACE CLASS
+// CDC Data Interface Class
//--------------------------------------------------------------------+
// SUBCLASS code of Data Interface is not used and should/must be zero
@@ -138,8 +139,9 @@ typedef enum{ }cdc_data_protocol_type_t;
//--------------------------------------------------------------------+
-// MANAGEMENT ELEMENT REQUEST (CONTROL ENDPOINT)
+// Management Element Request (Control Endpoint)
//--------------------------------------------------------------------+
+
/// Communication Interface Management Element Request Codes
typedef enum
{
@@ -189,8 +191,9 @@ typedef enum }cdc_management_request_t;
//--------------------------------------------------------------------+
-// MANAGEMENT ELEMENENT NOTIFICATION (NOTIFICATION ENDPOINT)
+// Management Elemenent Notification (Notification Endpoint)
//--------------------------------------------------------------------+
+
/// Communication Interface Management Element Notification Codes
typedef enum
{
@@ -209,14 +212,15 @@ typedef enum }cdc_notification_request_t;
//--------------------------------------------------------------------+
-// FUNCTIONAL DESCRIPTOR (COMMUNICATION INTERFACE)
+// Class Specific Functional Descriptor (Communication Interface)
//--------------------------------------------------------------------+
+
/// Header Functional Descriptor (Communication Interface)
typedef struct TU_ATTR_PACKED
{
uint8_t bLength ; ///< Size of this descriptor in bytes.
uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
- uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_
+ uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUNC_DESC_
uint16_t bcdCDC ; ///< CDC release number in Binary-Coded Decimal
}cdc_desc_func_header_t;
@@ -246,7 +250,7 @@ typedef struct TU_ATTR_PACKED uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_
uint8_t iCountryCodeRelDate ; ///< Index of a string giving the release date for the implemented ISO 3166 Country Codes.
- uint16_t wCountryCode[] ; ///< Country code in the format as defined in [ISO3166], release date as specified inoffset 3 for the first supported country.
+ uint16_t wCountryCode ; ///< Country code in the format as defined in [ISO3166], release date as specified inoffset 3 for the first supported country.
}cdc_desc_func_country_selection_t;
#define cdc_desc_func_country_selection_n_t(no_country) \
diff --git a/src/class/cdc/cdc_device.c b/src/class/cdc/cdc_device.c index 0a41147c9..6d13dafc0 100644 --- a/src/class/cdc/cdc_device.c +++ b/src/class/cdc/cdc_device.c @@ -73,21 +73,18 @@ typedef struct //--------------------------------------------------------------------+
CFG_TUSB_MEM_SECTION static cdcd_interface_t _cdcd_itf[CFG_TUD_CDC];
-//bool pending_read_from_host; TODO remove
static void _prep_out_transaction (uint8_t itf)
{
cdcd_interface_t* p_cdc = &_cdcd_itf[itf];
// skip if previous transfer not complete
if ( usbd_edpt_busy(TUD_OPT_RHPORT, p_cdc->ep_out) ) return;
- //if (pending_read_from_host) return;
// Prepare for incoming data but only allow what we can store in the ring buffer.
uint16_t max_read = tu_fifo_remaining(&p_cdc->rx_ff);
if ( max_read >= CFG_TUD_CDC_EPSIZE )
{
usbd_edpt_xfer(TUD_OPT_RHPORT, p_cdc->ep_out, p_cdc->epout_buf, CFG_TUD_CDC_EPSIZE);
-// pending_read_from_host = true;
}
}
@@ -265,7 +262,7 @@ bool cdcd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t (*p_length) = sizeof(tusb_desc_interface_t);
// Communication Functional Descriptors
- while ( TUSB_DESC_CLASS_SPECIFIC == tu_desc_type(p_desc) )
+ while ( TUSB_DESC_CS_INTERFACE == tu_desc_type(p_desc) )
{
(*p_length) += tu_desc_len(p_desc);
p_desc = tu_desc_next(p_desc);
@@ -296,7 +293,6 @@ bool cdcd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t }
// Prepare for incoming data
-// pending_read_from_host = false;
_prep_out_transaction(cdc_id);
return true;
@@ -374,7 +370,7 @@ bool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_ uint8_t const itf = 0;
cdcd_interface_t* p_cdc = &_cdcd_itf[itf];
- // receive new data
+ // Received new data
if ( ep_addr == p_cdc->ep_out )
{
for(uint32_t i=0; i<xferred_bytes; i++)
@@ -392,11 +388,18 @@ bool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_ if (tud_cdc_rx_cb && tu_fifo_count(&p_cdc->rx_ff) ) tud_cdc_rx_cb(itf);
// prepare for OUT transaction
-// pending_read_from_host = false;
_prep_out_transaction(itf);
}
- // nothing to do with in and notif endpoint for now
+ // Data sent to host, we could continue to fetch data tx fifo to send.
+ // But it will cause incorrect baudrate set in line coding.
+ // Though maybe the baudrate is not really important !!!
+// if ( ep_addr == p_cdc->ep_in )
+// {
+//
+// }
+
+ // nothing to do with notif endpoint for now
return true;
}
diff --git a/src/class/cdc/cdc_device.h b/src/class/cdc/cdc_device.h index 3c1af9dbf..8d09094a0 100644 --- a/src/class/cdc/cdc_device.h +++ b/src/class/cdc/cdc_device.h @@ -48,7 +48,7 @@ * @{ */
//--------------------------------------------------------------------+
-// APPLICATION API (Multiple Interfaces)
+// Application API (Multiple Interfaces)
// CFG_TUD_CDC > 1
//--------------------------------------------------------------------+
bool tud_cdc_n_connected (uint8_t itf);
@@ -68,26 +68,26 @@ uint32_t tud_cdc_n_write_str (uint8_t itf, char const* str); bool tud_cdc_n_write_flush (uint8_t itf);
//--------------------------------------------------------------------+
-// APPLICATION API (Interface0)
+// Application API (Interface0)
//--------------------------------------------------------------------+
-static inline bool tud_cdc_connected (void) { return tud_cdc_n_connected(0); }
-static inline uint8_t tud_cdc_get_line_state (void) { return tud_cdc_n_get_line_state(0); }
-static inline void tud_cdc_get_line_coding (cdc_line_coding_t* coding) { return tud_cdc_n_get_line_coding(0, coding);}
-static inline void tud_cdc_set_wanted_char (char wanted) { tud_cdc_n_set_wanted_char(0, wanted); }
+static inline bool tud_cdc_connected (void);
+static inline uint8_t tud_cdc_get_line_state (void);
+static inline void tud_cdc_get_line_coding (cdc_line_coding_t* coding);
+static inline void tud_cdc_set_wanted_char (char wanted);
-static inline uint32_t tud_cdc_available (void) { return tud_cdc_n_available(0); }
-static inline signed char tud_cdc_read_char (void) { return tud_cdc_n_read_char(0); }
-static inline uint32_t tud_cdc_read (void* buffer, uint32_t bufsize) { return tud_cdc_n_read(0, buffer, bufsize); }
-static inline void tud_cdc_read_flush (void) { tud_cdc_n_read_flush(0); }
-static inline signed char tud_cdc_peek (int pos) { return tud_cdc_n_peek(0, pos); }
+static inline uint32_t tud_cdc_available (void);
+static inline signed char tud_cdc_read_char (void);
+static inline uint32_t tud_cdc_read (void* buffer, uint32_t bufsize);
+static inline void tud_cdc_read_flush (void);
+static inline signed char tud_cdc_peek (int pos);
-static inline uint32_t tud_cdc_write_char (char ch) { return tud_cdc_n_write_char(0, ch); }
-static inline uint32_t tud_cdc_write (void const* buffer, uint32_t bufsize) { return tud_cdc_n_write(0, buffer, bufsize); }
-static inline uint32_t tud_cdc_write_str (char const* str) { return tud_cdc_n_write_str(0, str); }
-static inline bool tud_cdc_write_flush (void) { return tud_cdc_n_write_flush(0); }
+static inline uint32_t tud_cdc_write_char (char ch);
+static inline uint32_t tud_cdc_write (void const* buffer, uint32_t bufsize);
+static inline uint32_t tud_cdc_write_str (char const* str);
+static inline bool tud_cdc_write_flush (void);
//--------------------------------------------------------------------+
-// APPLICATION CALLBACK API (WEAK is optional)
+// Application Callback API (weak is optional)
//--------------------------------------------------------------------+
// Invoked when received new data
@@ -102,6 +102,74 @@ TU_ATTR_WEAK void tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts); // Invoked when line coding is change via SET_LINE_CODING
TU_ATTR_WEAK void tud_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const* p_line_coding);
+//--------------------------------------------------------------------+
+// Inline Functions
+//--------------------------------------------------------------------+
+static inline bool tud_cdc_connected (void)
+{
+ return tud_cdc_n_connected(0);
+}
+
+static inline uint8_t tud_cdc_get_line_state (void)
+{
+ return tud_cdc_n_get_line_state(0);
+}
+
+static inline void tud_cdc_get_line_coding (cdc_line_coding_t* coding)
+{
+ return tud_cdc_n_get_line_coding(0, coding);
+}
+
+static inline void tud_cdc_set_wanted_char (char wanted)
+{
+ tud_cdc_n_set_wanted_char(0, wanted);
+}
+
+static inline uint32_t tud_cdc_available (void)
+{
+ return tud_cdc_n_available(0);
+}
+
+static inline signed char tud_cdc_read_char (void)
+{
+ return tud_cdc_n_read_char(0);
+}
+
+static inline uint32_t tud_cdc_read (void* buffer, uint32_t bufsize)
+{
+ return tud_cdc_n_read(0, buffer, bufsize);
+}
+
+static inline void tud_cdc_read_flush (void)
+{
+ tud_cdc_n_read_flush(0);
+}
+
+static inline signed char tud_cdc_peek (int pos)
+{
+ return tud_cdc_n_peek(0, pos);
+}
+
+static inline uint32_t tud_cdc_write_char (char ch)
+{
+ return tud_cdc_n_write_char(0, ch);
+}
+
+static inline uint32_t tud_cdc_write (void const* buffer, uint32_t bufsize)
+{
+ return tud_cdc_n_write(0, buffer, bufsize);
+}
+
+static inline uint32_t tud_cdc_write_str (char const* str)
+{
+ return tud_cdc_n_write_str(0, str);
+}
+
+static inline bool tud_cdc_write_flush (void)
+{
+ return tud_cdc_n_write_flush(0);
+}
+
/** @} */
/** @} */
diff --git a/src/class/cdc/cdc_host.c b/src/class/cdc/cdc_host.c index b64d4a1fe..6a6f508b3 100644 --- a/src/class/cdc/cdc_host.c +++ b/src/class/cdc/cdc_host.c @@ -142,7 +142,7 @@ bool cdch_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *it (*p_length) = sizeof(tusb_desc_interface_t);
// Communication Functional Descriptors
- while( TUSB_DESC_CLASS_SPECIFIC == p_desc[DESC_OFFSET_TYPE] )
+ while( TUSB_DESC_CS_INTERFACE == p_desc[DESC_OFFSET_TYPE] )
{
if ( CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT == cdc_functional_desc_typeof(p_desc) )
{
diff --git a/src/class/midi/midi.h b/src/class/midi/midi.h index 50f2be679..b3cc17af9 100644 --- a/src/class/midi/midi.h +++ b/src/class/midi/midi.h @@ -39,27 +39,122 @@ #endif
//--------------------------------------------------------------------+
-// FUNCTIONAL DESCRIPTOR (COMMUNICATION INTERFACE)
+// Class Specific Descriptor
//--------------------------------------------------------------------+
-/// Header Functional Descriptor (Communication Interface)
+
+typedef enum
+{
+ MIDI_CS_INTERFACE_HEADER = 0x01,
+ MIDI_CS_INTERFACE_IN_JACK = 0x02,
+ MIDI_CS_INTERFACE_OUT_JACK = 0x03,
+ MIDI_CS_INTERFACE_ELEMENT = 0x04,
+} midi_cs_interface_subtype_t;
+
+typedef enum
+{
+ MIDI_CS_ENDPOINT_GENERAL = 0x01
+} midi_cs_endpoint_subtype_t;
+
+typedef enum
+{
+ MIDI_JACK_EMBEDDED = 0x01,
+ MIDI_JACK_EXTERNAL = 0x02
+} midi_jack_type_t;
+
+/// MIDI Interface Header Descriptor
typedef struct TU_ATTR_PACKED
{
uint8_t bLength ; ///< Size of this descriptor in bytes.
uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
- uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above MIDI_FUCN_DESC_
+ uint8_t bDescriptorSubType ; ///< Descriptor SubType
uint16_t bcdMSC ; ///< MidiStreaming SubClass release number in Binary-Coded Decimal
uint16_t wTotalLength ;
-}midi_desc_func_header_t;
+} midi_desc_header_t;
+
+/// MIDI In Jack Descriptor
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t bLength ; ///< Size of this descriptor in bytes.
+ uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
+ uint8_t bDescriptorSubType ; ///< Descriptor SubType
+ uint8_t bJackType ; ///< Embedded or External
+ uint8_t bJackID ; ///< Unique ID for MIDI IN Jack
+ uint8_t iJack ; ///< string descriptor
+} midi_desc_in_jack_t;
+
+
+/// MIDI Out Jack Descriptor with single pin
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t bLength ; ///< Size of this descriptor in bytes.
+ uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
+ uint8_t bDescriptorSubType ; ///< Descriptor SubType
+ uint8_t bJackType ; ///< Embedded or External
+ uint8_t bJackID ; ///< Unique ID for MIDI IN Jack
+ uint8_t bNrInputPins;
+
+ uint8_t baSourceID;
+ uint8_t baSourcePin;
+
+ uint8_t iJack ; ///< string descriptor
+} midi_desc_out_jack_t ;
+
+/// MIDI Out Jack Descriptor with multiple pins
+#define midi_desc_out_jack_n_t(input_num) \
+ struct TU_ATTR_PACKED { \
+ uint8_t bLength ; \
+ uint8_t bDescriptorType ; \
+ uint8_t bDescriptorSubType ; \
+ uint8_t bJackType ; \
+ uint8_t bJackID ; \
+ uint8_t bNrInputPins ; \
+ struct TU_ATTR_PACKED { \
+ uint8_t baSourceID; \
+ uint8_t baSourcePin; \
+ } pins[input_num]; \
+ uint8_t iJack ; \
+ }
-/// Union Functional Descriptor (Communication Interface)
+/// MIDI Element Descriptor
typedef struct TU_ATTR_PACKED
{
- uint8_t bLength ; ///< Size of this descriptor in bytes.
- uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
- uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_
- uint8_t bControlInterface ; ///< Interface number of Communication Interface
- uint8_t bSubordinateInterface ; ///< Array of Interface number of Data Interface
-}cdc_desc_func_union_t;
+ uint8_t bLength ; ///< Size of this descriptor in bytes.
+ uint8_t bDescriptorType ; ///< Descriptor Type, must be Class-Specific
+ uint8_t bDescriptorSubType ; ///< Descriptor SubType
+ uint8_t bElementID;
+
+ uint8_t bNrInputPins;
+ uint8_t baSourceID;
+ uint8_t baSourcePin;
+
+ uint8_t bNrOutputPins;
+ uint8_t bInTerminalLink;
+ uint8_t bOutTerminalLink;
+ uint8_t bElCapsSize;
+
+ uint16_t bmElementCaps;
+ uint8_t iElement;
+} midi_desc_element_t;
+
+/// MIDI Element Descriptor with multiple pins
+#define midi_desc_element_n_t(input_num) \
+ struct TU_ATTR_PACKED { \
+ uint8_t bLength; \
+ uint8_t bDescriptorType; \
+ uint8_t bDescriptorSubType; \
+ uint8_t bElementID; \
+ uint8_t bNrInputPins; \
+ struct TU_ATTR_PACKED { \
+ uint8_t baSourceID; \
+ uint8_t baSourcePin; \
+ } pins[input_num]; \
+ uint8_t bNrOutputPins; \
+ uint8_t bInTerminalLink; \
+ uint8_t bOutTerminalLink; \
+ uint8_t bElCapsSize; \
+ uint16_t bmElementCaps; \
+ uint8_t iElement; \
+ }
/** @} */
diff --git a/src/class/midi/midi_device.c b/src/class/midi/midi_device.c index 2454db47e..76776d71c 100644 --- a/src/class/midi/midi_device.c +++ b/src/class/midi/midi_device.c @@ -74,7 +74,8 @@ typedef struct //--------------------------------------------------------------------+
CFG_TUSB_MEM_SECTION midid_interface_t _midid_itf[CFG_TUD_MIDI];
-bool tud_midi_n_connected(uint8_t itf) {
+bool tud_midi_n_mounted (uint8_t itf)
+{
midid_interface_t* midi = &_midid_itf[itf];
return midi->itf_num != 0;
}
@@ -87,12 +88,6 @@ uint32_t tud_midi_n_available(uint8_t itf, uint8_t jack_id) return tu_fifo_count(&_midid_itf[itf].rx_ff);
}
-char tud_midi_n_read_char(uint8_t itf, uint8_t jack_id)
-{
- char ch;
- return tu_fifo_read(&_midid_itf[itf].rx_ff, &ch) ? ch : (-1);
-}
-
uint32_t tud_midi_n_read(uint8_t itf, uint8_t jack_id, void* buffer, uint32_t bufsize)
{
return tu_fifo_read_n(&_midid_itf[itf].rx_ff, buffer, bufsize);
@@ -103,7 +98,6 @@ void tud_midi_n_read_flush (uint8_t itf, uint8_t jack_id) tu_fifo_clear(&_midid_itf[itf].rx_ff);
}
-
void midi_rx_done_cb(midid_interface_t* midi, uint8_t const* buffer, uint32_t bufsize) {
if (bufsize % 4 != 0) {
return;
@@ -133,15 +127,14 @@ void midi_rx_done_cb(midid_interface_t* midi, uint8_t const* buffer, uint32_t bu static bool maybe_transmit(midid_interface_t* midi, uint8_t itf_index)
{
- TU_VERIFY( !usbd_edpt_busy(TUD_OPT_RHPORT, midi->ep_in) ); // skip if previous transfer not complete
+ TU_VERIFY( !usbd_edpt_busy(TUD_OPT_RHPORT, midi->ep_in) ); // skip if previous transfer not complete
- uint16_t count = tu_fifo_read_n(&midi->tx_ff, midi->epin_buf, CFG_TUD_MIDI_EPSIZE);
- if (count > 0)
- {
- TU_VERIFY( tud_midi_n_connected(itf_index) ); // fifo is empty if not connected
- TU_ASSERT( usbd_edpt_xfer(TUD_OPT_RHPORT, midi->ep_in, midi->epin_buf, count) );
- }
- return true;
+ uint16_t count = tu_fifo_read_n(&midi->tx_ff, midi->epin_buf, CFG_TUD_MIDI_EPSIZE);
+ if (count > 0)
+ {
+ TU_ASSERT( usbd_edpt_xfer(TUD_OPT_RHPORT, midi->ep_in, midi->epin_buf, count) );
+ }
+ return true;
}
uint32_t tud_midi_n_write(uint8_t itf, uint8_t jack_id, uint8_t const* buffer, uint32_t bufsize)
@@ -252,7 +245,7 @@ void midid_reset(uint8_t rhport) bool midid_open(uint8_t rhport, tusb_desc_interface_t const * p_interface_desc, uint16_t *p_length)
{
// For now handle the audio control interface as well.
- if ( AUDIO_SUBCLASS_AUDIO_CONTROL == p_interface_desc->bInterfaceSubClass) {
+ if ( AUDIO_SUBCLASS_CONTROL == p_interface_desc->bInterfaceSubClass) {
uint8_t const * p_desc = tu_desc_next ( (uint8_t const *) p_interface_desc );
(*p_length) = sizeof(tusb_desc_interface_t);
diff --git a/src/class/midi/midi_device.h b/src/class/midi/midi_device.h index 45e009010..490abaf89 100644 --- a/src/class/midi/midi_device.h +++ b/src/class/midi/midi_device.h @@ -29,7 +29,9 @@ #include "common/tusb_common.h"
#include "device/usbd.h"
+
#include "class/audio/audio.h"
+#include "midi.h"
//--------------------------------------------------------------------+
// Class Driver Configuration
@@ -38,7 +40,6 @@ #define CFG_TUD_MIDI_EPSIZE 64
#endif
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -49,42 +50,75 @@ * @{ */
//--------------------------------------------------------------------+
-// APPLICATION API (Multiple Interfaces)
+// Application API (Multiple Interfaces)
// CFG_TUD_MIDI > 1
//--------------------------------------------------------------------+
-bool tud_midi_n_connected (uint8_t itf);
+bool tud_midi_n_mounted (uint8_t itf);
+uint32_t tud_midi_n_available (uint8_t itf, uint8_t jack_id);
+uint32_t tud_midi_n_read (uint8_t itf, uint8_t jack_id, void* buffer, uint32_t bufsize);
+void tud_midi_n_read_flush (uint8_t itf, uint8_t jack_id);
+uint32_t tud_midi_n_write (uint8_t itf, uint8_t jack_id, uint8_t const* buffer, uint32_t bufsize);
-uint32_t tud_midi_n_available (uint8_t itf, uint8_t jack_id);
-char tud_midi_n_read_char (uint8_t itf, uint8_t jack_id);
-uint32_t tud_midi_n_read (uint8_t itf, uint8_t jack_id, void* buffer, uint32_t bufsize);
-void tud_midi_n_read_flush (uint8_t itf, uint8_t jack_id);
-char tud_midi_n_peek (uint8_t itf, uint8_t jack_id, int pos);
-
-uint32_t tud_midi_n_write_char (uint8_t itf, char ch);
-uint32_t tud_midi_n_write (uint8_t itf, uint8_t jack_id, uint8_t const* buffer, uint32_t bufsize);
-bool tud_midi_n_write_flush (uint8_t itf);
+static inline
+uint32_t tud_midi_n_write24 (uint8_t itf, uint8_t jack_id, uint8_t b1, uint8_t b2, uint8_t b3);
//--------------------------------------------------------------------+
-// APPLICATION API (Interface0)
+// Application API (Interface0)
//--------------------------------------------------------------------+
-static inline bool tud_midi_connected (void) { return tud_midi_n_connected(0); }
-
-static inline uint32_t tud_midi_available (void) { return tud_midi_n_available(0, 0); }
-static inline char tud_midi_read_char (void) { return tud_midi_n_read_char(0, 0); }
-static inline uint32_t tud_midi_read (void* buffer, uint32_t bufsize) { return tud_midi_n_read(0, 0, buffer, bufsize); }
-static inline void tud_midi_read_flush (void) { tud_midi_n_read_flush(0, 0); }
-static inline char tud_midi_peek (int pos) { return tud_midi_n_peek(0, 0, pos); }
-
-static inline uint32_t tud_midi_write_char (char ch) { return tud_midi_n_write_char(0, ch); }
-static inline uint32_t tud_midi_write (uint8_t jack_id, void const* buffer, uint32_t bufsize) { return tud_midi_n_write(0, jack_id, buffer, bufsize); }
-static inline bool tud_midi_write_flush (void) { return tud_midi_n_write_flush(0); }
+static inline bool tud_midi_mounted (void);
+static inline uint32_t tud_midi_available (void);
+static inline uint32_t tud_midi_read (void* buffer, uint32_t bufsize);
+static inline void tud_midi_read_flush (void);
+static inline uint32_t tud_midi_write (uint8_t jack_id, uint8_t const* buffer, uint32_t bufsize);
+static inline uint32_t tudi_midi_write24 (uint8_t jack_id, uint8_t b1, uint8_t b2, uint8_t b3);
//--------------------------------------------------------------------+
-// APPLICATION CALLBACK API (WEAK is optional)
+// Application Callback API (weak is optional)
//--------------------------------------------------------------------+
TU_ATTR_WEAK void tud_midi_rx_cb(uint8_t itf);
//--------------------------------------------------------------------+
+// Inline Functions
+//--------------------------------------------------------------------+
+
+static inline uint32_t tud_midi_n_write24 (uint8_t itf, uint8_t jack_id, uint8_t b1, uint8_t b2, uint8_t b3)
+{
+ uint8_t msg[3] = { b1, b2, b3 };
+ return tud_midi_n_write(itf, jack_id, msg, 3);
+}
+
+static inline bool tud_midi_mounted (void)
+{
+ return tud_midi_n_mounted(0);
+}
+
+static inline uint32_t tud_midi_available (void)
+{
+ return tud_midi_n_available(0, 0);
+}
+
+static inline uint32_t tud_midi_read (void* buffer, uint32_t bufsize)
+{
+ return tud_midi_n_read(0, 0, buffer, bufsize);
+}
+
+static inline void tud_midi_read_flush (void)
+{
+ tud_midi_n_read_flush(0, 0);
+}
+
+static inline uint32_t tud_midi_write (uint8_t jack_id, uint8_t const* buffer, uint32_t bufsize)
+{
+ return tud_midi_n_write(0, jack_id, buffer, bufsize);
+}
+
+static inline uint32_t tudi_midi_write24 (uint8_t jack_id, uint8_t b1, uint8_t b2, uint8_t b3)
+{
+ uint8_t msg[3] = { b1, b2, b3 };
+ return tud_midi_write(jack_id, msg, 3);
+}
+
+//--------------------------------------------------------------------+
// Internal Class Driver API
//--------------------------------------------------------------------+
void midid_init (void);
|
