1 /** @file 2 Support for USB 2.0 standard. 3 4 Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #ifndef __USB_H__ 16 #define __USB_H__ 17 18 // 19 // Subset of Class and Subclass definitions from USB Specs 20 // 21 22 // 23 // Usb mass storage class code 24 // 25 #define USB_MASS_STORE_CLASS 0x08 26 27 // 28 // Usb mass storage subclass code, specify the command set used. 29 // 30 #define USB_MASS_STORE_RBC 0x01 ///< Reduced Block Commands 31 #define USB_MASS_STORE_8020I 0x02 ///< SFF-8020i, typically a CD/DVD device 32 #define USB_MASS_STORE_QIC 0x03 ///< Typically a tape device 33 #define USB_MASS_STORE_UFI 0x04 ///< Typically a floppy disk driver device 34 #define USB_MASS_STORE_8070I 0x05 ///< SFF-8070i, typically a floppy disk driver device. 35 #define USB_MASS_STORE_SCSI 0x06 ///< SCSI transparent command set 36 37 // 38 // Usb mass storage protocol code, specify the transport protocol 39 // 40 #define USB_MASS_STORE_CBI0 0x00 ///< CBI protocol with command completion interrupt 41 #define USB_MASS_STORE_CBI1 0x01 ///< CBI protocol without command completion interrupt 42 #define USB_MASS_STORE_BOT 0x50 ///< Bulk-Only Transport 43 44 // 45 // Standard device request and request type 46 // USB 2.0 spec, Section 9.4 47 // 48 #define USB_DEV_GET_STATUS 0x00 49 #define USB_DEV_GET_STATUS_REQ_TYPE_D 0x80 // Receiver : Device 50 #define USB_DEV_GET_STATUS_REQ_TYPE_I 0x81 // Receiver : Interface 51 #define USB_DEV_GET_STATUS_REQ_TYPE_E 0x82 // Receiver : Endpoint 52 53 #define USB_DEV_CLEAR_FEATURE 0x01 54 #define USB_DEV_CLEAR_FEATURE_REQ_TYPE_D 0x00 // Receiver : Device 55 #define USB_DEV_CLEAR_FEATURE_REQ_TYPE_I 0x01 // Receiver : Interface 56 #define USB_DEV_CLEAR_FEATURE_REQ_TYPE_E 0x02 // Receiver : Endpoint 57 58 #define USB_DEV_SET_FEATURE 0x03 59 #define USB_DEV_SET_FEATURE_REQ_TYPE_D 0x00 // Receiver : Device 60 #define USB_DEV_SET_FEATURE_REQ_TYPE_I 0x01 // Receiver : Interface 61 #define USB_DEV_SET_FEATURE_REQ_TYPE_E 0x02 // Receiver : Endpoint 62 63 #define USB_DEV_SET_ADDRESS 0x05 64 #define USB_DEV_SET_ADDRESS_REQ_TYPE 0x00 65 66 #define USB_DEV_GET_DESCRIPTOR 0x06 67 #define USB_DEV_GET_DESCRIPTOR_REQ_TYPE 0x80 68 69 #define USB_DEV_SET_DESCRIPTOR 0x07 70 #define USB_DEV_SET_DESCRIPTOR_REQ_TYPE 0x00 71 72 #define USB_DEV_GET_CONFIGURATION 0x08 73 #define USB_DEV_GET_CONFIGURATION_REQ_TYPE 0x80 74 75 #define USB_DEV_SET_CONFIGURATION 0x09 76 #define USB_DEV_SET_CONFIGURATION_REQ_TYPE 0x00 77 78 #define USB_DEV_GET_INTERFACE 0x0A 79 #define USB_DEV_GET_INTERFACE_REQ_TYPE 0x81 80 81 #define USB_DEV_SET_INTERFACE 0x0B 82 #define USB_DEV_SET_INTERFACE_REQ_TYPE 0x01 83 84 #define USB_DEV_SYNCH_FRAME 0x0C 85 #define USB_DEV_SYNCH_FRAME_REQ_TYPE 0x82 86 87 88 // 89 // USB standard descriptors and reqeust 90 // 91 #pragma pack(1) 92 93 /// 94 /// Format of Setup Data for USB Device Requests 95 /// USB 2.0 spec, Section 9.3 96 /// 97 typedef struct { 98 UINT8 RequestType; 99 UINT8 Request; 100 UINT16 Value; 101 UINT16 Index; 102 UINT16 Length; 103 } USB_DEVICE_REQUEST; 104 105 /// 106 /// Standard Device Descriptor 107 /// USB 2.0 spec, Section 9.6.1 108 /// 109 typedef struct { 110 UINT8 Length; 111 UINT8 DescriptorType; 112 UINT16 BcdUSB; 113 UINT8 DeviceClass; 114 UINT8 DeviceSubClass; 115 UINT8 DeviceProtocol; 116 UINT8 MaxPacketSize0; 117 UINT16 IdVendor; 118 UINT16 IdProduct; 119 UINT16 BcdDevice; 120 UINT8 StrManufacturer; 121 UINT8 StrProduct; 122 UINT8 StrSerialNumber; 123 UINT8 NumConfigurations; 124 } USB_DEVICE_DESCRIPTOR; 125 126 /// 127 /// Standard Configuration Descriptor 128 /// USB 2.0 spec, Section 9.6.3 129 /// 130 typedef struct { 131 UINT8 Length; 132 UINT8 DescriptorType; 133 UINT16 TotalLength; 134 UINT8 NumInterfaces; 135 UINT8 ConfigurationValue; 136 UINT8 Configuration; 137 UINT8 Attributes; 138 UINT8 MaxPower; 139 } USB_CONFIG_DESCRIPTOR; 140 141 /// 142 /// Standard Interface Descriptor 143 /// USB 2.0 spec, Section 9.6.5 144 /// 145 typedef struct { 146 UINT8 Length; 147 UINT8 DescriptorType; 148 UINT8 InterfaceNumber; 149 UINT8 AlternateSetting; 150 UINT8 NumEndpoints; 151 UINT8 InterfaceClass; 152 UINT8 InterfaceSubClass; 153 UINT8 InterfaceProtocol; 154 UINT8 Interface; 155 } USB_INTERFACE_DESCRIPTOR; 156 157 /// 158 /// Standard Endpoint Descriptor 159 /// USB 2.0 spec, Section 9.6.6 160 /// 161 typedef struct { 162 UINT8 Length; 163 UINT8 DescriptorType; 164 UINT8 EndpointAddress; 165 UINT8 Attributes; 166 UINT16 MaxPacketSize; 167 UINT8 Interval; 168 } USB_ENDPOINT_DESCRIPTOR; 169 170 /// 171 /// UNICODE String Descriptor 172 /// USB 2.0 spec, Section 9.6.7 173 /// 174 typedef struct { 175 UINT8 Length; 176 UINT8 DescriptorType; 177 CHAR16 String[1]; 178 } EFI_USB_STRING_DESCRIPTOR; 179 180 #pragma pack() 181 182 183 typedef enum { 184 // 185 // USB request type 186 // 187 USB_REQ_TYPE_STANDARD = (0x00 << 5), 188 USB_REQ_TYPE_CLASS = (0x01 << 5), 189 USB_REQ_TYPE_VENDOR = (0x02 << 5), 190 191 // 192 // Standard control transfer request type, or the value 193 // to fill in EFI_USB_DEVICE_REQUEST.Request 194 // 195 USB_REQ_GET_STATUS = 0x00, 196 USB_REQ_CLEAR_FEATURE = 0x01, 197 USB_REQ_SET_FEATURE = 0x03, 198 USB_REQ_SET_ADDRESS = 0x05, 199 USB_REQ_GET_DESCRIPTOR = 0x06, 200 USB_REQ_SET_DESCRIPTOR = 0x07, 201 USB_REQ_GET_CONFIG = 0x08, 202 USB_REQ_SET_CONFIG = 0x09, 203 USB_REQ_GET_INTERFACE = 0x0A, 204 USB_REQ_SET_INTERFACE = 0x0B, 205 USB_REQ_SYNCH_FRAME = 0x0C, 206 207 // 208 // Usb control transfer target 209 // 210 USB_TARGET_DEVICE = 0, 211 USB_TARGET_INTERFACE = 0x01, 212 USB_TARGET_ENDPOINT = 0x02, 213 USB_TARGET_OTHER = 0x03, 214 215 // 216 // USB Descriptor types 217 // 218 USB_DESC_TYPE_DEVICE = 0x01, 219 USB_DESC_TYPE_CONFIG = 0x02, 220 USB_DESC_TYPE_STRING = 0x03, 221 USB_DESC_TYPE_INTERFACE = 0x04, 222 USB_DESC_TYPE_ENDPOINT = 0x05, 223 USB_DESC_TYPE_HID = 0x21, 224 USB_DESC_TYPE_REPORT = 0x22, 225 226 // 227 // Features to be cleared by CLEAR_FEATURE requests 228 // 229 USB_FEATURE_ENDPOINT_HALT = 0, 230 231 // 232 // USB endpoint types: 00: control, 01: isochronous, 10: bulk, 11: interrupt 233 // 234 USB_ENDPOINT_CONTROL = 0x00, 235 USB_ENDPOINT_ISO = 0x01, 236 USB_ENDPOINT_BULK = 0x02, 237 USB_ENDPOINT_INTERRUPT = 0x03, 238 239 USB_ENDPOINT_TYPE_MASK = 0x03, 240 USB_ENDPOINT_DIR_IN = 0x80, 241 242 // 243 //Use 200 ms to increase the error handling response time 244 // 245 EFI_USB_INTERRUPT_DELAY = 2000000 246 } USB_TYPES_DEFINITION; 247 248 249 // 250 // HID constants definition, see Device Class Definition 251 // for Human Interface Devices (HID) rev1.11 252 // 253 254 // 255 // HID standard GET_DESCRIPTOR request. 256 // 257 #define USB_HID_GET_DESCRIPTOR_REQ_TYPE 0x81 258 259 // 260 // HID specific requests. 261 // 262 #define USB_HID_CLASS_GET_REQ_TYPE 0xa1 263 #define USB_HID_CLASS_SET_REQ_TYPE 0x21 264 265 // 266 // HID report item format 267 // 268 #define HID_ITEM_FORMAT_SHORT 0 269 #define HID_ITEM_FORMAT_LONG 1 270 271 // 272 // Special tag indicating long items 273 // 274 #define HID_ITEM_TAG_LONG 15 275 276 // 277 // HID report descriptor item type (prefix bit 2,3) 278 // 279 #define HID_ITEM_TYPE_MAIN 0 280 #define HID_ITEM_TYPE_GLOBAL 1 281 #define HID_ITEM_TYPE_LOCAL 2 282 #define HID_ITEM_TYPE_RESERVED 3 283 284 // 285 // HID report descriptor main item tags 286 // 287 #define HID_MAIN_ITEM_TAG_INPUT 8 288 #define HID_MAIN_ITEM_TAG_OUTPUT 9 289 #define HID_MAIN_ITEM_TAG_FEATURE 11 290 #define HID_MAIN_ITEM_TAG_BEGIN_COLLECTION 10 291 #define HID_MAIN_ITEM_TAG_END_COLLECTION 12 292 293 // 294 // HID report descriptor main item contents 295 // 296 #define HID_MAIN_ITEM_CONSTANT 0x001 297 #define HID_MAIN_ITEM_VARIABLE 0x002 298 #define HID_MAIN_ITEM_RELATIVE 0x004 299 #define HID_MAIN_ITEM_WRAP 0x008 300 #define HID_MAIN_ITEM_NONLINEAR 0x010 301 #define HID_MAIN_ITEM_NO_PREFERRED 0x020 302 #define HID_MAIN_ITEM_NULL_STATE 0x040 303 #define HID_MAIN_ITEM_VOLATILE 0x080 304 #define HID_MAIN_ITEM_BUFFERED_BYTE 0x100 305 306 // 307 // HID report descriptor collection item types 308 // 309 #define HID_COLLECTION_PHYSICAL 0 310 #define HID_COLLECTION_APPLICATION 1 311 #define HID_COLLECTION_LOGICAL 2 312 313 // 314 // HID report descriptor global item tags 315 // 316 #define HID_GLOBAL_ITEM_TAG_USAGE_PAGE 0 317 #define HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM 1 318 #define HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM 2 319 #define HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM 3 320 #define HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM 4 321 #define HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT 5 322 #define HID_GLOBAL_ITEM_TAG_UNIT 6 323 #define HID_GLOBAL_ITEM_TAG_REPORT_SIZE 7 324 #define HID_GLOBAL_ITEM_TAG_REPORT_ID 8 325 #define HID_GLOBAL_ITEM_TAG_REPORT_COUNT 9 326 #define HID_GLOBAL_ITEM_TAG_PUSH 10 327 #define HID_GLOBAL_ITEM_TAG_POP 11 328 329 // 330 // HID report descriptor local item tags 331 // 332 #define HID_LOCAL_ITEM_TAG_USAGE 0 333 #define HID_LOCAL_ITEM_TAG_USAGE_MINIMUM 1 334 #define HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM 2 335 #define HID_LOCAL_ITEM_TAG_DESIGNATOR_INDEX 3 336 #define HID_LOCAL_ITEM_TAG_DESIGNATOR_MINIMUM 4 337 #define HID_LOCAL_ITEM_TAG_DESIGNATOR_MAXIMUM 5 338 #define HID_LOCAL_ITEM_TAG_STRING_INDEX 7 339 #define HID_LOCAL_ITEM_TAG_STRING_MINIMUM 8 340 #define HID_LOCAL_ITEM_TAG_STRING_MAXIMUM 9 341 #define HID_LOCAL_ITEM_TAG_DELIMITER 10 342 343 // 344 // HID report types 345 // 346 #define HID_INPUT_REPORT 1 347 #define HID_OUTPUT_REPORT 2 348 #define HID_FEATURE_REPORT 3 349 350 // 351 // HID class protocol request 352 // 353 #define EFI_USB_GET_REPORT_REQUEST 0x01 354 #define EFI_USB_GET_IDLE_REQUEST 0x02 355 #define EFI_USB_GET_PROTOCOL_REQUEST 0x03 356 #define EFI_USB_SET_REPORT_REQUEST 0x09 357 #define EFI_USB_SET_IDLE_REQUEST 0x0a 358 #define EFI_USB_SET_PROTOCOL_REQUEST 0x0b 359 360 #pragma pack(1) 361 /// 362 /// Descriptor header for Report/Physical Descriptors 363 /// HID 1.1, section 6.2.1 364 /// 365 typedef struct hid_class_descriptor { 366 UINT8 DescriptorType; 367 UINT16 DescriptorLength; 368 } EFI_USB_HID_CLASS_DESCRIPTOR; 369 370 /// 371 /// The HID descriptor identifies the length and type 372 /// of subordinate descriptors for a device. 373 /// HID 1.1, section 6.2.1 374 /// 375 typedef struct hid_descriptor { 376 UINT8 Length; 377 UINT8 DescriptorType; 378 UINT16 BcdHID; 379 UINT8 CountryCode; 380 UINT8 NumDescriptors; 381 EFI_USB_HID_CLASS_DESCRIPTOR HidClassDesc[1]; 382 } EFI_USB_HID_DESCRIPTOR; 383 384 #pragma pack() 385 386 #endif 387