Michael Spencer / Smoothie

Dependencies:   mbed

Fork of Smoothie by Stéphane Cachat

Committer:
Michael J. Spencer
Date:
Fri Feb 28 18:52:52 2014 -0800
Revision:
2:1df0b61d3b5a
Update to latest Smoothie.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Michael J. Spencer 2:1df0b61d3b5a 1 #ifndef _DESCRIPTOR_H
Michael J. Spencer 2:1df0b61d3b5a 2 #define _DESCRIPTOR_H
Michael J. Spencer 2:1df0b61d3b5a 3
Michael J. Spencer 2:1df0b61d3b5a 4 #include <stdint.h>
Michael J. Spencer 2:1df0b61d3b5a 5
Michael J. Spencer 2:1df0b61d3b5a 6 #define DL_DEVICE 0x12
Michael J. Spencer 2:1df0b61d3b5a 7 #define DL_CONFIGURATION 0x09
Michael J. Spencer 2:1df0b61d3b5a 8 #define DL_INTERFACE 0x09
Michael J. Spencer 2:1df0b61d3b5a 9 #define DL_ENDPOINT 0x07
Michael J. Spencer 2:1df0b61d3b5a 10 #define DL_LANGUAGE 0x04
Michael J. Spencer 2:1df0b61d3b5a 11 #define DL_INTERFACE_ASSOCIATION 0x08
Michael J. Spencer 2:1df0b61d3b5a 12
Michael J. Spencer 2:1df0b61d3b5a 13 #define mA /2
Michael J. Spencer 2:1df0b61d3b5a 14
Michael J. Spencer 2:1df0b61d3b5a 15 #define DT_DEVICE 0x01
Michael J. Spencer 2:1df0b61d3b5a 16 #define DT_CONFIGURATION 0x02
Michael J. Spencer 2:1df0b61d3b5a 17 #define DT_STRING 0x03
Michael J. Spencer 2:1df0b61d3b5a 18 #define DT_LANGUAGE 0x03
Michael J. Spencer 2:1df0b61d3b5a 19 #define DT_INTERFACE 0x04
Michael J. Spencer 2:1df0b61d3b5a 20 #define DT_ENDPOINT 0x05
Michael J. Spencer 2:1df0b61d3b5a 21 #define DT_DEVICE_QUALIFIER 0x06
Michael J. Spencer 2:1df0b61d3b5a 22 #define DT_OTHER_SPEED 0x07
Michael J. Spencer 2:1df0b61d3b5a 23 #define DT_INTERFACE_POWER 0x08
Michael J. Spencer 2:1df0b61d3b5a 24 #define DT_OTG 0x09
Michael J. Spencer 2:1df0b61d3b5a 25 #define DT_DEBUG 0x0A
Michael J. Spencer 2:1df0b61d3b5a 26 #define DT_INTERFACE_ASSOCIATION 0x0B
Michael J. Spencer 2:1df0b61d3b5a 27
Michael J. Spencer 2:1df0b61d3b5a 28 #define USB_VERSION_1_0 0x0100
Michael J. Spencer 2:1df0b61d3b5a 29 #define USB_VERSION_1_1 0x0110
Michael J. Spencer 2:1df0b61d3b5a 30 #define USB_VERSION_2_0 0x0200
Michael J. Spencer 2:1df0b61d3b5a 31 #define USB_VERSION_3_0 0x0300
Michael J. Spencer 2:1df0b61d3b5a 32
Michael J. Spencer 2:1df0b61d3b5a 33 #define UC_PER_INTERFACE 0x00
Michael J. Spencer 2:1df0b61d3b5a 34 #define UC_AUDIO 0x01
Michael J. Spencer 2:1df0b61d3b5a 35 #define UC_COMM 0x02
Michael J. Spencer 2:1df0b61d3b5a 36 #define UC_HID 0x03
Michael J. Spencer 2:1df0b61d3b5a 37 #define UC_PHYSICAL 0x05
Michael J. Spencer 2:1df0b61d3b5a 38 #define UC_STILL_IMAGE 0x06
Michael J. Spencer 2:1df0b61d3b5a 39 #define UC_PRINTER 0x07
Michael J. Spencer 2:1df0b61d3b5a 40 #define UC_MASS_STORAGE 0x08
Michael J. Spencer 2:1df0b61d3b5a 41 #define UC_HUB 0x09
Michael J. Spencer 2:1df0b61d3b5a 42 #define UC_CDC_DATA 0x0A
Michael J. Spencer 2:1df0b61d3b5a 43 #define UC_CSCID 0x0B
Michael J. Spencer 2:1df0b61d3b5a 44 #define UC_CONTENT_SEC 0x0D
Michael J. Spencer 2:1df0b61d3b5a 45 #define UC_VIDEO 0x0E
Michael J. Spencer 2:1df0b61d3b5a 46 #define UC_WIRELESS_CONTROLLER 0xE0
Michael J. Spencer 2:1df0b61d3b5a 47 #define UC_MISC 0xEF
Michael J. Spencer 2:1df0b61d3b5a 48 #define UC_APP_SPEC 0xFE
Michael J. Spencer 2:1df0b61d3b5a 49 #define UC_VENDOR_SPEC 0xFF
Michael J. Spencer 2:1df0b61d3b5a 50
Michael J. Spencer 2:1df0b61d3b5a 51 #define SUBCLASS_IAD 0x02
Michael J. Spencer 2:1df0b61d3b5a 52 #define PROTOCOL_IAD 0x01
Michael J. Spencer 2:1df0b61d3b5a 53
Michael J. Spencer 2:1df0b61d3b5a 54 #define CA_BUSPOWERED 0x80
Michael J. Spencer 2:1df0b61d3b5a 55 #define CA_SELFPOWERED 0x40
Michael J. Spencer 2:1df0b61d3b5a 56 #define CA_REMOTEWAKEUP 0x20
Michael J. Spencer 2:1df0b61d3b5a 57
Michael J. Spencer 2:1df0b61d3b5a 58 #define EP_DIR_MASK 0x80
Michael J. Spencer 2:1df0b61d3b5a 59 #define EP_DIR_OUT 0x00
Michael J. Spencer 2:1df0b61d3b5a 60 #define EP_DIR_IN 0x80
Michael J. Spencer 2:1df0b61d3b5a 61
Michael J. Spencer 2:1df0b61d3b5a 62 #define EA_CONTROL 0x00
Michael J. Spencer 2:1df0b61d3b5a 63 #define EA_ISOCHRONOUS 0x01
Michael J. Spencer 2:1df0b61d3b5a 64 #define EA_BULK 0x02
Michael J. Spencer 2:1df0b61d3b5a 65 #define EA_INTERRUPT 0x03
Michael J. Spencer 2:1df0b61d3b5a 66
Michael J. Spencer 2:1df0b61d3b5a 67 #define EA_ISO_NONE 0x00
Michael J. Spencer 2:1df0b61d3b5a 68 #define EA_ISO_ASYNC 0x04
Michael J. Spencer 2:1df0b61d3b5a 69 #define EA_ISO_ADAPTIVE 0x08
Michael J. Spencer 2:1df0b61d3b5a 70 #define EA_ISO_SYNC 0x0C
Michael J. Spencer 2:1df0b61d3b5a 71
Michael J. Spencer 2:1df0b61d3b5a 72 #define EA_ISO_TYPE_DATA 0x00
Michael J. Spencer 2:1df0b61d3b5a 73 #define EA_ISO_TYPE_FEEDBACK 0x10
Michael J. Spencer 2:1df0b61d3b5a 74 #define EA_ISO_TYPE_EXPLICIT 0x20
Michael J. Spencer 2:1df0b61d3b5a 75
Michael J. Spencer 2:1df0b61d3b5a 76 #define SL_USENGLISH 0x0409
Michael J. Spencer 2:1df0b61d3b5a 77 #define SL_AUENGLISH 0x0C09
Michael J. Spencer 2:1df0b61d3b5a 78 #define SL_GERMAN 0x0407
Michael J. Spencer 2:1df0b61d3b5a 79
Michael J. Spencer 2:1df0b61d3b5a 80 #include "USBEndpoints.h"
Michael J. Spencer 2:1df0b61d3b5a 81
Michael J. Spencer 2:1df0b61d3b5a 82 typedef struct __attribute__ ((packed))
Michael J. Spencer 2:1df0b61d3b5a 83 {
Michael J. Spencer 2:1df0b61d3b5a 84 uint8_t bLength; // descriptor length
Michael J. Spencer 2:1df0b61d3b5a 85 uint8_t bDescType; // descriptor type: see DT_* defines
Michael J. Spencer 2:1df0b61d3b5a 86 }
Michael J. Spencer 2:1df0b61d3b5a 87 usbdesc_base;
Michael J. Spencer 2:1df0b61d3b5a 88
Michael J. Spencer 2:1df0b61d3b5a 89 typedef struct __attribute__ ((packed))
Michael J. Spencer 2:1df0b61d3b5a 90 {
Michael J. Spencer 2:1df0b61d3b5a 91 uint8_t bLength; // Device descriptor length (0x12)
Michael J. Spencer 2:1df0b61d3b5a 92 uint8_t bDescType; // DT_DEVICE (0x01)
Michael J. Spencer 2:1df0b61d3b5a 93 uint16_t bcdUSB; // USB Specification Number which device complies to - see USB_VERSION_* defines
Michael J. Spencer 2:1df0b61d3b5a 94 uint8_t bDeviceClass; // USB Device Class - see UC_* defines
Michael J. Spencer 2:1df0b61d3b5a 95 uint8_t bDeviceSubClass; // Subclass Code
Michael J. Spencer 2:1df0b61d3b5a 96 uint8_t bDeviceProtocol; // Protocol Code
Michael J. Spencer 2:1df0b61d3b5a 97 uint8_t bMaxPacketSize; // Maximum Packet Size for Zero Endpoint. Valid Sizes are 8, 16, 32, 64
Michael J. Spencer 2:1df0b61d3b5a 98 uint16_t idVendor; // Vendor ID
Michael J. Spencer 2:1df0b61d3b5a 99 uint16_t idProduct; // Product ID
Michael J. Spencer 2:1df0b61d3b5a 100 uint16_t bcdDevice; // Device Release Number
Michael J. Spencer 2:1df0b61d3b5a 101 uint8_t iManufacturer; // Index of Manufacturer String Descriptor
Michael J. Spencer 2:1df0b61d3b5a 102 uint8_t iProduct; // Index of Product String Descriptor
Michael J. Spencer 2:1df0b61d3b5a 103 uint8_t iSerialNumber; // Index of Serial Number String Descriptor
Michael J. Spencer 2:1df0b61d3b5a 104 uint8_t bNumConfigurations; // Number of Possible Configurations
Michael J. Spencer 2:1df0b61d3b5a 105 }
Michael J. Spencer 2:1df0b61d3b5a 106 usbdesc_device;
Michael J. Spencer 2:1df0b61d3b5a 107
Michael J. Spencer 2:1df0b61d3b5a 108 typedef struct __attribute__ ((packed))
Michael J. Spencer 2:1df0b61d3b5a 109 {
Michael J. Spencer 2:1df0b61d3b5a 110 uint8_t bLength; // Configuration Descriptor Length (0x09)
Michael J. Spencer 2:1df0b61d3b5a 111 uint8_t bDescType; // DT_CONFIGURATION (0x02)
Michael J. Spencer 2:1df0b61d3b5a 112 uint16_t wTotalLength; // Total length in bytes of this descriptor plus all this configuration's interfaces plus their endpoints, see http://www.beyondlogic.org/usbnutshell/confsize.gif
Michael J. Spencer 2:1df0b61d3b5a 113 uint8_t bNumInterfaces; // Number of Interfaces
Michael J. Spencer 2:1df0b61d3b5a 114 uint8_t bConfigurationValue; // Value that host uses to select this configuration
Michael J. Spencer 2:1df0b61d3b5a 115 uint8_t iConfiguration; // Index of String Descriptor describing this configuration
Michael J. Spencer 2:1df0b61d3b5a 116 uint8_t bmAttributes; // bitmap. see CA_* defines
Michael J. Spencer 2:1df0b61d3b5a 117 uint8_t bMaxPower; // Max. Current = bMaxPower * 2mA
Michael J. Spencer 2:1df0b61d3b5a 118 }
Michael J. Spencer 2:1df0b61d3b5a 119 usbdesc_configuration;
Michael J. Spencer 2:1df0b61d3b5a 120
Michael J. Spencer 2:1df0b61d3b5a 121 typedef struct __attribute__ ((packed))
Michael J. Spencer 2:1df0b61d3b5a 122 {
Michael J. Spencer 2:1df0b61d3b5a 123 uint8_t bLength; // Interface Descriptor Length (0x09)
Michael J. Spencer 2:1df0b61d3b5a 124 uint8_t bDescType; // DT_INTERFACE (0x04)
Michael J. Spencer 2:1df0b61d3b5a 125 uint8_t bInterfaceNumber; // Number of Interface
Michael J. Spencer 2:1df0b61d3b5a 126 uint8_t bAlternateSetting; // Value used to select alternative setting
Michael J. Spencer 2:1df0b61d3b5a 127
Michael J. Spencer 2:1df0b61d3b5a 128 uint8_t bNumEndPoints; // Number of Endpoints used for this interface
Michael J. Spencer 2:1df0b61d3b5a 129 uint8_t bInterfaceClass; // Class Code - see Device_Class_Enum
Michael J. Spencer 2:1df0b61d3b5a 130 uint8_t bInterfaceSubClass; // Subclass Code
Michael J. Spencer 2:1df0b61d3b5a 131 uint8_t bInterfaceProtocol; // Protocol Code
Michael J. Spencer 2:1df0b61d3b5a 132
Michael J. Spencer 2:1df0b61d3b5a 133 uint8_t iInterface; // Index of String Descriptor Describing this interface
Michael J. Spencer 2:1df0b61d3b5a 134 uint8_t selectedAlternate; // the currently selected alternate for this group of interfaces. Set on alternate 0 for easy lookups
Michael J. Spencer 2:1df0b61d3b5a 135 uint8_t dummy1; // pad to 32 bit boundary
Michael J. Spencer 2:1df0b61d3b5a 136 uint8_t dummy2; // pad to 32 bit boundary
Michael J. Spencer 2:1df0b61d3b5a 137
Michael J. Spencer 2:1df0b61d3b5a 138 USB_Class_Receiver *classReceiver; // who do we call when we receive a setup packet for this interface?
Michael J. Spencer 2:1df0b61d3b5a 139 }
Michael J. Spencer 2:1df0b61d3b5a 140 usbdesc_interface;
Michael J. Spencer 2:1df0b61d3b5a 141
Michael J. Spencer 2:1df0b61d3b5a 142 typedef struct __attribute__ ((packed))
Michael J. Spencer 2:1df0b61d3b5a 143 {
Michael J. Spencer 2:1df0b61d3b5a 144 uint8_t bLength; // Endpoint Descriptor Length (0x07)
Michael J. Spencer 2:1df0b61d3b5a 145 uint8_t bDescType; // DT_ENDPOINT (0x05)
Michael J. Spencer 2:1df0b61d3b5a 146 uint8_t bEndpointAddress; // 0x00-0x0F = OUT endpoints, 0x80-0x8F = IN endpoints
Michael J. Spencer 2:1df0b61d3b5a 147 uint8_t bmAttributes; // bitmap, see Endpoint_Attributes_Enum
Michael J. Spencer 2:1df0b61d3b5a 148
Michael J. Spencer 2:1df0b61d3b5a 149 uint16_t wMaxPacketSize; // Maximum Packet Size this endpoint is capable of sending or receiving
Michael J. Spencer 2:1df0b61d3b5a 150 uint8_t bInterval; // Interval for polling endpoint data transfers. Value in frame counts. Ignored for Bulk & Control Endpoints. Isochronous must equal 1 and field may range from 1 to 255 for interrupt endpoints.
Michael J. Spencer 2:1df0b61d3b5a 151 uint8_t dummy; // pad to 32 bit boundary
Michael J. Spencer 2:1df0b61d3b5a 152
Michael J. Spencer 2:1df0b61d3b5a 153 USB_Endpoint_Receiver *epReceiver; // Who do we call when something happens on this endpoint?
Michael J. Spencer 2:1df0b61d3b5a 154 }
Michael J. Spencer 2:1df0b61d3b5a 155 usbdesc_endpoint;
Michael J. Spencer 2:1df0b61d3b5a 156
Michael J. Spencer 2:1df0b61d3b5a 157 typedef struct __attribute__ ((packed))
Michael J. Spencer 2:1df0b61d3b5a 158 {
Michael J. Spencer 2:1df0b61d3b5a 159 uint8_t bLength; // String Descriptor Length (2 + 2*nLang)
Michael J. Spencer 2:1df0b61d3b5a 160 uint8_t bDescType; // DT_STRING (0x03)
Michael J. Spencer 2:1df0b61d3b5a 161 uint16_t wLangID[1]; // language code(s)
Michael J. Spencer 2:1df0b61d3b5a 162 }
Michael J. Spencer 2:1df0b61d3b5a 163 usbdesc_language;
Michael J. Spencer 2:1df0b61d3b5a 164
Michael J. Spencer 2:1df0b61d3b5a 165 typedef struct __attribute__ ((packed))
Michael J. Spencer 2:1df0b61d3b5a 166 {
Michael J. Spencer 2:1df0b61d3b5a 167 uint8_t bLength; // 2 + strlen
Michael J. Spencer 2:1df0b61d3b5a 168 uint8_t bDescType; // DT_STRING (0x03)
Michael J. Spencer 2:1df0b61d3b5a 169 uint16_t str[]; // UNICODE string
Michael J. Spencer 2:1df0b61d3b5a 170 }
Michael J. Spencer 2:1df0b61d3b5a 171 usbdesc_string;
Michael J. Spencer 2:1df0b61d3b5a 172
Michael J. Spencer 2:1df0b61d3b5a 173 #define usbdesc_string_l(l) struct __attribute__ ((packed)) { uint8_t bLength; uint8_t bDescType; char16_t str[l]; }
Michael J. Spencer 2:1df0b61d3b5a 174
Michael J. Spencer 2:1df0b61d3b5a 175 #define usbstring(string) { sizeof(u ## string), DT_STRING, { u ## string } }
Michael J. Spencer 2:1df0b61d3b5a 176
Michael J. Spencer 2:1df0b61d3b5a 177 #define usbstring_init(name, string) struct __attribute__ ((packed)) { const uint8_t bLength; const uint8_t bDescType; char16_t str[sizeof(string)]; } name = { sizeof(u ## string), DT_STRING, { u ## string } }
Michael J. Spencer 2:1df0b61d3b5a 178
Michael J. Spencer 2:1df0b61d3b5a 179 #define usbstring_const_init(name, string) const struct __attribute__ ((packed)) { const uint8_t bLength; const uint8_t bDescType; const char16_t str[sizeof(string)]; } name = { sizeof(u ## string), DT_STRING, { u ## string } }
Michael J. Spencer 2:1df0b61d3b5a 180
Michael J. Spencer 2:1df0b61d3b5a 181 typedef struct __attribute__ ((packed))
Michael J. Spencer 2:1df0b61d3b5a 182 {
Michael J. Spencer 2:1df0b61d3b5a 183 uint8_t bLength;
Michael J. Spencer 2:1df0b61d3b5a 184 uint8_t bDescType;
Michael J. Spencer 2:1df0b61d3b5a 185 uint8_t bFirstInterface; // interface index of the first interface for this function
Michael J. Spencer 2:1df0b61d3b5a 186 uint8_t bInterfaceCount; // number of contiguous interfaces used with this function
Michael J. Spencer 2:1df0b61d3b5a 187 uint8_t bFunctionClass; // Class code - see Device descriptor
Michael J. Spencer 2:1df0b61d3b5a 188 uint8_t bFunctionSubClass; // Subclass code
Michael J. Spencer 2:1df0b61d3b5a 189 uint8_t bFunctionProtocol; // Protocol code
Michael J. Spencer 2:1df0b61d3b5a 190 uint8_t iFunction; // function name string
Michael J. Spencer 2:1df0b61d3b5a 191 }
Michael J. Spencer 2:1df0b61d3b5a 192 usbdesc_iad;
Michael J. Spencer 2:1df0b61d3b5a 193
Michael J. Spencer 2:1df0b61d3b5a 194 #endif /* _DESCRIPTOR_H */