update midi desc
This commit is contained in:
@@ -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_ */
|
||||
|
||||
167
demo/midi_template.c
Normal file
167
demo/midi_template.c
Normal file
@@ -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();
|
||||
}
|
||||
Reference in New Issue
Block a user