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