summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2022-03-09 10:34:08 +0800
committersakumisu <[email protected]>2022-03-09 10:34:08 +0800
commit0c57037257f1fdd4b4ebd26eefb34e634453b4ae (patch)
tree01fe6b6d9109837c983463092bc69d122236bd0a
parentb8d1fd6b658a3673adc7fb46284eae0e17b4c9bb (diff)
update midi desc
-rw-r--r--class/midi/usb_midi.h102
-rw-r--r--demo/midi_template.c167
2 files changed, 238 insertions, 31 deletions
diff --git a/class/midi/usb_midi.h b/class/midi/usb_midi.h
index 430d75ce..52ae9899 100644
--- a/class/midi/usb_midi.h
+++ b/class/midi/usb_midi.h
@@ -7,12 +7,16 @@
#ifndef _USB_MIDI_H_
#define _USB_MIDI_H_
-/* MIDI Streaming class specific interfaces */
-#define MIDI_IN_JACK 0x02
-#define MIDI_OUT_JACK 0x03
+/* bDescriptorSubType */
+#define MIDI_VC_HEADER_DESCRIPTOR_SUBTYPE 0x01U
+#define MIDI_MS_HEADER_DESCRIPTOR_SUBTYPE 0x01U
+#define MIDI_MS_GENERAL_DESCRIPTOR_SUBTYPE 0x01U
+#define MIDI_MIDI_IN_JACK_DESCRIPTOR_SUBTYPE 0x02U
+#define MIDI_MIDI_OUT_JACK_DESCRIPTOR_SUBTYPE 0x03U
-#define MIDI_JACK_EMBEDDED 0x01
-#define MIDI_JACK_EXTERNAL 0x02
+/* bJackType */
+#define MIDI_JACK_TYPE_EMBEDDED 0x01
+#define MIDI_JACK_TYPE_EXTERNAL 0x02
#define MIDI_CHANNEL_OMNI 0
#define MIDI_CHANNEL_OFF 17
@@ -120,27 +124,43 @@ enum MidiControlChangeNumber {
PolyModeOn = 127
};
-struct midi_cs_interface_descriptor {
+struct midi_cs_if_ac_header_descriptor {
uint8_t bLength;
uint8_t bDescriptorType;
- uint8_t SubType;
+ uint8_t bDescriptorSubType;
uint16_t bcdADC;
uint16_t wTotalLength;
+ uint8_t bInCollection;
+ uint8_t baInterfaceNr[];
} __PACKED;
-struct midi_in_jack_descriptor {
+#define MIDI_SIZEOF_AC_HEADER_DESC(n) (8 + n)
+
+struct midi_cs_if_ms_header_descriptor {
uint8_t bLength;
uint8_t bDescriptorType;
- uint8_t SubType;
+ uint8_t bDescriptorSubType;
+ uint16_t bcdMSC;
+ uint16_t wTotalLength;
+} __PACKED;
+
+#define MIDI_SIZEOF_MS_HEADER_DESC (7)
+
+struct midi_cs_if_in_jack_descriptor {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubType;
uint8_t bJackType;
uint8_t bJackId;
uint8_t iJack;
} __PACKED;
-struct midi_out_jack_descriptor {
+#define MIDI_SIZEOF_IN_JACK_DESC (6)
+
+struct midi_cs_if_out_jack_descriptor {
uint8_t bLength;
uint8_t bDescriptorType;
- uint8_t SubType;
+ uint8_t bDescriptorSubType;
uint8_t bJackType;
uint8_t bJackId;
uint8_t bNrInputPins;
@@ -149,26 +169,46 @@ struct midi_out_jack_descriptor {
uint8_t iJack;
} __PACKED;
-#define MIDI_ADAPTER_AC_INTERFACE_DESCRIPTOR_SIZE(num) (8 + num)
-#define MIDI_ADAPTER_AC_INTERFACE_DESCRIPTOR(num) \
- struct midi_adapter_ac_interface_descriptor { \
- uint8_t bLength; \
- uint8_t bDescriptorType; \
- uint8_t SubType; \
- uint16_t bcdADC; \
- uint16_t wTotalLength; \
- uint8_t bInCollection; \
- uint8_t baInterfaceNr[num]; \
- } __PACKED
+#define MIDI_SIZEOF_OUT_JACK_DESC (9)
+
+struct midi_cs_ep_ms_general_descriptor {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubType;
+ uint8_t bNumEmbMIDIJack;
+ uint8_t baAssocJackID[];
+} __PACKED;
+
+#define MIDI_SIZEOF_MS_GENERAL_DESC(n) (4 + n)
+
+// clang-format off
+#define MIDI_IN_JACK_DESCRIPTOR_INIT(bJackType, bJackID) \
+ 0x06, \
+ 0x24, \
+ MIDI_MIDI_IN_JACK_DESCRIPTOR_SUBTYPE, \
+ bJackType, \
+ bJackID, \
+ 0x00
+
+#define MIDI_OUT_JACK_DESCRIPTOR_INIT(bJackType, bJackID, baSourceID) \
+ 0x09, \
+ 0x24, \
+ MIDI_MIDI_OUT_JACK_DESCRIPTOR_SUBTYPE, \
+ bJackType, \
+ bJackID, \
+ 0x01, \
+ baSourceID, \
+ 0x01, \
+ 0x00
+
+#define MIDI_JACK_DESCRIPTOR_INIT(bJackFirstID) \
+ MIDI_IN_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EMBEDDED, bJackFirstID), \
+ MIDI_IN_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EXTERNAL, (bJackFirstID + 1)), \
+ MIDI_OUT_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EMBEDDED, (bJackFirstID + 2), (bJackFirstID + 1)), \
+ MIDI_OUT_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EXTERNAL, (bJackFirstID + 3), (bJackFirstID))
+
+#define MIDI_SIZEOF_JACK_DESC (6 + 6 + 9 + 9)
-#define MIDI_CS_BULK_ENDPOINT_DESCRIPTOR_SIZE(num) (4 + num)
-#define MIDI_CS_BULK_ENDPOINT_DESCRIPTOR(num) \
- struct midi_cs_bulk_descriptor { \
- uint8_t bLength; \
- uint8_t bDescriptorType; \
- uint8_t SubType; \
- uint8_t bNumEmbMIDIJack; \
- uint8_t baAssocJackID[num]; \
- } __PACKED
+// clang-format on
#endif /* _USB_MIDI_H_ */
diff --git a/demo/midi_template.c b/demo/midi_template.c
new file mode 100644
index 00000000..6ecb9b3d
--- /dev/null
+++ b/demo/midi_template.c
@@ -0,0 +1,167 @@
+#include "usbd_core.h"
+#include "usb_midi.h"
+
+USB_DESC_SECTION const uint8_t midi_descriptor[] = {
+ USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0100, 0x01),
+ USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER),
+ // Standard AC Interface Descriptor
+ 0x09,
+ 0x04,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x01,
+ 0x01,
+ 0x00,
+ 0x00,
+ // Class-specific AC Interface Descriptor
+ 0x09,
+ 0x24,
+ 0x01,
+ 0x00,
+ 0x01,
+ 0x09,
+ 0x00,
+ 0x01,
+ 0x01,
+ // MIDIStreaming Interface Descriptors
+ 0x09,
+ 0x04,
+ 0x01,
+ 0x00,
+ 0x02,
+ 0x01,
+ 0x03,
+ 0x00,
+ 0x00,
+ // Class-Specific MS Interface Header Descriptor
+ 0x07,
+ 0x24,
+ 0x01,
+ 0x00,
+ 0x01,
+ WBVAL(65),
+
+ // MIDI_IN_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EMBEDDED, 0x01),
+ // MIDI_IN_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EXTERNAL, 0x02),
+ // MIDI_OUT_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EMBEDDED, 0x03, 0x02),
+ // MIDI_OUT_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EXTERNAL, 0x04, 0x01),
+ MIDI_JACK_DESCRIPTOR_INIT(0x01),
+ // OUT endpoint descriptor
+ 0x09, 0x05, 0x02, 0x02, WBVAL(64), 0x00, 0x00, 0x00,
+ 0x05, 0x25, 0x01, 0x01, 0x01,
+
+ // IN endpoint descriptor
+ 0x09, 0x05, 0x81, 0x02, WBVAL(64), 0x00, 0x00, 0x00,
+ 0x05, 0x25, 0x01, 0x01, 0x03,
+
+ ///////////////////////////////////////
+ /// string0 descriptor
+ ///////////////////////////////////////
+ USB_LANGID_INIT(USBD_LANGID_STRING),
+ ///////////////////////////////////////
+ /// string1 descriptor
+ ///////////////////////////////////////
+ 0x14, /* bLength */
+ USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
+ 'C', 0x00, /* wcChar0 */
+ 'h', 0x00, /* wcChar1 */
+ 'e', 0x00, /* wcChar2 */
+ 'r', 0x00, /* wcChar3 */
+ 'r', 0x00, /* wcChar4 */
+ 'y', 0x00, /* wcChar5 */
+ 'U', 0x00, /* wcChar6 */
+ 'S', 0x00, /* wcChar7 */
+ 'B', 0x00, /* wcChar8 */
+ ///////////////////////////////////////
+ /// string2 descriptor
+ ///////////////////////////////////////
+ 0x28, /* bLength */
+ USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
+ 'C', 0x00, /* wcChar0 */
+ 'h', 0x00, /* wcChar1 */
+ 'e', 0x00, /* wcChar2 */
+ 'r', 0x00, /* wcChar3 */
+ 'r', 0x00, /* wcChar4 */
+ 'y', 0x00, /* wcChar5 */
+ 'U', 0x00, /* wcChar6 */
+ 'S', 0x00, /* wcChar7 */
+ 'B', 0x00, /* wcChar8 */
+ ' ', 0x00, /* wcChar9 */
+ 'M', 0x00, /* wcChar10 */
+ 'I', 0x00, /* wcChar11 */
+ 'D', 0x00, /* wcChar12 */
+ 'I', 0x00, /* wcChar13 */
+ ' ', 0x00, /* wcChar14 */
+ 'D', 0x00, /* wcChar15 */
+ 'E', 0x00, /* wcChar16 */
+ 'M', 0x00, /* wcChar17 */
+ 'O', 0x00, /* wcChar18 */
+ ///////////////////////////////////////
+ /// string3 descriptor
+ ///////////////////////////////////////
+ 0x16, /* bLength */
+ USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
+ '2', 0x00, /* wcChar0 */
+ '0', 0x00, /* wcChar1 */
+ '2', 0x00, /* wcChar2 */
+ '1', 0x00, /* wcChar3 */
+ '0', 0x00, /* wcChar4 */
+ '3', 0x00, /* wcChar5 */
+ '1', 0x00, /* wcChar6 */
+ '0', 0x00, /* wcChar7 */
+ '0', 0x00, /* wcChar8 */
+ '0', 0x00, /* wcChar9 */
+#ifdef CONFIG_USB_HS
+ ///////////////////////////////////////
+ /// device qualifier descriptor
+ ///////////////////////////////////////
+ 0x0a,
+ USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER,
+ 0x00,
+ 0x02,
+ 0x02,
+ 0x02,
+ 0x01,
+ 0x40,
+ 0x01,
+ 0x00,
+#endif
+ 0x00
+};
+
+void usbd_midi_bulk_out(uint8_t ep)
+{
+}
+
+void usbd_midi_bulk_in(uint8_t ep)
+{
+}
+
+usbd_class_t midi_class;
+usbd_interface_t midi_cmd_intf;
+usbd_interface_t midi_data_intf;
+
+usbd_endpoint_t midi_out_ep = {
+ .ep_addr = MIDI_OUT_EP,
+ .ep_cb = usbd_midi_bulk_out
+};
+
+usbd_endpoint_t midi_in_ep = {
+ .ep_addr = MIDI_IN_EP,
+ .ep_cb = usbd_midi_bulk_in
+};
+
+
+void midi_init(void)
+{
+ usbd_desc_register(midi_descriptor);
+
+ usbd_class_add_interface(&midi_class, &midi_cmd_intf);
+ usbd_class_add_interface(&midi_class, &midi_data_intf);
+ usbd_interface_add_endpoint(&midi_data_intf, &midi_out_ep);
+ usbd_interface_add_endpoint(&midi_data_intf, &midi_in_ep);
+
+ extern int usb_dc_init(void);
+ usb_dc_init();
+} \ No newline at end of file