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