Merge remote-tracking branch 'upstream/master' into edpt_ISO_xfer
This commit is contained in:
@@ -95,7 +95,8 @@ static void _prep_out_transaction (cdcd_interface_t* p_cdc)
|
||||
// fifo can be changed before endpoint is claimed
|
||||
available = tu_fifo_remaining(&p_cdc->rx_ff);
|
||||
|
||||
if ( available >= sizeof(p_cdc->epout_buf) ) {
|
||||
if ( available >= sizeof(p_cdc->epout_buf) )
|
||||
{
|
||||
usbd_edpt_xfer(rhport, p_cdc->ep_out, p_cdc->epout_buf, sizeof(p_cdc->epout_buf));
|
||||
}else
|
||||
{
|
||||
@@ -432,25 +433,27 @@ bool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
|
||||
// Received new data
|
||||
if ( ep_addr == p_cdc->ep_out )
|
||||
{
|
||||
// TODO search for wanted char first for better performance
|
||||
for(uint32_t i=0; i<xferred_bytes; i++)
|
||||
tu_fifo_write_n(&p_cdc->rx_ff, &p_cdc->epout_buf, xferred_bytes);
|
||||
|
||||
// Check for wanted char and invoke callback if needed
|
||||
if ( tud_cdc_rx_wanted_cb && (((signed char) p_cdc->wanted_char) != -1) )
|
||||
{
|
||||
tu_fifo_write(&p_cdc->rx_ff, &p_cdc->epout_buf[i]);
|
||||
|
||||
// Check for wanted char and invoke callback if needed
|
||||
if ( tud_cdc_rx_wanted_cb && ( ((signed char) p_cdc->wanted_char) != -1 ) && ( p_cdc->wanted_char == p_cdc->epout_buf[i] ) )
|
||||
for ( uint32_t i = 0; i < xferred_bytes; i++ )
|
||||
{
|
||||
tud_cdc_rx_wanted_cb(itf, p_cdc->wanted_char);
|
||||
if ( (p_cdc->wanted_char == p_cdc->epout_buf[i]) && !tu_fifo_empty(&p_cdc->rx_ff) )
|
||||
{
|
||||
tud_cdc_rx_wanted_cb(itf, p_cdc->wanted_char);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// invoke receive callback (if there is still data)
|
||||
if (tud_cdc_rx_cb && tu_fifo_count(&p_cdc->rx_ff) ) tud_cdc_rx_cb(itf);
|
||||
|
||||
if (tud_cdc_rx_cb && !tu_fifo_empty(&p_cdc->rx_ff) ) tud_cdc_rx_cb(itf);
|
||||
|
||||
// prepare for OUT transaction
|
||||
_prep_out_transaction(p_cdc);
|
||||
}
|
||||
|
||||
|
||||
// Data sent to host, we continue to fetch from tx fifo to send.
|
||||
// Note: This will cause incorrect baudrate set in line coding.
|
||||
// Though maybe the baudrate is not really important !!!
|
||||
|
||||
@@ -303,118 +303,177 @@ typedef enum
|
||||
//--------------------------------------------------------------------+
|
||||
// HID KEYCODE
|
||||
//--------------------------------------------------------------------+
|
||||
#define HID_KEY_NONE 0x00
|
||||
#define HID_KEY_A 0x04
|
||||
#define HID_KEY_B 0x05
|
||||
#define HID_KEY_C 0x06
|
||||
#define HID_KEY_D 0x07
|
||||
#define HID_KEY_E 0x08
|
||||
#define HID_KEY_F 0x09
|
||||
#define HID_KEY_G 0x0A
|
||||
#define HID_KEY_H 0x0B
|
||||
#define HID_KEY_I 0x0C
|
||||
#define HID_KEY_J 0x0D
|
||||
#define HID_KEY_K 0x0E
|
||||
#define HID_KEY_L 0x0F
|
||||
#define HID_KEY_M 0x10
|
||||
#define HID_KEY_N 0x11
|
||||
#define HID_KEY_O 0x12
|
||||
#define HID_KEY_P 0x13
|
||||
#define HID_KEY_Q 0x14
|
||||
#define HID_KEY_R 0x15
|
||||
#define HID_KEY_S 0x16
|
||||
#define HID_KEY_T 0x17
|
||||
#define HID_KEY_U 0x18
|
||||
#define HID_KEY_V 0x19
|
||||
#define HID_KEY_W 0x1A
|
||||
#define HID_KEY_X 0x1B
|
||||
#define HID_KEY_Y 0x1C
|
||||
#define HID_KEY_Z 0x1D
|
||||
#define HID_KEY_1 0x1E
|
||||
#define HID_KEY_2 0x1F
|
||||
#define HID_KEY_3 0x20
|
||||
#define HID_KEY_4 0x21
|
||||
#define HID_KEY_5 0x22
|
||||
#define HID_KEY_6 0x23
|
||||
#define HID_KEY_7 0x24
|
||||
#define HID_KEY_8 0x25
|
||||
#define HID_KEY_9 0x26
|
||||
#define HID_KEY_0 0x27
|
||||
#define HID_KEY_RETURN 0x28
|
||||
#define HID_KEY_ESCAPE 0x29
|
||||
#define HID_KEY_BACKSPACE 0x2A
|
||||
#define HID_KEY_TAB 0x2B
|
||||
#define HID_KEY_SPACE 0x2C
|
||||
#define HID_KEY_MINUS 0x2D
|
||||
#define HID_KEY_EQUAL 0x2E
|
||||
#define HID_KEY_BRACKET_LEFT 0x2F
|
||||
#define HID_KEY_BRACKET_RIGHT 0x30
|
||||
#define HID_KEY_BACKSLASH 0x31
|
||||
#define HID_KEY_EUROPE_1 0x32
|
||||
#define HID_KEY_SEMICOLON 0x33
|
||||
#define HID_KEY_APOSTROPHE 0x34
|
||||
#define HID_KEY_GRAVE 0x35
|
||||
#define HID_KEY_COMMA 0x36
|
||||
#define HID_KEY_PERIOD 0x37
|
||||
#define HID_KEY_SLASH 0x38
|
||||
#define HID_KEY_CAPS_LOCK 0x39
|
||||
#define HID_KEY_F1 0x3A
|
||||
#define HID_KEY_F2 0x3B
|
||||
#define HID_KEY_F3 0x3C
|
||||
#define HID_KEY_F4 0x3D
|
||||
#define HID_KEY_F5 0x3E
|
||||
#define HID_KEY_F6 0x3F
|
||||
#define HID_KEY_F7 0x40
|
||||
#define HID_KEY_F8 0x41
|
||||
#define HID_KEY_F9 0x42
|
||||
#define HID_KEY_F10 0x43
|
||||
#define HID_KEY_F11 0x44
|
||||
#define HID_KEY_F12 0x45
|
||||
#define HID_KEY_PRINT_SCREEN 0x46
|
||||
#define HID_KEY_SCROLL_LOCK 0x47
|
||||
#define HID_KEY_PAUSE 0x48
|
||||
#define HID_KEY_INSERT 0x49
|
||||
#define HID_KEY_HOME 0x4A
|
||||
#define HID_KEY_PAGE_UP 0x4B
|
||||
#define HID_KEY_DELETE 0x4C
|
||||
#define HID_KEY_END 0x4D
|
||||
#define HID_KEY_PAGE_DOWN 0x4E
|
||||
#define HID_KEY_ARROW_RIGHT 0x4F
|
||||
#define HID_KEY_ARROW_LEFT 0x50
|
||||
#define HID_KEY_ARROW_DOWN 0x51
|
||||
#define HID_KEY_ARROW_UP 0x52
|
||||
#define HID_KEY_NUM_LOCK 0x53
|
||||
#define HID_KEY_KEYPAD_DIVIDE 0x54
|
||||
#define HID_KEY_KEYPAD_MULTIPLY 0x55
|
||||
#define HID_KEY_KEYPAD_SUBTRACT 0x56
|
||||
#define HID_KEY_KEYPAD_ADD 0x57
|
||||
#define HID_KEY_KEYPAD_ENTER 0x58
|
||||
#define HID_KEY_KEYPAD_1 0x59
|
||||
#define HID_KEY_KEYPAD_2 0x5A
|
||||
#define HID_KEY_KEYPAD_3 0x5B
|
||||
#define HID_KEY_KEYPAD_4 0x5C
|
||||
#define HID_KEY_KEYPAD_5 0x5D
|
||||
#define HID_KEY_KEYPAD_6 0x5E
|
||||
#define HID_KEY_KEYPAD_7 0x5F
|
||||
#define HID_KEY_KEYPAD_8 0x60
|
||||
#define HID_KEY_KEYPAD_9 0x61
|
||||
#define HID_KEY_KEYPAD_0 0x62
|
||||
#define HID_KEY_KEYPAD_DECIMAL 0x63
|
||||
#define HID_KEY_EUROPE_2 0x64
|
||||
#define HID_KEY_APPLICATION 0x65
|
||||
#define HID_KEY_POWER 0x66
|
||||
#define HID_KEY_KEYPAD_EQUAL 0x67
|
||||
#define HID_KEY_F13 0x68
|
||||
#define HID_KEY_F14 0x69
|
||||
#define HID_KEY_F15 0x6A
|
||||
#define HID_KEY_CONTROL_LEFT 0xE0
|
||||
#define HID_KEY_SHIFT_LEFT 0xE1
|
||||
#define HID_KEY_ALT_LEFT 0xE2
|
||||
#define HID_KEY_GUI_LEFT 0xE3
|
||||
#define HID_KEY_CONTROL_RIGHT 0xE4
|
||||
#define HID_KEY_SHIFT_RIGHT 0xE5
|
||||
#define HID_KEY_ALT_RIGHT 0xE6
|
||||
#define HID_KEY_GUI_RIGHT 0xE7
|
||||
#define HID_KEY_NONE 0x00
|
||||
#define HID_KEY_A 0x04
|
||||
#define HID_KEY_B 0x05
|
||||
#define HID_KEY_C 0x06
|
||||
#define HID_KEY_D 0x07
|
||||
#define HID_KEY_E 0x08
|
||||
#define HID_KEY_F 0x09
|
||||
#define HID_KEY_G 0x0A
|
||||
#define HID_KEY_H 0x0B
|
||||
#define HID_KEY_I 0x0C
|
||||
#define HID_KEY_J 0x0D
|
||||
#define HID_KEY_K 0x0E
|
||||
#define HID_KEY_L 0x0F
|
||||
#define HID_KEY_M 0x10
|
||||
#define HID_KEY_N 0x11
|
||||
#define HID_KEY_O 0x12
|
||||
#define HID_KEY_P 0x13
|
||||
#define HID_KEY_Q 0x14
|
||||
#define HID_KEY_R 0x15
|
||||
#define HID_KEY_S 0x16
|
||||
#define HID_KEY_T 0x17
|
||||
#define HID_KEY_U 0x18
|
||||
#define HID_KEY_V 0x19
|
||||
#define HID_KEY_W 0x1A
|
||||
#define HID_KEY_X 0x1B
|
||||
#define HID_KEY_Y 0x1C
|
||||
#define HID_KEY_Z 0x1D
|
||||
#define HID_KEY_1 0x1E
|
||||
#define HID_KEY_2 0x1F
|
||||
#define HID_KEY_3 0x20
|
||||
#define HID_KEY_4 0x21
|
||||
#define HID_KEY_5 0x22
|
||||
#define HID_KEY_6 0x23
|
||||
#define HID_KEY_7 0x24
|
||||
#define HID_KEY_8 0x25
|
||||
#define HID_KEY_9 0x26
|
||||
#define HID_KEY_0 0x27
|
||||
#define HID_KEY_ENTER 0x28
|
||||
#define HID_KEY_ESCAPE 0x29
|
||||
#define HID_KEY_BACKSPACE 0x2A
|
||||
#define HID_KEY_TAB 0x2B
|
||||
#define HID_KEY_SPACE 0x2C
|
||||
#define HID_KEY_MINUS 0x2D
|
||||
#define HID_KEY_EQUAL 0x2E
|
||||
#define HID_KEY_BRACKET_LEFT 0x2F
|
||||
#define HID_KEY_BRACKET_RIGHT 0x30
|
||||
#define HID_KEY_BACKSLASH 0x31
|
||||
#define HID_KEY_EUROPE_1 0x32
|
||||
#define HID_KEY_SEMICOLON 0x33
|
||||
#define HID_KEY_APOSTROPHE 0x34
|
||||
#define HID_KEY_GRAVE 0x35
|
||||
#define HID_KEY_COMMA 0x36
|
||||
#define HID_KEY_PERIOD 0x37
|
||||
#define HID_KEY_SLASH 0x38
|
||||
#define HID_KEY_CAPS_LOCK 0x39
|
||||
#define HID_KEY_F1 0x3A
|
||||
#define HID_KEY_F2 0x3B
|
||||
#define HID_KEY_F3 0x3C
|
||||
#define HID_KEY_F4 0x3D
|
||||
#define HID_KEY_F5 0x3E
|
||||
#define HID_KEY_F6 0x3F
|
||||
#define HID_KEY_F7 0x40
|
||||
#define HID_KEY_F8 0x41
|
||||
#define HID_KEY_F9 0x42
|
||||
#define HID_KEY_F10 0x43
|
||||
#define HID_KEY_F11 0x44
|
||||
#define HID_KEY_F12 0x45
|
||||
#define HID_KEY_PRINT_SCREEN 0x46
|
||||
#define HID_KEY_SCROLL_LOCK 0x47
|
||||
#define HID_KEY_PAUSE 0x48
|
||||
#define HID_KEY_INSERT 0x49
|
||||
#define HID_KEY_HOME 0x4A
|
||||
#define HID_KEY_PAGE_UP 0x4B
|
||||
#define HID_KEY_DELETE 0x4C
|
||||
#define HID_KEY_END 0x4D
|
||||
#define HID_KEY_PAGE_DOWN 0x4E
|
||||
#define HID_KEY_ARROW_RIGHT 0x4F
|
||||
#define HID_KEY_ARROW_LEFT 0x50
|
||||
#define HID_KEY_ARROW_DOWN 0x51
|
||||
#define HID_KEY_ARROW_UP 0x52
|
||||
#define HID_KEY_NUM_LOCK 0x53
|
||||
#define HID_KEY_KEYPAD_DIVIDE 0x54
|
||||
#define HID_KEY_KEYPAD_MULTIPLY 0x55
|
||||
#define HID_KEY_KEYPAD_SUBTRACT 0x56
|
||||
#define HID_KEY_KEYPAD_ADD 0x57
|
||||
#define HID_KEY_KEYPAD_ENTER 0x58
|
||||
#define HID_KEY_KEYPAD_1 0x59
|
||||
#define HID_KEY_KEYPAD_2 0x5A
|
||||
#define HID_KEY_KEYPAD_3 0x5B
|
||||
#define HID_KEY_KEYPAD_4 0x5C
|
||||
#define HID_KEY_KEYPAD_5 0x5D
|
||||
#define HID_KEY_KEYPAD_6 0x5E
|
||||
#define HID_KEY_KEYPAD_7 0x5F
|
||||
#define HID_KEY_KEYPAD_8 0x60
|
||||
#define HID_KEY_KEYPAD_9 0x61
|
||||
#define HID_KEY_KEYPAD_0 0x62
|
||||
#define HID_KEY_KEYPAD_DECIMAL 0x63
|
||||
#define HID_KEY_EUROPE_2 0x64
|
||||
#define HID_KEY_APPLICATION 0x65
|
||||
#define HID_KEY_POWER 0x66
|
||||
#define HID_KEY_KEYPAD_EQUAL 0x67
|
||||
#define HID_KEY_F13 0x68
|
||||
#define HID_KEY_F14 0x69
|
||||
#define HID_KEY_F15 0x6A
|
||||
#define HID_KEY_F16 0x6B
|
||||
#define HID_KEY_F17 0x6C
|
||||
#define HID_KEY_F18 0x6D
|
||||
#define HID_KEY_F19 0x6E
|
||||
#define HID_KEY_F20 0x6F
|
||||
#define HID_KEY_F21 0x70
|
||||
#define HID_KEY_F22 0x71
|
||||
#define HID_KEY_F23 0x72
|
||||
#define HID_KEY_F24 0x73
|
||||
#define HID_KEY_EXECUTE 0x74
|
||||
#define HID_KEY_HELP 0x75
|
||||
#define HID_KEY_MENU 0x76
|
||||
#define HID_KEY_SELECT 0x77
|
||||
#define HID_KEY_STOP 0x78
|
||||
#define HID_KEY_AGAIN 0x79
|
||||
#define HID_KEY_UNDO 0x7A
|
||||
#define HID_KEY_CUT 0x7B
|
||||
#define HID_KEY_COPY 0x7C
|
||||
#define HID_KEY_PASTE 0x7D
|
||||
#define HID_KEY_FIND 0x7E
|
||||
#define HID_KEY_MUTE 0x7F
|
||||
#define HID_KEY_VOLUME_UP 0x80
|
||||
#define HID_KEY_VOLUME_DOWN 0x81
|
||||
#define HID_KEY_LOCKING_CAPS_LOCK 0x82
|
||||
#define HID_KEY_LOCKING_NUM_LOCK 0x83
|
||||
#define HID_KEY_LOCKING_SCROLL_LOCK 0x84
|
||||
#define HID_KEY_KEYPAD_COMMA 0x85
|
||||
#define HID_KEY_KEYPAD_EQUAL_SIGN 0x86
|
||||
#define HID_KEY_KANJI1 0x87
|
||||
#define HID_KEY_KANJI2 0x88
|
||||
#define HID_KEY_KANJI3 0x89
|
||||
#define HID_KEY_KANJI4 0x8A
|
||||
#define HID_KEY_KANJI5 0x8B
|
||||
#define HID_KEY_KANJI6 0x8C
|
||||
#define HID_KEY_KANJI7 0x8D
|
||||
#define HID_KEY_KANJI8 0x8E
|
||||
#define HID_KEY_KANJI9 0x8F
|
||||
#define HID_KEY_LANG1 0x90
|
||||
#define HID_KEY_LANG2 0x91
|
||||
#define HID_KEY_LANG3 0x92
|
||||
#define HID_KEY_LANG4 0x93
|
||||
#define HID_KEY_LANG5 0x94
|
||||
#define HID_KEY_LANG6 0x95
|
||||
#define HID_KEY_LANG7 0x96
|
||||
#define HID_KEY_LANG8 0x97
|
||||
#define HID_KEY_LANG9 0x98
|
||||
#define HID_KEY_ALTERNATE_ERASE 0x99
|
||||
#define HID_KEY_SYSREQ_ATTENTION 0x9A
|
||||
#define HID_KEY_CANCEL 0x9B
|
||||
#define HID_KEY_CLEAR 0x9C
|
||||
#define HID_KEY_PRIOR 0x9D
|
||||
#define HID_KEY_RETURN 0x9E
|
||||
#define HID_KEY_SEPARATOR 0x9F
|
||||
#define HID_KEY_OUT 0xA0
|
||||
#define HID_KEY_OPER 0xA1
|
||||
#define HID_KEY_CLEAR_AGAIN 0xA2
|
||||
#define HID_KEY_CRSEL_PROPS 0xA3
|
||||
#define HID_KEY_EXSEL 0xA4
|
||||
// RESERVED 0xA5-DF
|
||||
#define HID_KEY_CONTROL_LEFT 0xE0
|
||||
#define HID_KEY_SHIFT_LEFT 0xE1
|
||||
#define HID_KEY_ALT_LEFT 0xE2
|
||||
#define HID_KEY_GUI_LEFT 0xE3
|
||||
#define HID_KEY_CONTROL_RIGHT 0xE4
|
||||
#define HID_KEY_SHIFT_RIGHT 0xE5
|
||||
#define HID_KEY_ALT_RIGHT 0xE6
|
||||
#define HID_KEY_GUI_RIGHT 0xE7
|
||||
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
|
||||
@@ -61,6 +61,51 @@ typedef enum
|
||||
MIDI_JACK_EXTERNAL = 0x02
|
||||
} midi_jack_type_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
MIDI_CIN_MISC = 0,
|
||||
MIDI_CIN_CABLE_EVENT = 1,
|
||||
MIDI_CIN_SYSCOM_2BYTE = 2, // 2 byte system common message e.g MTC, SongSelect
|
||||
MIDI_CIN_SYSCOM_3BYTE = 3, // 3 byte system common message e.g SPP
|
||||
MIDI_CIN_SYSEX_START = 4, // SysEx starts or continue
|
||||
MIDI_CIN_SYSEX_END_1BYTE = 5, // SysEx ends with 1 data, or 1 byte system common message
|
||||
MIDI_CIN_SYSEX_END_2BYTE = 6, // SysEx ends with 2 data
|
||||
MIDI_CIN_SYSEX_END_3BYTE = 7, // SysEx ends with 3 data
|
||||
MIDI_CIN_NOTE_ON = 8,
|
||||
MIDI_CIN_NOTE_OFF = 9,
|
||||
MIDI_CIN_POLY_KEYPRESS = 10,
|
||||
MIDI_CIN_CONTROL_CHANGE = 11,
|
||||
MIDI_CIN_PROGRAM_CHANGE = 12,
|
||||
MIDI_CIN_CHANNEL_PRESSURE = 13,
|
||||
MIDI_CIN_PITCH_BEND_CHANGE = 14,
|
||||
MIDI_CIN_1BYTE_DATA = 15
|
||||
} midi_code_index_number_t;
|
||||
|
||||
// MIDI 1.0 status byte
|
||||
enum
|
||||
{
|
||||
//------------- System Exclusive -------------//
|
||||
MIDI_STATUS_SYSEX_START = 0xF0,
|
||||
MIDI_STATUS_SYSEX_END = 0xF7,
|
||||
|
||||
//------------- System Common -------------//
|
||||
MIDI_STATUS_SYSCOM_TIME_CODE_QUARTER_FRAME = 0xF1,
|
||||
MIDI_STATUS_SYSCOM_SONG_POSITION_POINTER = 0xF2,
|
||||
MIDI_STATUS_SYSCOM_SONG_SELECT = 0xF3,
|
||||
// F4, F5 is undefined
|
||||
MIDI_STATUS_SYSCOM_TUNE_REQUEST = 0xF6,
|
||||
|
||||
//------------- System RealTime -------------//
|
||||
MIDI_STATUS_SYSREAL_TIMING_CLOCK = 0xF8,
|
||||
// 0xF9 is undefined
|
||||
MIDI_STATUS_SYSREAL_START = 0xFA,
|
||||
MIDI_STATUS_SYSREAL_CONTINUE = 0xFB,
|
||||
MIDI_STATUS_SYSREAL_STOP = 0xFC,
|
||||
// 0xFD is undefined
|
||||
MIDI_STATUS_SYSREAL_ACTIVE_SENSING = 0xFE,
|
||||
MIDI_STATUS_SYSREAL_SYSTEM_RESET = 0xFF,
|
||||
};
|
||||
|
||||
/// MIDI Interface Header Descriptor
|
||||
typedef struct TU_ATTR_PACKED
|
||||
{
|
||||
|
||||
@@ -38,12 +38,26 @@
|
||||
//--------------------------------------------------------------------+
|
||||
// MACRO CONSTANT TYPEDEF
|
||||
//--------------------------------------------------------------------+
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t buffer[4];
|
||||
uint8_t index;
|
||||
uint8_t total;
|
||||
}midid_stream_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t itf_num;
|
||||
uint8_t ep_in;
|
||||
uint8_t ep_out;
|
||||
|
||||
// For Stream read()/write() API
|
||||
// Messages are always 4 bytes long, queue them for reading and writing so the
|
||||
// callers can use the Stream interface with single-byte read/write calls.
|
||||
midid_stream_t stream_write;
|
||||
midid_stream_t stream_read;
|
||||
|
||||
/*------------- From this point, data is not cleared by bus reset -------------*/
|
||||
// FIFO
|
||||
tu_fifo_t rx_ff;
|
||||
@@ -56,16 +70,6 @@ typedef struct
|
||||
osal_mutex_def_t tx_ff_mutex;
|
||||
#endif
|
||||
|
||||
// Messages are always 4 bytes long, queue them for reading and writing so the
|
||||
// callers can use the Stream interface with single-byte read/write calls.
|
||||
uint8_t write_buffer[4];
|
||||
uint8_t write_buffer_length;
|
||||
uint8_t write_target_length;
|
||||
|
||||
uint8_t read_buffer[4];
|
||||
uint8_t read_buffer_length;
|
||||
uint8_t read_target_length;
|
||||
|
||||
// Endpoint Transfer buffer
|
||||
CFG_TUSB_MEM_ALIGN uint8_t epout_buf[CFG_TUD_MIDI_EP_BUFSIZE];
|
||||
CFG_TUSB_MEM_ALIGN uint8_t epin_buf[CFG_TUD_MIDI_EP_BUFSIZE];
|
||||
@@ -120,53 +124,77 @@ uint32_t tud_midi_n_available(uint8_t itf, uint8_t cable_num)
|
||||
return tu_fifo_count(&_midid_itf[itf].rx_ff);
|
||||
}
|
||||
|
||||
uint32_t tud_midi_n_read(uint8_t itf, uint8_t cable_num, void* buffer, uint32_t bufsize)
|
||||
uint32_t tud_midi_n_stream_read(uint8_t itf, uint8_t cable_num, void* buffer, uint32_t bufsize)
|
||||
{
|
||||
(void) cable_num;
|
||||
TU_VERIFY(bufsize, 0);
|
||||
|
||||
uint8_t* buf8 = (uint8_t*) buffer;
|
||||
|
||||
midid_interface_t* midi = &_midid_itf[itf];
|
||||
midid_stream_t* stream = &midi->stream_read;
|
||||
|
||||
// Fill empty buffer
|
||||
if (midi->read_buffer_length == 0) {
|
||||
if (!tud_midi_n_receive(itf, midi->read_buffer)) return 0;
|
||||
uint32_t total_read = 0;
|
||||
while( bufsize )
|
||||
{
|
||||
// Get new packet from fifo, then set packet expected bytes
|
||||
if ( stream->total == 0 )
|
||||
{
|
||||
// return if there is no more data from fifo
|
||||
if ( !tud_midi_n_packet_read(itf, stream->buffer) ) return total_read;
|
||||
|
||||
uint8_t code_index = midi->read_buffer[0] & 0x0f;
|
||||
// We always copy over the first byte.
|
||||
uint8_t count = 1;
|
||||
// Ignore subsequent bytes based on the code.
|
||||
if (code_index != 0x5 && code_index != 0xf) {
|
||||
count = 2;
|
||||
if (code_index != 0x2 && code_index != 0x6 && code_index != 0xc && code_index != 0xd) {
|
||||
count = 3;
|
||||
uint8_t const code_index = stream->buffer[0] & 0x0f;
|
||||
|
||||
// MIDI 1.0 Table 4-1: Code Index Number Classifications
|
||||
switch(code_index)
|
||||
{
|
||||
case MIDI_CIN_MISC:
|
||||
case MIDI_CIN_CABLE_EVENT:
|
||||
// These are reserved and unused, possibly issue somewhere, skip this packet
|
||||
return 0;
|
||||
break;
|
||||
|
||||
case MIDI_CIN_SYSEX_END_1BYTE:
|
||||
case MIDI_CIN_1BYTE_DATA:
|
||||
stream->total = 1;
|
||||
break;
|
||||
|
||||
case MIDI_CIN_SYSCOM_2BYTE :
|
||||
case MIDI_CIN_SYSEX_END_2BYTE :
|
||||
case MIDI_CIN_PROGRAM_CHANGE :
|
||||
case MIDI_CIN_CHANNEL_PRESSURE :
|
||||
stream->total = 2;
|
||||
break;
|
||||
|
||||
default:
|
||||
stream->total = 3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
midi->read_buffer_length = count;
|
||||
// Copy data up to bufsize
|
||||
uint32_t const count = tu_min32(stream->total - stream->index, bufsize);
|
||||
|
||||
// Skip the header (1st byte) in the buffer
|
||||
memcpy(buf8, stream->buffer + 1 + stream->index, count);
|
||||
|
||||
total_read += count;
|
||||
stream->index += count;
|
||||
buf8 += count;
|
||||
bufsize -= count;
|
||||
|
||||
// complete current event packet, reset stream
|
||||
if ( stream->total == stream->index )
|
||||
{
|
||||
stream->index = 0;
|
||||
stream->total = 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t n = midi->read_buffer_length - midi->read_target_length;
|
||||
if (bufsize < n) n = bufsize;
|
||||
|
||||
// Skip the header in the buffer
|
||||
memcpy(buffer, midi->read_buffer + 1 + midi->read_target_length, n);
|
||||
midi->read_target_length += n;
|
||||
|
||||
if (midi->read_target_length == midi->read_buffer_length) {
|
||||
midi->read_buffer_length = 0;
|
||||
midi->read_target_length = 0;
|
||||
}
|
||||
|
||||
return n;
|
||||
return total_read;
|
||||
}
|
||||
|
||||
void tud_midi_n_read_flush (uint8_t itf, uint8_t cable_num)
|
||||
{
|
||||
(void) cable_num;
|
||||
midid_interface_t* p_midi = &_midid_itf[itf];
|
||||
tu_fifo_clear(&p_midi->rx_ff);
|
||||
_prep_out_transaction(p_midi);
|
||||
}
|
||||
|
||||
bool tud_midi_n_receive (uint8_t itf, uint8_t packet[4])
|
||||
bool tud_midi_n_packet_read (uint8_t itf, uint8_t packet[4])
|
||||
{
|
||||
midid_interface_t* p_midi = &_midid_itf[itf];
|
||||
uint32_t num_read = tu_fifo_read_n(&p_midi->rx_ff, packet, 4);
|
||||
@@ -174,10 +202,6 @@ bool tud_midi_n_receive (uint8_t itf, uint8_t packet[4])
|
||||
return (num_read == 4);
|
||||
}
|
||||
|
||||
void midi_rx_done_cb(midid_interface_t* midi, uint8_t const* buffer, uint32_t bufsize) {
|
||||
tu_fifo_write_n(&midi->rx_ff, buffer, bufsize);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// WRITE API
|
||||
//--------------------------------------------------------------------+
|
||||
@@ -193,7 +217,8 @@ static uint32_t write_flush(midid_interface_t* midi)
|
||||
TU_VERIFY( usbd_edpt_claim(rhport, midi->ep_in), 0 );
|
||||
|
||||
uint16_t count = tu_fifo_read_n(&midi->tx_ff, midi->epin_buf, CFG_TUD_MIDI_EP_BUFSIZE);
|
||||
if (count > 0)
|
||||
|
||||
if (count)
|
||||
{
|
||||
TU_ASSERT( usbd_edpt_xfer(rhport, midi->ep_in, midi->epin_buf, count), 0 );
|
||||
return count;
|
||||
@@ -205,88 +230,131 @@ static uint32_t write_flush(midid_interface_t* midi)
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t tud_midi_n_write(uint8_t itf, uint8_t cable_num, uint8_t const* buffer, uint32_t bufsize)
|
||||
uint32_t tud_midi_n_stream_write(uint8_t itf, uint8_t cable_num, uint8_t const* buffer, uint32_t bufsize)
|
||||
{
|
||||
midid_interface_t* midi = &_midid_itf[itf];
|
||||
if (midi->itf_num == 0) {
|
||||
return 0;
|
||||
}
|
||||
TU_VERIFY(midi->itf_num, 0);
|
||||
|
||||
midid_stream_t* stream = &midi->stream_write;
|
||||
|
||||
uint32_t total_written = 0;
|
||||
uint32_t i = 0;
|
||||
while (i < bufsize) {
|
||||
uint8_t data = buffer[i];
|
||||
if (midi->write_buffer_length == 0) {
|
||||
uint8_t msg = data >> 4;
|
||||
midi->write_buffer[1] = data;
|
||||
midi->write_buffer_length = 2;
|
||||
// Check to see if we're still in a SysEx transmit.
|
||||
if (midi->write_buffer[0] == 0x4) {
|
||||
if (data == 0xf7) {
|
||||
midi->write_buffer[0] = 0x5;
|
||||
midi->write_target_length = 2;
|
||||
} else {
|
||||
midi->write_target_length = 4;
|
||||
}
|
||||
} else if ((msg >= 0x8 && msg <= 0xB) || msg == 0xE) {
|
||||
midi->write_buffer[0] = cable_num << 4 | msg;
|
||||
midi->write_target_length = 4;
|
||||
} else if (msg == 0xf) {
|
||||
if (data == 0xf0) {
|
||||
midi->write_buffer[0] = 0x4;
|
||||
midi->write_target_length = 4;
|
||||
} else if (data == 0xf1 || data == 0xf3) {
|
||||
midi->write_buffer[0] = 0x2;
|
||||
midi->write_target_length = 3;
|
||||
} else if (data == 0xf2) {
|
||||
midi->write_buffer[0] = 0x3;
|
||||
midi->write_target_length = 4;
|
||||
} else {
|
||||
midi->write_buffer[0] = 0x5;
|
||||
midi->write_target_length = 2;
|
||||
}
|
||||
} else {
|
||||
// Pack individual bytes if we don't support packing them into words.
|
||||
midi->write_buffer[0] = cable_num << 4 | 0xf;
|
||||
midi->write_buffer[2] = 0;
|
||||
midi->write_buffer[3] = 0;
|
||||
midi->write_buffer_length = 2;
|
||||
midi->write_target_length = 2;
|
||||
while ( i < bufsize )
|
||||
{
|
||||
uint8_t const data = buffer[i];
|
||||
|
||||
if ( stream->index == 0 )
|
||||
{
|
||||
// new event packet
|
||||
|
||||
uint8_t const msg = data >> 4;
|
||||
|
||||
stream->index = 2;
|
||||
stream->buffer[1] = data;
|
||||
|
||||
// Check to see if we're still in a SysEx transmit.
|
||||
if ( stream->buffer[0] == MIDI_CIN_SYSEX_START )
|
||||
{
|
||||
if ( data == MIDI_STATUS_SYSEX_END )
|
||||
{
|
||||
stream->buffer[0] = MIDI_CIN_SYSEX_END_1BYTE;
|
||||
stream->total = 2;
|
||||
}
|
||||
} else {
|
||||
midi->write_buffer[midi->write_buffer_length] = data;
|
||||
midi->write_buffer_length += 1;
|
||||
// See if this byte ends a SysEx.
|
||||
if (midi->write_buffer[0] == 0x4 && data == 0xf7) {
|
||||
midi->write_buffer[0] = 0x4 + (midi->write_buffer_length - 1);
|
||||
midi->write_target_length = midi->write_buffer_length;
|
||||
else
|
||||
{
|
||||
stream->total = 4;
|
||||
}
|
||||
}
|
||||
else if ( (msg >= 0x8 && msg <= 0xB) || msg == 0xE )
|
||||
{
|
||||
// Channel Voice Messages
|
||||
stream->buffer[0] = (cable_num << 4) | msg;
|
||||
stream->total = 4;
|
||||
}
|
||||
else if ( msg == 0xf )
|
||||
{
|
||||
// System message
|
||||
if ( data == MIDI_STATUS_SYSEX_START )
|
||||
{
|
||||
stream->buffer[0] = MIDI_CIN_SYSEX_START;
|
||||
stream->total = 4;
|
||||
}
|
||||
else if ( data == MIDI_STATUS_SYSCOM_TIME_CODE_QUARTER_FRAME || data == MIDI_STATUS_SYSCOM_SONG_SELECT )
|
||||
{
|
||||
stream->buffer[0] = MIDI_CIN_SYSCOM_2BYTE;
|
||||
stream->total = 3;
|
||||
}
|
||||
else if ( data == MIDI_STATUS_SYSCOM_SONG_POSITION_POINTER )
|
||||
{
|
||||
stream->buffer[0] = MIDI_CIN_SYSCOM_3BYTE;
|
||||
stream->total = 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
stream->buffer[0] = MIDI_CIN_SYSEX_END_1BYTE;
|
||||
stream->total = 2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Pack individual bytes if we don't support packing them into words.
|
||||
stream->buffer[0] = cable_num << 4 | 0xf;
|
||||
stream->buffer[2] = 0;
|
||||
stream->buffer[3] = 0;
|
||||
stream->index = 2;
|
||||
stream->total = 2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// On-going (buffering) packet
|
||||
|
||||
TU_ASSERT(stream->index < 4, total_written);
|
||||
stream->buffer[stream->index] = data;
|
||||
stream->index++;
|
||||
|
||||
// See if this byte ends a SysEx.
|
||||
if ( stream->buffer[0] == MIDI_CIN_SYSEX_START && data == MIDI_STATUS_SYSEX_END )
|
||||
{
|
||||
stream->buffer[0] = MIDI_CIN_SYSEX_START + (stream->index - 1);
|
||||
stream->total = stream->index;
|
||||
}
|
||||
}
|
||||
|
||||
if (midi->write_buffer_length == midi->write_target_length) {
|
||||
uint16_t written = tu_fifo_write_n(&midi->tx_ff, midi->write_buffer, 4);
|
||||
if (written < 4) {
|
||||
TU_ASSERT( written == 0 );
|
||||
break;
|
||||
}
|
||||
midi->write_buffer_length = 0;
|
||||
// Send out packet
|
||||
if ( stream->index == stream->total )
|
||||
{
|
||||
// zeroes unused bytes
|
||||
for(uint8_t idx = stream->total; idx < 4; idx++) stream->buffer[idx] = 0;
|
||||
|
||||
uint16_t const count = tu_fifo_write_n(&midi->tx_ff, stream->buffer, 4);
|
||||
|
||||
// complete current event packet, reset stream
|
||||
stream->index = stream->total = 0;
|
||||
|
||||
// fifo overflow, here we assume FIFO is multiple of 4 and didn't check remaining before writing
|
||||
if ( count != 4 ) break;
|
||||
|
||||
// updated written if succeeded
|
||||
total_written = i;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
write_flush(midi);
|
||||
|
||||
return i;
|
||||
return total_written;
|
||||
}
|
||||
|
||||
bool tud_midi_n_send (uint8_t itf, uint8_t const packet[4])
|
||||
bool tud_midi_n_packet_write (uint8_t itf, uint8_t const packet[4])
|
||||
{
|
||||
midid_interface_t* midi = &_midid_itf[itf];
|
||||
if (midi->itf_num == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (tu_fifo_remaining(&midi->tx_ff) < 4)
|
||||
return false;
|
||||
if (tu_fifo_remaining(&midi->tx_ff) < 4) return false;
|
||||
|
||||
tu_fifo_write_n(&midi->tx_ff, packet, 4);
|
||||
write_flush(midi);
|
||||
@@ -332,9 +400,9 @@ void midid_reset(uint8_t rhport)
|
||||
uint16_t midid_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t max_len)
|
||||
{
|
||||
// 1st Interface is Audio Control v1
|
||||
TU_VERIFY(TUSB_CLASS_AUDIO == desc_itf->bInterfaceClass &&
|
||||
AUDIO_SUBCLASS_CONTROL == desc_itf->bInterfaceSubClass &&
|
||||
AUDIO_FUNC_PROTOCOL_CODE_UNDEF == desc_itf->bInterfaceProtocol, 0);
|
||||
TU_VERIFY(TUSB_CLASS_AUDIO == desc_itf->bInterfaceClass &&
|
||||
AUDIO_SUBCLASS_CONTROL == desc_itf->bInterfaceSubClass &&
|
||||
AUDIO_FUNC_PROTOCOL_CODE_UNDEF == desc_itf->bInterfaceProtocol, 0);
|
||||
|
||||
uint16_t drv_len = tu_desc_len(desc_itf);
|
||||
uint8_t const * p_desc = tu_desc_next(desc_itf);
|
||||
@@ -350,9 +418,9 @@ uint16_t midid_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint
|
||||
TU_VERIFY(TUSB_DESC_INTERFACE == tu_desc_type(p_desc), 0);
|
||||
tusb_desc_interface_t const * desc_midi = (tusb_desc_interface_t const *) p_desc;
|
||||
|
||||
TU_VERIFY(TUSB_CLASS_AUDIO == desc_midi->bInterfaceClass &&
|
||||
AUDIO_SUBCLASS_MIDI_STREAMING == desc_midi->bInterfaceSubClass &&
|
||||
AUDIO_FUNC_PROTOCOL_CODE_UNDEF == desc_midi->bInterfaceProtocol, 0);
|
||||
TU_VERIFY(TUSB_CLASS_AUDIO == desc_midi->bInterfaceClass &&
|
||||
AUDIO_SUBCLASS_MIDI_STREAMING == desc_midi->bInterfaceSubClass &&
|
||||
AUDIO_FUNC_PROTOCOL_CODE_UNDEF == desc_midi->bInterfaceProtocol, 0);
|
||||
|
||||
// Find available interface
|
||||
midid_interface_t * p_midi = NULL;
|
||||
|
||||
@@ -59,29 +59,64 @@
|
||||
// Application API (Multiple Interfaces)
|
||||
// CFG_TUD_MIDI > 1
|
||||
//--------------------------------------------------------------------+
|
||||
bool tud_midi_n_mounted (uint8_t itf);
|
||||
uint32_t tud_midi_n_available (uint8_t itf, uint8_t cable_num);
|
||||
uint32_t tud_midi_n_read (uint8_t itf, uint8_t cable_num, void* buffer, uint32_t bufsize);
|
||||
void tud_midi_n_read_flush (uint8_t itf, uint8_t cable_num);
|
||||
uint32_t tud_midi_n_write (uint8_t itf, uint8_t cable_num, uint8_t const* buffer, uint32_t bufsize);
|
||||
|
||||
static inline
|
||||
uint32_t tud_midi_n_write24 (uint8_t itf, uint8_t cable_num, uint8_t b1, uint8_t b2, uint8_t b3);
|
||||
// Check if midi interface is mounted
|
||||
bool tud_midi_n_mounted (uint8_t itf);
|
||||
|
||||
bool tud_midi_n_receive (uint8_t itf, uint8_t packet[4]);
|
||||
bool tud_midi_n_send (uint8_t itf, uint8_t const packet[4]);
|
||||
// Get the number of bytes available for reading
|
||||
uint32_t tud_midi_n_available (uint8_t itf, uint8_t cable_num);
|
||||
|
||||
// Read byte stream (legacy)
|
||||
uint32_t tud_midi_n_stream_read (uint8_t itf, uint8_t cable_num, void* buffer, uint32_t bufsize);
|
||||
|
||||
// Write byte Stream (legacy)
|
||||
uint32_t tud_midi_n_stream_write (uint8_t itf, uint8_t cable_num, uint8_t const* buffer, uint32_t bufsize);
|
||||
|
||||
// Read event packet (4 bytes)
|
||||
bool tud_midi_n_packet_read (uint8_t itf, uint8_t packet[4]);
|
||||
|
||||
// Write event packet (4 bytes)
|
||||
bool tud_midi_n_packet_write (uint8_t itf, uint8_t const packet[4]);
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// Application API (Single Interface)
|
||||
//--------------------------------------------------------------------+
|
||||
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 cable_num, uint8_t const* buffer, uint32_t bufsize);
|
||||
static inline uint32_t tud_midi_write24 (uint8_t cable_num, uint8_t b1, uint8_t b2, uint8_t b3);
|
||||
static inline bool tud_midi_receive (uint8_t packet[4]);
|
||||
static inline bool tud_midi_send (uint8_t const packet[4]);
|
||||
static inline bool tud_midi_mounted (void);
|
||||
static inline uint32_t tud_midi_available (void);
|
||||
|
||||
static inline uint32_t tud_midi_stream_read (void* buffer, uint32_t bufsize);
|
||||
static inline uint32_t tud_midi_stream_write (uint8_t cable_num, uint8_t const* buffer, uint32_t bufsize);
|
||||
|
||||
static inline bool tud_midi_packet_read (uint8_t packet[4]);
|
||||
static inline bool tud_midi_packet_write (uint8_t const packet[4]);
|
||||
|
||||
//------------- Deprecated API name -------------//
|
||||
// TODO remove after 0.10.0 release
|
||||
|
||||
TU_ATTR_DEPRECATED("tud_midi_read() is renamed to tud_midi_stream_read()")
|
||||
static inline uint32_t tud_midi_read (void* buffer, uint32_t bufsize)
|
||||
{
|
||||
return tud_midi_stream_read(buffer, bufsize);
|
||||
}
|
||||
|
||||
TU_ATTR_DEPRECATED("tud_midi_write() is renamed to tud_midi_stream_write()")
|
||||
static inline uint32_t tud_midi_write(uint8_t cable_num, uint8_t const* buffer, uint32_t bufsize)
|
||||
{
|
||||
return tud_midi_stream_write(cable_num, buffer, bufsize);
|
||||
}
|
||||
|
||||
|
||||
TU_ATTR_DEPRECATED("tud_midi_send() is renamed to tud_midi_packet_write()")
|
||||
static inline bool tud_midi_send(uint8_t packet[4])
|
||||
{
|
||||
return tud_midi_packet_write(packet);
|
||||
}
|
||||
|
||||
TU_ATTR_DEPRECATED("tud_midi_receive() is renamed to tud_midi_packet_read()")
|
||||
static inline bool tud_midi_receive(uint8_t packet[4])
|
||||
{
|
||||
return tud_midi_packet_read(packet);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// Application Callback API (weak is optional)
|
||||
@@ -92,12 +127,6 @@ 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 cable_num, uint8_t b1, uint8_t b2, uint8_t b3)
|
||||
{
|
||||
uint8_t msg[3] = { b1, b2, b3 };
|
||||
return tud_midi_n_write(itf, cable_num, msg, 3);
|
||||
}
|
||||
|
||||
static inline bool tud_midi_mounted (void)
|
||||
{
|
||||
return tud_midi_n_mounted(0);
|
||||
@@ -108,35 +137,24 @@ 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)
|
||||
static inline uint32_t tud_midi_stream_read (void* buffer, uint32_t bufsize)
|
||||
{
|
||||
return tud_midi_n_read(0, 0, buffer, bufsize);
|
||||
return tud_midi_n_stream_read(0, 0, buffer, bufsize);
|
||||
}
|
||||
|
||||
static inline void tud_midi_read_flush (void)
|
||||
static inline uint32_t tud_midi_stream_write (uint8_t cable_num, uint8_t const* buffer, uint32_t bufsize)
|
||||
{
|
||||
tud_midi_n_read_flush(0, 0);
|
||||
return tud_midi_n_stream_write(0, cable_num, buffer, bufsize);
|
||||
}
|
||||
|
||||
static inline uint32_t tud_midi_write (uint8_t cable_num, uint8_t const* buffer, uint32_t bufsize)
|
||||
static inline bool tud_midi_packet_read (uint8_t packet[4])
|
||||
{
|
||||
return tud_midi_n_write(0, cable_num, buffer, bufsize);
|
||||
return tud_midi_n_packet_read(0, packet);
|
||||
}
|
||||
|
||||
static inline uint32_t tud_midi_write24 (uint8_t cable_num, uint8_t b1, uint8_t b2, uint8_t b3)
|
||||
static inline bool tud_midi_packet_write (uint8_t const packet[4])
|
||||
{
|
||||
uint8_t msg[3] = { b1, b2, b3 };
|
||||
return tud_midi_write(cable_num, msg, 3);
|
||||
}
|
||||
|
||||
static inline bool tud_midi_receive (uint8_t packet[4])
|
||||
{
|
||||
return tud_midi_n_receive(0, packet);
|
||||
}
|
||||
|
||||
static inline bool tud_midi_send (uint8_t const packet[4])
|
||||
{
|
||||
return tud_midi_n_send(0, packet);
|
||||
return tud_midi_n_packet_write(0, packet);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
|
||||
@@ -131,9 +131,9 @@ typedef struct
|
||||
uint8_t ep_int_in;
|
||||
// IN buffer is only used for first packet, not the remainder
|
||||
// in order to deal with prepending header
|
||||
uint8_t ep_bulk_in_buf[USBTMCD_MAX_PACKET_SIZE];
|
||||
CFG_TUSB_MEM_ALIGN uint8_t ep_bulk_in_buf[USBTMCD_MAX_PACKET_SIZE];
|
||||
// OUT buffer receives one packet at a time
|
||||
uint8_t ep_bulk_out_buf[USBTMCD_MAX_PACKET_SIZE];
|
||||
CFG_TUSB_MEM_ALIGN uint8_t ep_bulk_out_buf[USBTMCD_MAX_PACKET_SIZE];
|
||||
uint32_t transfer_size_remaining; // also used for requested length for bulk IN.
|
||||
uint32_t transfer_size_sent; // To keep track of data bytes that have been queued in FIFO (not header bytes)
|
||||
|
||||
@@ -145,7 +145,7 @@ typedef struct
|
||||
usbtmc_capabilities_specific_t const * capabilities;
|
||||
} usbtmc_interface_state_t;
|
||||
|
||||
static usbtmc_interface_state_t usbtmc_state =
|
||||
CFG_TUSB_MEM_SECTION static usbtmc_interface_state_t usbtmc_state =
|
||||
{
|
||||
.itf_id = 0xFF,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user