A more capable USB Host. The API supports synchronous and Asynchronous control, interrupt and bulk transfers. It has built in support for hubs and hot plugging. It can support any number of devices and endpoints limited only by sram. The test shell supports mouse, keyboard and mass storage/fat.

Dependencies:   mbed

Committer:
peterbarrett1967
Date:
Fri Apr 02 22:28:01 2010 +0000
Revision:
0:5ad808014a49

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
peterbarrett1967 0:5ad808014a49 1
peterbarrett1967 0:5ad808014a49 2 /*
peterbarrett1967 0:5ad808014a49 3 Copyright (c) 2010 Peter Barrett
peterbarrett1967 0:5ad808014a49 4
peterbarrett1967 0:5ad808014a49 5 Permission is hereby granted, free of charge, to any person obtaining a copy
peterbarrett1967 0:5ad808014a49 6 of this software and associated documentation files (the "Software"), to deal
peterbarrett1967 0:5ad808014a49 7 in the Software without restriction, including without limitation the rights
peterbarrett1967 0:5ad808014a49 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
peterbarrett1967 0:5ad808014a49 9 copies of the Software, and to permit persons to whom the Software is
peterbarrett1967 0:5ad808014a49 10 furnished to do so, subject to the following conditions:
peterbarrett1967 0:5ad808014a49 11
peterbarrett1967 0:5ad808014a49 12 The above copyright notice and this permission notice shall be included in
peterbarrett1967 0:5ad808014a49 13 all copies or substantial portions of the Software.
peterbarrett1967 0:5ad808014a49 14
peterbarrett1967 0:5ad808014a49 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
peterbarrett1967 0:5ad808014a49 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
peterbarrett1967 0:5ad808014a49 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
peterbarrett1967 0:5ad808014a49 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
peterbarrett1967 0:5ad808014a49 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
peterbarrett1967 0:5ad808014a49 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
peterbarrett1967 0:5ad808014a49 21 THE SOFTWARE.
peterbarrett1967 0:5ad808014a49 22 */
peterbarrett1967 0:5ad808014a49 23
peterbarrett1967 0:5ad808014a49 24 #ifndef USBHOST_H
peterbarrett1967 0:5ad808014a49 25 #define USBHOST_H
peterbarrett1967 0:5ad808014a49 26
peterbarrett1967 0:5ad808014a49 27 #ifndef u8
peterbarrett1967 0:5ad808014a49 28 typedef unsigned char u8;
peterbarrett1967 0:5ad808014a49 29 typedef unsigned short u16;
peterbarrett1967 0:5ad808014a49 30 typedef unsigned long u32;
peterbarrett1967 0:5ad808014a49 31
peterbarrett1967 0:5ad808014a49 32 typedef char s8;
peterbarrett1967 0:5ad808014a49 33 typedef short s16;
peterbarrett1967 0:5ad808014a49 34 typedef char s32;
peterbarrett1967 0:5ad808014a49 35 #endif
peterbarrett1967 0:5ad808014a49 36
peterbarrett1967 0:5ad808014a49 37 #define ENDPOINT_CONTROL 0
peterbarrett1967 0:5ad808014a49 38 #define ENDPOINT_ISOCRONOUS 1
peterbarrett1967 0:5ad808014a49 39 #define ENDPOINT_BULK 2
peterbarrett1967 0:5ad808014a49 40 #define ENDPOINT_INTERRUPT 3
peterbarrett1967 0:5ad808014a49 41
peterbarrett1967 0:5ad808014a49 42 #define DESCRIPTOR_TYPE_DEVICE 1
peterbarrett1967 0:5ad808014a49 43 #define DESCRIPTOR_TYPE_CONFIGURATION 2
peterbarrett1967 0:5ad808014a49 44 #define DESCRIPTOR_TYPE_STRING 3
peterbarrett1967 0:5ad808014a49 45 #define DESCRIPTOR_TYPE_INTERFACE 4
peterbarrett1967 0:5ad808014a49 46 #define DESCRIPTOR_TYPE_ENDPOINT 5
peterbarrett1967 0:5ad808014a49 47
peterbarrett1967 0:5ad808014a49 48 #define DESCRIPTOR_TYPE_HID 0x21
peterbarrett1967 0:5ad808014a49 49 #define DESCRIPTOR_TYPE_REPORT 0x22
peterbarrett1967 0:5ad808014a49 50 #define DESCRIPTOR_TYPE_PHYSICAL 0x23
peterbarrett1967 0:5ad808014a49 51 #define DESCRIPTOR_TYPE_HUB 0x29
peterbarrett1967 0:5ad808014a49 52
peterbarrett1967 0:5ad808014a49 53 enum USB_CLASS_CODE
peterbarrett1967 0:5ad808014a49 54 {
peterbarrett1967 0:5ad808014a49 55 CLASS_DEVICE,
peterbarrett1967 0:5ad808014a49 56 CLASS_AUDIO,
peterbarrett1967 0:5ad808014a49 57 CLASS_COMM_AND_CDC_CONTROL,
peterbarrett1967 0:5ad808014a49 58 CLASS_HID,
peterbarrett1967 0:5ad808014a49 59 CLASS_PHYSICAL = 0x05,
peterbarrett1967 0:5ad808014a49 60 CLASS_STILL_IMAGING,
peterbarrett1967 0:5ad808014a49 61 CLASS_PRINTER,
peterbarrett1967 0:5ad808014a49 62 CLASS_MASS_STORAGE,
peterbarrett1967 0:5ad808014a49 63 CLASS_HUB,
peterbarrett1967 0:5ad808014a49 64 CLASS_CDC_DATA,
peterbarrett1967 0:5ad808014a49 65 CLASS_SMART_CARD,
peterbarrett1967 0:5ad808014a49 66 CLASS_CONTENT_SECURITY = 0x0D,
peterbarrett1967 0:5ad808014a49 67 CLASS_VIDEO = 0x0E,
peterbarrett1967 0:5ad808014a49 68 CLASS_DIAGNOSTIC_DEVICE = 0xDC,
peterbarrett1967 0:5ad808014a49 69 CLASS_WIRELESS_CONTROLLER = 0xE0,
peterbarrett1967 0:5ad808014a49 70 CLASS_MISCELLANEOUS = 0xEF,
peterbarrett1967 0:5ad808014a49 71 CLASS_APP_SPECIFIC = 0xFE,
peterbarrett1967 0:5ad808014a49 72 CLASS_VENDOR_SPECIFIC = 0xFF
peterbarrett1967 0:5ad808014a49 73 };
peterbarrett1967 0:5ad808014a49 74
peterbarrett1967 0:5ad808014a49 75 #define DEVICE_TO_HOST 0x80
peterbarrett1967 0:5ad808014a49 76 #define HOST_TO_DEVICE 0x00
peterbarrett1967 0:5ad808014a49 77 #define REQUEST_TYPE_CLASS 0x20
peterbarrett1967 0:5ad808014a49 78 #define RECIPIENT_DEVICE 0x00
peterbarrett1967 0:5ad808014a49 79 #define RECIPIENT_INTERFACE 0x01
peterbarrett1967 0:5ad808014a49 80 #define RECIPIENT_ENDPOINT 0x02
peterbarrett1967 0:5ad808014a49 81 #define RECIPIENT_OTHER 0x03
peterbarrett1967 0:5ad808014a49 82
peterbarrett1967 0:5ad808014a49 83 #define GET_STATUS 0
peterbarrett1967 0:5ad808014a49 84 #define CLEAR_FEATURE 1
peterbarrett1967 0:5ad808014a49 85 #define SET_FEATURE 3
peterbarrett1967 0:5ad808014a49 86 #define SET_ADDRESS 5
peterbarrett1967 0:5ad808014a49 87 #define GET_DESCRIPTOR 6
peterbarrett1967 0:5ad808014a49 88 #define SET_DESCRIPTOR 7
peterbarrett1967 0:5ad808014a49 89 #define GET_CONFIGURATION 8
peterbarrett1967 0:5ad808014a49 90 #define SET_CONFIGURATION 9
peterbarrett1967 0:5ad808014a49 91 #define GET_INTERFACE 10
peterbarrett1967 0:5ad808014a49 92 #define SET_INTERFACE 11
peterbarrett1967 0:5ad808014a49 93 #define SYNCH_FRAME 11
peterbarrett1967 0:5ad808014a49 94
peterbarrett1967 0:5ad808014a49 95 // -5 is nak
peterbarrett1967 0:5ad808014a49 96 /*
peterbarrett1967 0:5ad808014a49 97 0010 ACK Handshake
peterbarrett1967 0:5ad808014a49 98 1010 NAK Handshake
peterbarrett1967 0:5ad808014a49 99 1110 STALL Handshake
peterbarrett1967 0:5ad808014a49 100 0110 NYET (No Response Yet)
peterbarrett1967 0:5ad808014a49 101 */
peterbarrett1967 0:5ad808014a49 102
peterbarrett1967 0:5ad808014a49 103 #define IO_PENDING -100
peterbarrett1967 0:5ad808014a49 104 #define ERR_ENDPOINT_NONE_LEFT -101
peterbarrett1967 0:5ad808014a49 105 #define ERR_ENDPOINT_NOT_FOUND -102
peterbarrett1967 0:5ad808014a49 106 #define ERR_DEVICE_NOT_FOUND -103
peterbarrett1967 0:5ad808014a49 107 #define ERR_DEVICE_NONE_LEFT -104
peterbarrett1967 0:5ad808014a49 108 #define ERR_HUB_INIT_FAILED -105
peterbarrett1967 0:5ad808014a49 109 #define ERR_INTERFACE_NOT_FOUND -106
peterbarrett1967 0:5ad808014a49 110
peterbarrett1967 0:5ad808014a49 111 typedef struct
peterbarrett1967 0:5ad808014a49 112 {
peterbarrett1967 0:5ad808014a49 113 u8 bLength;
peterbarrett1967 0:5ad808014a49 114 u8 bDescriptorType;
peterbarrett1967 0:5ad808014a49 115 u16 bcdUSB;
peterbarrett1967 0:5ad808014a49 116 u8 bDeviceClass;
peterbarrett1967 0:5ad808014a49 117 u8 bDeviceSubClass;
peterbarrett1967 0:5ad808014a49 118 u8 bDeviceProtocol;
peterbarrett1967 0:5ad808014a49 119 u8 bMaxPacketSize;
peterbarrett1967 0:5ad808014a49 120 u16 idVendor;
peterbarrett1967 0:5ad808014a49 121 u16 idProduct;
peterbarrett1967 0:5ad808014a49 122 u16 bcdDevice; // version
peterbarrett1967 0:5ad808014a49 123 u8 iManufacturer;
peterbarrett1967 0:5ad808014a49 124 u8 iProduct;
peterbarrett1967 0:5ad808014a49 125 u8 iSerialNumber;
peterbarrett1967 0:5ad808014a49 126 u8 bNumConfigurations;
peterbarrett1967 0:5ad808014a49 127 } DeviceDescriptor; // 16 bytes
peterbarrett1967 0:5ad808014a49 128
peterbarrett1967 0:5ad808014a49 129 typedef struct
peterbarrett1967 0:5ad808014a49 130 {
peterbarrett1967 0:5ad808014a49 131 u8 bLength;
peterbarrett1967 0:5ad808014a49 132 u8 bDescriptorType;
peterbarrett1967 0:5ad808014a49 133 u16 wTotalLength;
peterbarrett1967 0:5ad808014a49 134 u8 bNumInterfaces;
peterbarrett1967 0:5ad808014a49 135 u8 bConfigurationValue; // Value to use as an argument to select this configuration
peterbarrett1967 0:5ad808014a49 136 u8 iConfiguration; // Index of String Descriptor describing this configuration
peterbarrett1967 0:5ad808014a49 137 u8 bmAttributes; // Bitmap D7 Reserved, set to 1. (USB 1.0 Bus Powered),D6 Self Powered,D5 Remote Wakeup,D4..0 = 0
peterbarrett1967 0:5ad808014a49 138 u8 bMaxPower; // Maximum Power Consumption in 2mA units
peterbarrett1967 0:5ad808014a49 139 } ConfigurationDescriptor;
peterbarrett1967 0:5ad808014a49 140
peterbarrett1967 0:5ad808014a49 141 typedef struct
peterbarrett1967 0:5ad808014a49 142 {
peterbarrett1967 0:5ad808014a49 143 u8 bLength;
peterbarrett1967 0:5ad808014a49 144 u8 bDescriptorType;
peterbarrett1967 0:5ad808014a49 145 u8 bInterfaceNumber;
peterbarrett1967 0:5ad808014a49 146 u8 bAlternateSetting;
peterbarrett1967 0:5ad808014a49 147 u8 bNumEndpoints;
peterbarrett1967 0:5ad808014a49 148 u8 bInterfaceClass;
peterbarrett1967 0:5ad808014a49 149 u8 bInterfaceSubClass;
peterbarrett1967 0:5ad808014a49 150 u8 bInterfaceProtocol;
peterbarrett1967 0:5ad808014a49 151 u8 iInterface; // Index of String Descriptor Describing this interface
peterbarrett1967 0:5ad808014a49 152 } InterfaceDescriptor;
peterbarrett1967 0:5ad808014a49 153
peterbarrett1967 0:5ad808014a49 154 typedef struct
peterbarrett1967 0:5ad808014a49 155 {
peterbarrett1967 0:5ad808014a49 156 u8 bLength;
peterbarrett1967 0:5ad808014a49 157 u8 bDescriptorType;
peterbarrett1967 0:5ad808014a49 158 u8 bEndpointAddress; // Bits 0:3 endpoint, Bits 7 Direction 0 = Out, 1 = In (Ignored for Control Endpoints)
peterbarrett1967 0:5ad808014a49 159 u8 bmAttributes; // Bits 0:1 00 = Control, 01 = Isochronous, 10 = Bulk, 11 = Interrupt
peterbarrett1967 0:5ad808014a49 160 u16 wMaxPacketSize;
peterbarrett1967 0:5ad808014a49 161 u8 bInterval; // Interval for polling endpoint data transfers.
peterbarrett1967 0:5ad808014a49 162 } EndpointDescriptor;
peterbarrett1967 0:5ad808014a49 163
peterbarrett1967 0:5ad808014a49 164 typedef struct {
peterbarrett1967 0:5ad808014a49 165 u8 bLength;
peterbarrett1967 0:5ad808014a49 166 u8 bDescriptorType;
peterbarrett1967 0:5ad808014a49 167 u16 bcdHID;
peterbarrett1967 0:5ad808014a49 168 u8 bCountryCode;
peterbarrett1967 0:5ad808014a49 169 u8 bNumDescriptors;
peterbarrett1967 0:5ad808014a49 170 u8 bDescriptorType2;
peterbarrett1967 0:5ad808014a49 171 u16 wDescriptorLength;
peterbarrett1967 0:5ad808014a49 172 } HIDDescriptor;
peterbarrett1967 0:5ad808014a49 173
peterbarrett1967 0:5ad808014a49 174 //============================================================================
peterbarrett1967 0:5ad808014a49 175 //============================================================================
peterbarrett1967 0:5ad808014a49 176
peterbarrett1967 0:5ad808014a49 177
peterbarrett1967 0:5ad808014a49 178 void USBInit();
peterbarrett1967 0:5ad808014a49 179 void USBLoop();
peterbarrett1967 0:5ad808014a49 180 u8* USBGetBuffer(u32* len);
peterbarrett1967 0:5ad808014a49 181
peterbarrett1967 0:5ad808014a49 182 // Optional callback for transfers, called at interrupt time
peterbarrett1967 0:5ad808014a49 183 typedef void (*USBCallback)(int device, int endpoint, int status, u8* data, int len, void* userData);
peterbarrett1967 0:5ad808014a49 184
peterbarrett1967 0:5ad808014a49 185 // Transfers
peterbarrett1967 0:5ad808014a49 186 int USBControlTransfer(int device, int request_type, int request, int value, int index, u8* data, int length, USBCallback callback = 0, void* userData = 0);
peterbarrett1967 0:5ad808014a49 187 int USBInterruptTransfer(int device, int ep, u8* data, int length, USBCallback callback = 0, void* userData = 0);
peterbarrett1967 0:5ad808014a49 188 int USBBulkTransfer(int device, int ep, u8* data, int length, USBCallback callback = 0, void* userData = 0);
peterbarrett1967 0:5ad808014a49 189
peterbarrett1967 0:5ad808014a49 190 // Standard Device methods
peterbarrett1967 0:5ad808014a49 191 int GetDescriptor(int device, int descType, int descIndex, u8* data, int length);
peterbarrett1967 0:5ad808014a49 192 int GetString(int device, int index, char* dst, int length);
peterbarrett1967 0:5ad808014a49 193 int SetAddress(int device, int new_addr);
peterbarrett1967 0:5ad808014a49 194 int SetConfiguration(int device, int configNum);
peterbarrett1967 0:5ad808014a49 195 int SetInterface(int device, int ifNum, int altNum);
peterbarrett1967 0:5ad808014a49 196
peterbarrett1967 0:5ad808014a49 197 // Implemented to notify app of the arrival of a device
peterbarrett1967 0:5ad808014a49 198 void OnLoadDevice(int device, DeviceDescriptor* deviceDesc, InterfaceDescriptor* interfaceDesc);
peterbarrett1967 0:5ad808014a49 199
peterbarrett1967 0:5ad808014a49 200 #endif