diff --git a/include/libopencm3/usb/audio.h b/include/libopencm3/usb/audio.h
new file mode 100644
index 00000000..b01deaf0
--- /dev/null
+++ b/include/libopencm3/usb/audio.h
@@ -0,0 +1,94 @@
+/** @defgroup usb_audio_defines USB Audio Type Definitions
+
+@brief Defined Constants and Types for the USB Audio Type Definitions
+
+@ingroup USB_defines
+
+@version 1.0.0
+
+@author @htmlonly © @endhtmlonly 2014
+Daniel Thompson
+
+@date 19 April 2014
+
+LGPL License Terms @ref lgpl_license
+*/
+
+/*
+ * This file is part of the libopencm3 project.
+ *
+ * Copyright (C) 2014 Daniel Thompson
+ *
+ * This library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library. If not, see .
+ */
+
+/**@{*/
+
+#ifndef LIBOPENCM3_USB_AUDIO_H
+#define LIBOPENCM3_USB_AUDIO_H
+
+/*
+ * Definitions from the USB_AUDIO_ or usb_audio_ namespace come from:
+ * "Universal Serial Bus Class Definitions for Audio Devices, Revision 1.0"
+ */
+
+/* Table A-1: Audio Interface Class Code */
+#define USB_CLASS_AUDIO 0x01
+
+/* Table A-2: Audio Interface Subclass Codes */
+#define USB_AUDIO_SUBCLASS_UNDEFINED 0x00
+#define USB_AUDIO_SUBCLASS_CONTROL 0x01
+#define USB_AUDIO_SUBCLASS_AUDIOSTREAMING 0x02
+#define USB_AUDIO_SUBCLASS_MIDISTREAMING 0x03
+
+/* Table A-4: Audio Class-specific Descriptor Types */
+#define USB_AUDIO_DT_CS_UNDEFINED 0x20
+#define USB_AUDIO_DT_CS_DEVICE 0x21
+#define USB_AUDIO_DT_CS_CONFIGURATION 0x22
+#define USB_AUDIO_DT_CS_STRING 0x23
+#define USB_AUDIO_DT_CS_INTERFACE 0x24
+#define USB_AUDIO_DT_CS_ENDPOINT 0x25
+
+/* Table A-5: Audio Class-Specific AC Interface Descriptor Subtypes */
+#define USB_AUDIO_TYPE_AC_DESCRIPTOR_UNDEFINED 0x00
+#define USB_AUDIO_TYPE_HEADER 0x01
+#define USB_AUDIO_TYPE_INPUT_TERMINAL 0x02
+#define USB_AUDIO_TYPE_OUTPUT_TERMINAL 0x03
+#define USB_AUDIO_TYPE_MIXER_UNIT 0x04
+#define USB_AUDIO_TYPE_SELECTOR_UNIT 0x05
+#define USB_AUDIO_TYPE_FEATURE_UNIT 0x06
+#define USB_AUDIO_TYPE_PROCESSING_UNIT 0x07
+#define USB_AUDIO_TYPE_EXTENSION_UNIT 0x08
+
+/* Table 4-2: Class-Specific AC Interface Header Descriptor (head) */
+struct usb_audio_header_descriptor_head {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubtype;
+ uint16_t bcdADC;
+ uint16_t wTotalLength;
+ uint8_t binCollection;
+ /* ... */
+} __attribute__((packed));
+
+/* Table 4-2: Class-Specific AC Interface Header Descriptor (body) */
+struct usb_audio_header_descriptor_body {
+ /* ... */
+ uint8_t baInterfaceNr;
+} __attribute__((packed));
+
+#endif
+
+/**@}*/
+
diff --git a/include/libopencm3/usb/midi.h b/include/libopencm3/usb/midi.h
new file mode 100644
index 00000000..c8a5aa8a
--- /dev/null
+++ b/include/libopencm3/usb/midi.h
@@ -0,0 +1,190 @@
+/** @defgroup usb_audio_defines USB MIDI Type Definitions
+
+@brief Defined Constants and Types for the USB MIDI Type Definitions
+
+@ingroup USB_defines
+
+@version 1.0.0
+
+@author @htmlonly © @endhtmlonly 2014
+Daniel Thompson
+
+@date 19 April 2014
+
+LGPL License Terms @ref lgpl_license
+*/
+
+/*
+ * This file is part of the libopencm3 project.
+ *
+ * Copyright (C) 2014 Daniel Thompson
+ *
+ * This library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library. If not, see .
+ */
+
+/**@{*/
+
+#ifndef LIBOPENCM3_USB_MIDI_H
+#define LIBOPENCM3_USB_MIDI_H
+
+/*
+ * Definitions from the USB_MIDI_ or usb_midi_ namespace come from:
+ * "Universal Serial Bus Class Definitions for MIDI Devices, Revision 1.0"
+ */
+
+/* Appendix A.1: MS Class-Specific Interface Descriptor Subtypes */
+#define USB_MIDI_SUBTYPE_MS_DESCRIPTOR_UNDEFINED 0x00
+#define USB_MIDI_SUBTYPE_MS_HEADER 0x01
+#define USB_MIDI_SUBTYPE_MIDI_IN_JACK 0x02
+#define USB_MIDI_SUBTYPE_MIDI_OUT_JACK 0x03
+#define USB_MIDI_SUBTYPE_MIDI_ELEMENT 0x04
+
+/* Appendix A.2: MS Class-Specific Endpoint Descriptor Subtypes */
+#define USB_MIDI_SUBTYPE_DESCRIPTOR_UNDEFINED 0x00
+#define USB_MIDI_SUBTYPE_MS_GENERAL 0x01
+
+/* Appendix A.3: MS MIDI IN and OUT Jack types */
+#define USB_MIDI_JACK_TYPE_UNDEFINED 0x00
+#define USB_MIDI_JACK_TYPE_EMBEDDED 0x01
+#define USB_MIDI_JACK_TYPE_EXTERNAL 0x02
+
+/* Appendix A.5.1 Endpoint Control Selectors */
+#define USB_MIDI_EP_CONTROL_UNDEFINED 0x00
+#define USB_MIDI_ASSOCIATION_CONTROL 0x01
+
+
+/* Table 6-2: Class-Specific MS Interface Header Descriptor */
+struct usb_midi_header_descriptor {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubtype;
+ uint16_t bcdMSC;
+ uint16_t wTotalLength;
+} __attribute__((packed));
+
+/* Table 6-3: MIDI IN Jack Descriptor */
+struct usb_midi_in_jack_descriptor {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubtype;
+ uint8_t bJackType;
+ uint8_t bJackID;
+ uint8_t iJack;
+} __attribute__((packed));
+
+/* Table 6-4: MIDI OUT Jack Descriptor (head) */
+struct usb_midi_out_jack_descriptor_head {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubtype;
+ uint8_t bJackType;
+ uint8_t bJackID;
+ uint8_t bNrInputPins;
+ /* ... */
+} __attribute__((packed));
+
+/* Table 6.4: MIDI OUT Jack Descriptor (body) */
+struct usb_midi_out_jack_descriptor_body {
+ /* ... */
+ uint8_t baSourceID;
+ uint8_t baSourcePin;
+ /* ... */
+} __attribute__((packed));
+
+/* Table 6.4: MIDI OUT Jack Descriptor (tail) */
+struct usb_midi_out_jack_descriptor_tail {
+ /* ... */
+ uint8_t iJack;
+} __attribute__((packed));
+
+/* Table 6.4: MIDI OUT Jack Descriptor (single)
+ *
+ * This structure is a convenience covering the (normal) case where
+ * there is only one input pin.
+ */
+struct usb_midi_out_jack_descriptor {
+ struct usb_midi_out_jack_descriptor_head head;
+ struct usb_midi_out_jack_descriptor_body source[1];
+ struct usb_midi_out_jack_descriptor_tail tail;
+} __attribute__((packed));
+
+/* Table 6-5: MIDI Element Descriptor (head) */
+struct usb_midi_element_descriptor_head {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubtype;
+ uint8_t bElementID;
+ uint8_t bNrInputPins;
+ /* ... */
+} __attribute__((packed));
+
+/* Table 6-5: MIDI Element Descriptor (body) */
+struct usb_midi_element_descriptor_body {
+ /* ... */
+ uint8_t baSourceID;
+ uint8_t baSourcePin;
+ /* ... */
+} __attribute__((packed));
+
+/* Table 6-5: MIDI Element Descriptor (tail) */
+struct usb_midi_element_descriptor_tail {
+ /* ... */
+ uint8_t bNrOutputPins;
+ uint8_t bInTerminalLink;
+ uint8_t bOutTerminalLink;
+ uint8_t bElCapsSize;
+ uint16_t bmElementCaps; /* host cannot assume this is 16-bit but
+ device can (since highest defined bitmap
+ value in v1.0 is bit 11) */
+ uint8_t iElement;
+} __attribute__((packed));
+
+/* Table 6-5: MIDI Element Descriptor (single)
+ *
+ * This structure is a convenience covering the (common) case where
+ * there is only one input pin.
+ */
+struct usb_midi_element_descriptor {
+ struct usb_midi_element_descriptor_head head;
+ struct usb_midi_element_descriptor_body source[1];
+ struct usb_midi_element_descriptor_tail tail;
+} __attribute__((packed));
+
+/* Table 6-7: Class-specific MS Bulk Data Endpoint Descriptor (head) */
+struct usb_midi_endpoint_descriptor_head {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubType;
+ uint8_t bNumEmbMIDIJack;
+} __attribute__((packed));
+
+/* Table 6-7: Class-specific MS Bulk Data Endpoint Descriptor (body) */
+struct usb_midi_endpoint_descriptor_body {
+ uint8_t baAssocJackID;
+} __attribute__((packed));
+
+/* Table 6.7: Class-specific MS Bulk Data Endpoint Descriptor (single)
+ *
+ * This structure is a convenience covering the (normal) case where
+ * there is only one input pin.
+ */
+struct usb_midi_endpoint_descriptor {
+ struct usb_midi_endpoint_descriptor_head head;
+ struct usb_midi_endpoint_descriptor_body jack[1];
+} __attribute__((packed));
+
+#endif
+
+/**@}*/
+