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