diff --git a/headers/os/drivers/USB_spec.h b/headers/os/drivers/USB_spec.h index 0f07a1ed7c..e0619eda1e 100644 --- a/headers/os/drivers/USB_spec.h +++ b/headers/os/drivers/USB_spec.h @@ -40,11 +40,17 @@ #define USB_REQUEST_SYNCH_FRAME 12 /* Used by {set|get}_descriptor() */ -#define USB_DESCRIPTOR_DEVICE 1 -#define USB_DESCRIPTOR_CONFIGURATION 2 -#define USB_DESCRIPTOR_STRING 3 -#define USB_DESCRIPTOR_INTERFACE 4 -#define USB_DESCRIPTOR_ENDPOINT 5 +#define USB_DESCRIPTOR_DEVICE 0x01 +#define USB_DESCRIPTOR_CONFIGURATION 0x02 +#define USB_DESCRIPTOR_STRING 0x03 +#define USB_DESCRIPTOR_INTERFACE 0x04 +#define USB_DESCRIPTOR_ENDPOINT 0x05 +/* conventional class-specific descriptors */ +#define USB_DESCRIPTOR_CS_DEVICE 0x21 +#define USB_DESCRIPTOR_CS_CONFIGURATION 0x22 +#define USB_DESCRIPTOR_CS_STRING 0x23 +#define USB_DESCRIPTOR_CS_INTERFACE 0x24 +#define USB_DESCRIPTOR_CS_ENDPOINT 0x25 /* Used by {set|clear}_feature() */ #define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 diff --git a/headers/os/drivers/usb/USB_cdc.h b/headers/os/drivers/usb/USB_cdc.h index 575561eb4c..5736328334 100644 --- a/headers/os/drivers/usb/USB_cdc.h +++ b/headers/os/drivers/usb/USB_cdc.h @@ -53,8 +53,8 @@ typedef struct usb_cdc_cm_functional_descriptor { } _PACKED usb_cdc_cm_functional_descriptor; enum { // Call Management Functional Descriptor capabilities bitmap - USB_CDC_CM_DOES_CALL_MANAGEMENT = 0x00, - USB_CDC_CM_OVER_DATA_INTERFACE = 0x01 + USB_CDC_CM_DOES_CALL_MANAGEMENT = 0x01, + USB_CDC_CM_OVER_DATA_INTERFACE = 0x02 }; typedef struct usb_cdc_acm_functional_descriptor { @@ -64,11 +64,11 @@ typedef struct usb_cdc_acm_functional_descriptor { uint8 capabilities; } _PACKED usb_cdc_acm_functional_descriptor; -enum { // Abstract Control Model Functional Descriptor capabilities bitmap - USB_CDC_ACM_HAS_COMM_FEATURES = 0x00, - USB_CDC_ACM_HAS_LINE_CONTROL = 0x01, - USB_CDC_ACM_HAS_SEND_BREAK = 0x02, - USB_CDC_ACM_HAS_NETWORK_CONNECTION = 0x04 +enum { // Abstract Control Model Functional Descriptor capabilities bitmap (p36) + USB_CDC_ACM_HAS_COMM_FEATURES = 0x01, + USB_CDC_ACM_HAS_LINE_CONTROL = 0x02, + USB_CDC_ACM_HAS_SEND_BREAK = 0x04, + USB_CDC_ACM_HAS_NETWORK_CONNECTION = 0x08 }; typedef struct usb_cdc_union_functional_descriptor { diff --git a/headers/os/drivers/usb/USB_midi.h b/headers/os/drivers/usb/USB_midi.h index 4ff46b1c12..2eb8d7ed04 100644 --- a/headers/os/drivers/usb/USB_midi.h +++ b/headers/os/drivers/usb/USB_midi.h @@ -17,4 +17,107 @@ typedef struct { // USB MIDI Event Packet uint8 midi[3]; } _PACKED usb_midi_event_packet; + +// MIDIStreaming (ms) insterface descriptors (p20) + +enum { // MIDI Streaming descriptors subtypes + USB_MS_HEADER_DESCRIPTOR = 0x01, + USB_MS_MIDI_IN_JACK_DESCRIPTOR, + USB_MS_MIDI_OUT_JACK_DESCRIPTOR, + USB_MS_ELEMENT_DESCRIPTOR +}; + +typedef struct usb_midi_interface_header_descriptor { + uint8 length; + uint8 descriptor_type; + uint8 descriptor_subtype; // USB_MS_HEADER_DESCRIPTOR + uint16 ms_version; + uint16 total_length; +} _PACKED usb_midi_interface_header_descriptor; + + +enum { + USB_MIDI_EMBEDDED_JACK = 0x01, + USB_MIDI_EXTERNAL_JACK +}; + +typedef struct usb_midi_in_jack_descriptor { + uint8 length; + uint8 descriptor_type; + uint8 descriptor_subtype; // USB_MS_MIDI_IN_JACK_DESCRIPTOR + uint8 type; // USB_MIDI_{EMBEDDED | EXTERNAL}_JACK + uint8 id; + uint8 string_descriptor; +} _PACKED usb_ms_midi_in_jack_descriptor; + + +typedef struct usb_midi_source { + uint8 source_id; + uint8 source_pin; +} _PACKED usb_midi_source; + +typedef struct usb_midi_out_jack_descriptor { + uint8 length; + uint8 descriptor_type; + uint8 descriptor_subtype; // USB_MS_MIDI_OUT_JACK_DESCRIPTOR + uint8 type; // USB_MIDI_{EMBEDDED | EXTERNAL}_JACK + uint8 id; + uint8 inputs_count; + usb_midi_source input_source[0]; // inputs_count times + // uint8 string_descriptor; +} _PACKED usb_midi_out_jack_descriptor; + + +enum { // USB Element Capabilities bitmap (p23,25) + USB_MS_ELEMENT_CUSTOM_UNDEFINED = 0x0001, + USB_MS_ELEMENT_MIDI_CLOCK = 0x0002, + USB_MS_ELEMENT_MIDI_TIME_CODE = 0x0004, + USB_MS_ELEMENT_MTC = USB_MS_ELEMENT_MIDI_TIME_CODE, + USB_MS_ELEMENT_MIDI_MACHINE_CONTROL = 0x0008, + USB_MS_ELEMENT_MMC = USB_MS_ELEMENT_MIDI_MACHINE_CONTROL, + // General MIDI System Level 1 compatible + USB_MS_ELEMENT_GM1 = 0x0010, + // General MIDI System Level 2 compatible + USB_MS_ELEMENT_GM2 = 0x0020, + // GS Format compatible (Roland) + USB_MS_ELEMENT_GS = 0x0040, + // XG compatibily (Yamaha) + USB_MS_ELEMENT_XG = 0x0080, + USB_MS_ELEMENT_EFX = 0x0100, + // internal MIDI Patcher or Router + USB_MS_ELEMENT_MIDI_PATCH_BAY = 0x0200, + // Downloadable Sounds Standards Level 1 compatible + USB_MS_ELEMENT_DLS1 = 0x0400, + // Downloadable Sounds Standards Level 2 compatible + USB_MS_ELEMENT_DLS2 = 0x0800 +}; + +typedef struct usb_midi_element_descriptor { + uint8 length; + uint8 descriptor_type; + uint8 descriptor_subtype; // USB_MS_ELEMENT_DESCRIPTOR + uint8 id; + uint8 inputs_count; + usb_midi_source input_source[0]; // inputs_count times + // uint8 outputs_count; + // uint8 input_terminal_id; + // uint8 output_terminal_id; + // uint8 capabilities_size; + // uint8 capabilities[0]; // capabilities_size bytes + // uint8 string_descriptor; // see USB_MS_ELEMENT_* enum above +} _PACKED usb_midi_element_descriptor; + +// Class-Specific MIDIStream Bulk Data Endpoint descriptor (p26) + +#define USB_MS_GENERAL_DESCRIPTOR 0x01 + +typedef struct usb_midi_endpoint_descriptor { + uint8 length; + uint8 descriptor_type; // USB_DESCRIPTOR_CS_ENDPOINT + uint8 descriptor_subtype; // USB_MS_GENERAL_DESCRIPTOR + uint8 jacks_count; + uint8 jacks_id[0]; // jacks_count times +} _PACKED usb_midi_endpoint_descriptor; + + #endif // USB_MIDI_H