1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * <linux/usb/midi.h> -- USB MIDI definitions. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2006 Thumtronics Pty Ltd. 6*4882a593Smuzhiyun * Developed for Thumtronics by Grey Innovation 7*4882a593Smuzhiyun * Ben Williamson <ben.williamson@greyinnovation.com> 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This software is distributed under the terms of the GNU General Public 10*4882a593Smuzhiyun * License ("GPL") version 2, as published by the Free Software Foundation. 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * This file holds USB constants and structures defined 13*4882a593Smuzhiyun * by the USB Device Class Definition for MIDI Devices. 14*4882a593Smuzhiyun * Comments below reference relevant sections of that document: 15*4882a593Smuzhiyun * 16*4882a593Smuzhiyun * http://www.usb.org/developers/devclass_docs/midi10.pdf 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #ifndef __LINUX_USB_MIDI_H 20*4882a593Smuzhiyun #define __LINUX_USB_MIDI_H 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #include <linux/types.h> 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* A.1 MS Class-Specific Interface Descriptor Subtypes */ 25*4882a593Smuzhiyun #define USB_MS_HEADER 0x01 26*4882a593Smuzhiyun #define USB_MS_MIDI_IN_JACK 0x02 27*4882a593Smuzhiyun #define USB_MS_MIDI_OUT_JACK 0x03 28*4882a593Smuzhiyun #define USB_MS_ELEMENT 0x04 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* A.2 MS Class-Specific Endpoint Descriptor Subtypes */ 31*4882a593Smuzhiyun #define USB_MS_GENERAL 0x01 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* A.3 MS MIDI IN and OUT Jack Types */ 34*4882a593Smuzhiyun #define USB_MS_EMBEDDED 0x01 35*4882a593Smuzhiyun #define USB_MS_EXTERNAL 0x02 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* 6.1.2.1 Class-Specific MS Interface Header Descriptor */ 38*4882a593Smuzhiyun struct usb_ms_header_descriptor { 39*4882a593Smuzhiyun __u8 bLength; 40*4882a593Smuzhiyun __u8 bDescriptorType; 41*4882a593Smuzhiyun __u8 bDescriptorSubtype; 42*4882a593Smuzhiyun __le16 bcdMSC; 43*4882a593Smuzhiyun __le16 wTotalLength; 44*4882a593Smuzhiyun } __attribute__ ((packed)); 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #define USB_DT_MS_HEADER_SIZE 7 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* 6.1.2.2 MIDI IN Jack Descriptor */ 49*4882a593Smuzhiyun struct usb_midi_in_jack_descriptor { 50*4882a593Smuzhiyun __u8 bLength; 51*4882a593Smuzhiyun __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ 52*4882a593Smuzhiyun __u8 bDescriptorSubtype; /* USB_MS_MIDI_IN_JACK */ 53*4882a593Smuzhiyun __u8 bJackType; /* USB_MS_EMBEDDED/EXTERNAL */ 54*4882a593Smuzhiyun __u8 bJackID; 55*4882a593Smuzhiyun __u8 iJack; 56*4882a593Smuzhiyun } __attribute__ ((packed)); 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define USB_DT_MIDI_IN_SIZE 6 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun struct usb_midi_source_pin { 61*4882a593Smuzhiyun __u8 baSourceID; 62*4882a593Smuzhiyun __u8 baSourcePin; 63*4882a593Smuzhiyun } __attribute__ ((packed)); 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* 6.1.2.3 MIDI OUT Jack Descriptor */ 66*4882a593Smuzhiyun struct usb_midi_out_jack_descriptor { 67*4882a593Smuzhiyun __u8 bLength; 68*4882a593Smuzhiyun __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ 69*4882a593Smuzhiyun __u8 bDescriptorSubtype; /* USB_MS_MIDI_OUT_JACK */ 70*4882a593Smuzhiyun __u8 bJackType; /* USB_MS_EMBEDDED/EXTERNAL */ 71*4882a593Smuzhiyun __u8 bJackID; 72*4882a593Smuzhiyun __u8 bNrInputPins; /* p */ 73*4882a593Smuzhiyun struct usb_midi_source_pin pins[]; /* [p] */ 74*4882a593Smuzhiyun /*__u8 iJack; -- omitted due to variable-sized pins[] */ 75*4882a593Smuzhiyun } __attribute__ ((packed)); 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun #define USB_DT_MIDI_OUT_SIZE(p) (7 + 2 * (p)) 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* As above, but more useful for defining your own descriptors: */ 80*4882a593Smuzhiyun #define DECLARE_USB_MIDI_OUT_JACK_DESCRIPTOR(p) \ 81*4882a593Smuzhiyun struct usb_midi_out_jack_descriptor_##p { \ 82*4882a593Smuzhiyun __u8 bLength; \ 83*4882a593Smuzhiyun __u8 bDescriptorType; \ 84*4882a593Smuzhiyun __u8 bDescriptorSubtype; \ 85*4882a593Smuzhiyun __u8 bJackType; \ 86*4882a593Smuzhiyun __u8 bJackID; \ 87*4882a593Smuzhiyun __u8 bNrInputPins; \ 88*4882a593Smuzhiyun struct usb_midi_source_pin pins[p]; \ 89*4882a593Smuzhiyun __u8 iJack; \ 90*4882a593Smuzhiyun } __attribute__ ((packed)) 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /* 6.2.2 Class-Specific MS Bulk Data Endpoint Descriptor */ 93*4882a593Smuzhiyun struct usb_ms_endpoint_descriptor { 94*4882a593Smuzhiyun __u8 bLength; /* 4+n */ 95*4882a593Smuzhiyun __u8 bDescriptorType; /* USB_DT_CS_ENDPOINT */ 96*4882a593Smuzhiyun __u8 bDescriptorSubtype; /* USB_MS_GENERAL */ 97*4882a593Smuzhiyun __u8 bNumEmbMIDIJack; /* n */ 98*4882a593Smuzhiyun __u8 baAssocJackID[]; /* [n] */ 99*4882a593Smuzhiyun } __attribute__ ((packed)); 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun #define USB_DT_MS_ENDPOINT_SIZE(n) (4 + (n)) 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun /* As above, but more useful for defining your own descriptors: */ 104*4882a593Smuzhiyun #define DECLARE_USB_MS_ENDPOINT_DESCRIPTOR(n) \ 105*4882a593Smuzhiyun struct usb_ms_endpoint_descriptor_##n { \ 106*4882a593Smuzhiyun __u8 bLength; \ 107*4882a593Smuzhiyun __u8 bDescriptorType; \ 108*4882a593Smuzhiyun __u8 bDescriptorSubtype; \ 109*4882a593Smuzhiyun __u8 bNumEmbMIDIJack; \ 110*4882a593Smuzhiyun __u8 baAssocJackID[n]; \ 111*4882a593Smuzhiyun } __attribute__ ((packed)) 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun #endif /* __LINUX_USB_MIDI_H */ 114