Skip to content

Commit 028058d

Browse files
committed
midi work with esp32
1 parent 7499bc3 commit 028058d

File tree

2 files changed

+71
-17
lines changed

2 files changed

+71
-17
lines changed

src/arduino/midi/Adafruit_USBD_MIDI.cpp

Lines changed: 66 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,42 +35,83 @@
3535
#define EPIN 0x80
3636
#define EPSIZE 64
3737

38-
Adafruit_USBD_MIDI::Adafruit_USBD_MIDI(void) : _n_cables(1) {}
38+
// TODO multiple instances
39+
static Adafruit_USBD_MIDI *_midi_dev = NULL;
40+
41+
42+
#ifdef ARDUINO_ARCH_ESP32
43+
static uint16_t midi_load_descriptor(uint8_t * dst, uint8_t * itf)
44+
{
45+
// uint8_t str_index = tinyusb_add_string_descriptor("TinyUSB HID");
46+
uint8_t str_index = 0;
47+
48+
uint8_t ep_in = tinyusb_get_free_in_endpoint();
49+
uint8_t ep_out = tinyusb_get_free_out_endpoint();
50+
TU_VERIFY (ep_in && ep_out);
51+
ep_in |= 0x80;
52+
53+
uint16_t desc_len = _midi_dev->getInterfaceDescriptor(0, NULL, 0);
54+
55+
desc_len = _midi_dev->makeItfDesc(*itf, dst, desc_len, ep_in, ep_out);
56+
57+
*itf+=2;
58+
return desc_len;
59+
}
60+
#endif
61+
62+
Adafruit_USBD_MIDI::Adafruit_USBD_MIDI(uint8_t n_cables){
63+
_n_cables = n_cables;
64+
65+
#ifdef ARDUINO_ARCH_ESP32
66+
// ESP32 requires setup configuration descriptor within constructor
67+
_midi_dev = this;
68+
uint16_t const desc_len = getInterfaceDescriptor(0, NULL, 0);
69+
tinyusb_enable_interface(USB_INTERFACE_MIDI, desc_len, midi_load_descriptor);
70+
#endif
71+
}
3972

4073
void Adafruit_USBD_MIDI::setCables(uint8_t n_cables) { _n_cables = n_cables; }
4174

4275
bool Adafruit_USBD_MIDI::begin(void) {
43-
if (!TinyUSBDevice.addInterface(*this))
76+
if (!TinyUSBDevice.addInterface(*this)) {
4477
return false;
78+
}
4579

80+
_midi_dev = this;
4681
return true;
4782
}
4883

49-
uint16_t Adafruit_USBD_MIDI::getInterfaceDescriptor(uint8_t itfnum,
50-
uint8_t *buf,
51-
uint16_t bufsize) {
52-
uint16_t len = 0;
84+
uint16_t Adafruit_USBD_MIDI::makeItfDesc(uint8_t itfnum, uint8_t *buf, uint16_t bufsize, uint8_t ep_in, uint8_t ep_out) {
85+
uint16_t const desc_len = TUD_MIDI_DESC_HEAD_LEN + TUD_MIDI_DESC_JACK_LEN * _n_cables + 2 * TUD_MIDI_DESC_EP_LEN(_n_cables);
86+
87+
// null buf is for length only
88+
if (!buf) {
89+
return desc_len;
90+
}
5391

54-
if (bufsize < TUD_MIDI_DESC_HEAD_LEN + TUD_MIDI_DESC_JACK_LEN * _n_cables +
55-
TUD_MIDI_DESC_EP_LEN(_n_cables) * 2)
92+
if (bufsize < desc_len) {
5693
return 0;
94+
}
5795

96+
uint16_t len = 0;
97+
98+
// Header
5899
{
59100
uint8_t desc[] = {TUD_MIDI_DESC_HEAD(itfnum, 0, _n_cables)};
60101
memcpy(buf + len, desc, sizeof(desc));
61102
len += sizeof(desc);
62103
}
63104

105+
// Jack
64106
for (uint8_t i = 1; i <= _n_cables; i++) {
65107
uint8_t jack[] = {TUD_MIDI_DESC_JACK(i)};
66108
memcpy(buf + len, jack, sizeof(jack));
67109
len += sizeof(jack);
68110
}
69111

70-
// Endpoint OUT + jack mapping - usb core will automatically update endpoint
71-
// number
112+
// Endpoint OUT + jack mapping
72113
{
73-
uint8_t desc[] = {TUD_MIDI_DESC_EP(EPOUT, EPSIZE, _n_cables)};
114+
uint8_t desc[] = {TUD_MIDI_DESC_EP(ep_out, EPSIZE, _n_cables)};
74115
memcpy(buf + len, desc, sizeof(desc));
75116
len += sizeof(desc);
76117
}
@@ -81,10 +122,9 @@ uint16_t Adafruit_USBD_MIDI::getInterfaceDescriptor(uint8_t itfnum,
81122
len += sizeof(jack);
82123
}
83124

84-
// Endpoint IN + jack mapping - usb core will automatically update endpoint
85-
// number
125+
// Endpoint IN + jack mapping
86126
{
87-
uint8_t desc[] = {TUD_MIDI_DESC_EP(EPIN, EPSIZE, _n_cables)};
127+
uint8_t desc[] = {TUD_MIDI_DESC_EP(ep_in, EPSIZE, _n_cables)};
88128
memcpy(buf + len, desc, sizeof(desc));
89129
len += sizeof(desc);
90130
}
@@ -95,7 +135,18 @@ uint16_t Adafruit_USBD_MIDI::getInterfaceDescriptor(uint8_t itfnum,
95135
len += sizeof(jack);
96136
}
97137

98-
return len;
138+
if ( len != desc_len ) {
139+
// TODO should throw an error message
140+
return 0;
141+
}
142+
143+
return desc_len;
144+
}
145+
146+
uint16_t Adafruit_USBD_MIDI::getInterfaceDescriptor(uint8_t itfnum,
147+
uint8_t *buf,
148+
uint16_t bufsize) {
149+
return makeItfDesc(itfnum, buf, bufsize, EPIN, EPOUT);
99150
}
100151

101152
int Adafruit_USBD_MIDI::read(void) {

src/arduino/midi/Adafruit_USBD_MIDI.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030

3131
class Adafruit_USBD_MIDI : public Stream, public Adafruit_USBD_Interface {
3232
public:
33-
Adafruit_USBD_MIDI(void);
33+
Adafruit_USBD_MIDI(uint8_t n_cables = 1);
34+
35+
void setCables(uint8_t n_cables);
3436

3537
bool begin(void);
3638

@@ -57,7 +59,8 @@ class Adafruit_USBD_MIDI : public Stream, public Adafruit_USBD_Interface {
5759
virtual uint16_t getInterfaceDescriptor(uint8_t itfnum, uint8_t *buf,
5860
uint16_t bufsize);
5961

60-
void setCables(uint8_t n_cables);
62+
// internal use only
63+
uint16_t makeItfDesc(uint8_t itfnum, uint8_t *buf, uint16_t bufsize, uint8_t ep_in, uint8_t ep_out);
6164

6265
private:
6366
uint8_t _n_cables;

0 commit comments

Comments
 (0)