From 0c57037257f1fdd4b4ebd26eefb34e634453b4ae Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Wed, 9 Mar 2022 10:34:08 +0800 Subject: [PATCH] update midi desc --- class/midi/usb_midi.h | 102 ++++++++++++++++++-------- demo/midi_template.c | 167 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 238 insertions(+), 31 deletions(-) create mode 100644 demo/midi_template.c 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; + +#define MIDI_SIZEOF_AC_HEADER_DESC(n) (8 + n) + +struct midi_cs_if_ms_header_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint16_t bcdMSC; + uint16_t wTotalLength; } __PACKED; -struct midi_in_jack_descriptor { +#define MIDI_SIZEOF_MS_HEADER_DESC (7) + +struct midi_cs_if_in_jack_descriptor { uint8_t bLength; uint8_t bDescriptorType; - uint8_t SubType; + 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) -#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 +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) + +// 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