130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * <linux/usb/midi.h> -- USB MIDI definitions.
330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Copyright (C) 2006 Thumtronics Pty Ltd.
530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Developed for Thumtronics by Grey Innovation
630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Ben Williamson <ben.williamson@greyinnovation.com>
730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * This software is distributed under the terms of the GNU General Public
930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * License ("GPL") version 2, as published by the Free Software Foundation.
1030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
1130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * This file holds USB constants and structures defined
1230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * by the USB Device Class Definition for MIDI Devices.
1330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Comments below reference relevant sections of that document:
1430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
1530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * http://www.usb.org/developers/devclass_docs/midi10.pdf
1630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
1730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
1830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef __LINUX_USB_MIDI_H
1930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define __LINUX_USB_MIDI_H
2030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
2130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include <linux/types.h>
2230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
2330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* A.1  MS Class-Specific Interface Descriptor Subtypes */
2430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define USB_MS_HEADER		0x01
2530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define USB_MS_MIDI_IN_JACK	0x02
2630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define USB_MS_MIDI_OUT_JACK	0x03
2730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define USB_MS_ELEMENT		0x04
2830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
2930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* A.2  MS Class-Specific Endpoint Descriptor Subtypes */
3030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define USB_MS_GENERAL		0x01
3130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
3230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* A.3  MS MIDI IN and OUT Jack Types */
3330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define USB_MS_EMBEDDED		0x01
3430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define USB_MS_EXTERNAL		0x02
3530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
3630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 6.1.2.1  Class-Specific MS Interface Header Descriptor */
3730692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct usb_ms_header_descriptor {
3830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bLength;
3930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bDescriptorType;
4030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bDescriptorSubtype;
4130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__le16 bcdMSC;
4230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__le16 wTotalLength;
4330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} __attribute__ ((packed));
4430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
4530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define USB_DT_MS_HEADER_SIZE	7
4630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
4730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 6.1.2.2  MIDI IN Jack Descriptor */
4830692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct usb_midi_in_jack_descriptor {
4930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bLength;
5030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
5130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bDescriptorSubtype;	/* USB_MS_MIDI_IN_JACK */
5230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bJackType;		/* USB_MS_EMBEDDED/EXTERNAL */
5330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bJackID;
5430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  iJack;
5530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} __attribute__ ((packed));
5630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
5730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define USB_DT_MIDI_IN_SIZE	6
5830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
5930692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct usb_midi_source_pin {
6030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  baSourceID;
6130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  baSourcePin;
6230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} __attribute__ ((packed));
6330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
6430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 6.1.2.3  MIDI OUT Jack Descriptor */
6530692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct usb_midi_out_jack_descriptor {
6630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bLength;
6730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
6830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bDescriptorSubtype;	/* USB_MS_MIDI_OUT_JACK */
6930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bJackType;		/* USB_MS_EMBEDDED/EXTERNAL */
7030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bJackID;
7130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bNrInputPins;		/* p */
7230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	struct usb_midi_source_pin pins[]; /* [p] */
7330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	/*__u8  iJack;  -- omitted due to variable-sized pins[] */
7430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} __attribute__ ((packed));
7530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
7630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define USB_DT_MIDI_OUT_SIZE(p)	(7 + 2 * (p))
7730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
7830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* As above, but more useful for defining your own descriptors: */
7930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define DECLARE_USB_MIDI_OUT_JACK_DESCRIPTOR(p)			\
8030692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct usb_midi_out_jack_descriptor_##p {			\
8130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bLength;						\
8230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bDescriptorType;					\
8330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bDescriptorSubtype;				\
8430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bJackType;					\
8530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bJackID;						\
8630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bNrInputPins;					\
8730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	struct usb_midi_source_pin pins[p];			\
8830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  iJack;						\
8930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} __attribute__ ((packed))
9030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
9130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 6.2.2  Class-Specific MS Bulk Data Endpoint Descriptor */
9230692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct usb_ms_endpoint_descriptor {
9330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bLength;			/* 4+n */
9430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bDescriptorType;		/* USB_DT_CS_ENDPOINT */
9530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bDescriptorSubtype;	/* USB_MS_GENERAL */
9630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bNumEmbMIDIJack;		/* n */
9730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  baAssocJackID[];		/* [n] */
9830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} __attribute__ ((packed));
9930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
10030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define USB_DT_MS_ENDPOINT_SIZE(n)	(4 + (n))
10130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
10230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* As above, but more useful for defining your own descriptors: */
10330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define DECLARE_USB_MS_ENDPOINT_DESCRIPTOR(n)			\
10430692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct usb_ms_endpoint_descriptor_##n {				\
10530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bLength;						\
10630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bDescriptorType;					\
10730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bDescriptorSubtype;				\
10830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  bNumEmbMIDIJack;					\
10930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8  baAssocJackID[n];					\
11030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} __attribute__ ((packed))
11130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
11230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif /* __LINUX_USB_MIDI_H */
113