libusb20_desc.h revision 184610
1184610Salfred/* $FreeBSD: head/lib/libusb20/libusb20_desc.h 184610 2008-11-04 02:31:03Z alfred $ */ 2184610Salfred/*- 3184610Salfred * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. 4184610Salfred * Copyright (c) 2007-2008 Daniel Drake. All rights reserved. 5184610Salfred * Copyright (c) 2001 Johannes Erdfelt. All rights reserved. 6184610Salfred * 7184610Salfred * Redistribution and use in source and binary forms, with or without 8184610Salfred * modification, are permitted provided that the following conditions 9184610Salfred * are met: 10184610Salfred * 1. Redistributions of source code must retain the above copyright 11184610Salfred * notice, this list of conditions and the following disclaimer. 12184610Salfred * 2. Redistributions in binary form must reproduce the above copyright 13184610Salfred * notice, this list of conditions and the following disclaimer in the 14184610Salfred * documentation and/or other materials provided with the distribution. 15184610Salfred * 16184610Salfred * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17184610Salfred * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18184610Salfred * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19184610Salfred * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20184610Salfred * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21184610Salfred * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22184610Salfred * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23184610Salfred * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24184610Salfred * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25184610Salfred * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26184610Salfred * SUCH DAMAGE. 27184610Salfred */ 28184610Salfred 29184610Salfred/* 30184610Salfred * NOTE: This file contains the definition of some standard USB 31184610Salfred * structures. All structures which name ends by *DECODED use host byte 32184610Salfred * order. 33184610Salfred */ 34184610Salfred 35184610Salfred/* 36184610Salfred * NOTE: This file uses a lot of macros. If you want to see what the 37184610Salfred * macros become when they are expanded then run the following 38184610Salfred * commands from your shell: 39184610Salfred * 40184610Salfred * cpp libusb20_desc.h > temp.h 41184610Salfred * indent temp.h 42184610Salfred * less temp.h 43184610Salfred */ 44184610Salfred 45184610Salfred#ifndef _LIBUSB20_DESC_H_ 46184610Salfred#define _LIBUSB20_DESC_H_ 47184610Salfred 48184610Salfred#ifdef __cplusplus 49184610Salfredextern "C" { 50184610Salfred#endif 51184610Salfred#if 0 52184610Salfred}; /* style */ 53184610Salfred 54184610Salfred#endif 55184610Salfred/* basic macros */ 56184610Salfred 57184610Salfred#define LIBUSB20__NOT(...) __VA_ARGS__ 58184610Salfred#define LIBUSB20_NOT(arg) LIBUSB20__NOT(LIBUSB20_YES arg(() LIBUSB20_NO)) 59184610Salfred#define LIBUSB20_YES(...) __VA_ARGS__ 60184610Salfred#define LIBUSB20_NO(...) 61184610Salfred#define LIBUSB20_END(...) __VA_ARGS__ 62184610Salfred#define LIBUSB20_MAX(a,b) (((a) > (b)) ? (a) : (b)) 63184610Salfred#define LIBUSB20_MIN(a,b) (((a) < (b)) ? (a) : (b)) 64184610Salfred 65184610Salfred#define LIBUSB20_ADD_BYTES(ptr,off) \ 66184610Salfred ((void *)(((const uint8_t *)(ptr)) + (off))) 67184610Salfred 68184610Salfred/* basic message elements */ 69184610Salfredenum { 70184610Salfred LIBUSB20_ME_INT8, 71184610Salfred LIBUSB20_ME_INT16, 72184610Salfred LIBUSB20_ME_INT32, 73184610Salfred LIBUSB20_ME_INT64, 74184610Salfred LIBUSB20_ME_STRUCT, 75184610Salfred LIBUSB20_ME_MAX, /* used to indicate end */ 76184610Salfred}; 77184610Salfred 78184610Salfred/* basic message element modifiers */ 79184610Salfredenum { 80184610Salfred LIBUSB20_ME_IS_UNSIGNED = 0x00, 81184610Salfred LIBUSB20_ME_IS_SIGNED = 0x80, 82184610Salfred LIBUSB20_ME_MASK = 0x7F, 83184610Salfred}; 84184610Salfred 85184610Salfredenum { 86184610Salfred LIBUSB20_ME_IS_RAW, /* structure excludes length field 87184610Salfred * (hardcoded value) */ 88184610Salfred LIBUSB20_ME_IS_ENCODED, /* structure includes length field */ 89184610Salfred LIBUSB20_ME_IS_EMPTY, /* no structure */ 90184610Salfred LIBUSB20_ME_IS_DECODED, /* structure is recursive */ 91184610Salfred}; 92184610Salfred 93184610Salfred/* basic helper structures and macros */ 94184610Salfred 95184610Salfred#define LIBUSB20_ME_STRUCT_ALIGN sizeof(void *) 96184610Salfred 97184610Salfredstruct libusb20_me_struct { 98184610Salfred void *ptr; /* data pointer */ 99184610Salfred uint16_t len; /* defaults to zero */ 100184610Salfred uint16_t type; /* defaults to LIBUSB20_ME_IS_EMPTY */ 101184610Salfred} __aligned(LIBUSB20_ME_STRUCT_ALIGN); 102184610Salfred 103184610Salfredstruct libusb20_me_format { 104184610Salfred const uint8_t *format; /* always set */ 105184610Salfred const char *desc; /* optionally set */ 106184610Salfred const char *fields; /* optionally set */ 107184610Salfred}; 108184610Salfred 109184610Salfred#define LIBUSB20_ME_STRUCT(n, field, arg, ismeta) \ 110184610Salfred ismeta ( LIBUSB20_ME_STRUCT, 1, 0, ) \ 111184610Salfred LIBUSB20_NOT(ismeta) ( struct libusb20_me_struct field; ) 112184610Salfred 113184610Salfred#define LIBUSB20_ME_STRUCT_ARRAY(n, field, arg, ismeta) \ 114184610Salfred ismeta ( LIBUSB20_ME_STRUCT , (arg) & 0xFF, \ 115184610Salfred ((arg) / 0x100) & 0xFF, ) \ 116184610Salfred LIBUSB20_NOT(ismeta) ( struct libusb20_me_struct field [arg]; ) 117184610Salfred 118184610Salfred#define LIBUSB20_ME_INTEGER(n, field, ismeta, un, u, bits, a, size) \ 119184610Salfred ismeta ( LIBUSB20_ME_INT##bits | \ 120184610Salfred LIBUSB20_ME_IS_##un##SIGNED , \ 121184610Salfred (size) & 0xFF, ((size) / 0x100) & 0xFF, ) \ 122184610Salfred LIBUSB20_NOT(ismeta) ( u##int##bits##_t \ 123184610Salfred __aligned((bits) / 8) field a; ) 124184610Salfred 125184610Salfred#define LIBUSB20_ME_UINT8_T(n, field, arg, ismeta) \ 126184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 8, , 1) 127184610Salfred 128184610Salfred#define LIBUSB20_ME_UINT8_ARRAY_T(n, field, arg, ismeta) \ 129184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 8, [arg], arg) 130184610Salfred 131184610Salfred#define LIBUSB20_ME_SINT8_T(n, field, arg, ismeta) \ 132184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta,,, 8, , 1) 133184610Salfred 134184610Salfred#define LIBUSB20_ME_SINT8_ARRAY_T(n, field, arg, ismeta) \ 135184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta,,, 8, [arg], arg) 136184610Salfred 137184610Salfred#define LIBUSB20_ME_UINT16_T(n, field, arg, ismeta) \ 138184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 16, , 1) 139184610Salfred 140184610Salfred#define LIBUSB20_ME_UINT16_ARRAY_T(n, field, arg, ismeta) \ 141184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 16, [arg], arg) 142184610Salfred 143184610Salfred#define LIBUSB20_ME_SINT16_T(n, field, arg, ismeta) \ 144184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta,,, 16, , 1) 145184610Salfred 146184610Salfred#define LIBUSB20_ME_SINT16_ARRAY_T(n, field, arg, ismeta) \ 147184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta,,, 16, [arg], arg) 148184610Salfred 149184610Salfred#define LIBUSB20_ME_UINT32_T(n, field, arg, ismeta) \ 150184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 32, , 1) 151184610Salfred 152184610Salfred#define LIBUSB20_ME_UINT32_ARRAY_T(n, field, arg, ismeta) \ 153184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 32, [arg], arg) 154184610Salfred 155184610Salfred#define LIBUSB20_ME_SINT32_T(n, field, arg, ismeta) \ 156184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta,,, 32, , 1) 157184610Salfred 158184610Salfred#define LIBUSB20_ME_SINT32_ARRAY_T(n, field, arg, ismeta) \ 159184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta,,, 32, [arg], arg) 160184610Salfred 161184610Salfred#define LIBUSB20_ME_UINT64_T(n, field, arg, ismeta) \ 162184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 64, , 1) 163184610Salfred 164184610Salfred#define LIBUSB20_ME_UINT64_ARRAY_T(n, field, arg, ismeta) \ 165184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta, UN, u, 64, [arg], arg) 166184610Salfred 167184610Salfred#define LIBUSB20_ME_SINT64_T(n, field, arg, ismeta) \ 168184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta,,, 64, , 1) 169184610Salfred 170184610Salfred#define LIBUSB20_ME_SINT64_ARRAY_T(n, field, arg, ismeta) \ 171184610Salfred LIBUSB20_ME_INTEGER(n, field, ismeta,,, 64, [arg], arg) 172184610Salfred 173184610Salfred#define LIBUSB20_MAKE_DECODED_FIELD(n, type, field, arg) \ 174184610Salfred LIBUSB20_ME_##type (n, field, arg, LIBUSB20_NO) 175184610Salfred 176184610Salfred#define LIBUSB20_MAKE_STRUCT(name) \ 177184610Salfred extern const struct libusb20_me_format \ 178184610Salfred name##_FORMAT[1]; \ 179184610Salfred struct name##_DECODED { \ 180184610Salfred const struct libusb20_me_format *name##_FORMAT; \ 181184610Salfred name (LIBUSB20_MAKE_DECODED_FIELD,) \ 182184610Salfred } 183184610Salfred 184184610Salfred#define LIBUSB20_MAKE_STRUCT_FORMAT(name) \ 185184610Salfred const struct libusb20_me_format \ 186184610Salfred name##_FORMAT[1] = {{ \ 187184610Salfred .format = LIBUSB20_MAKE_FORMAT(name), \ 188184610Salfred .desc = #name, \ 189184610Salfred .fields = NULL, \ 190184610Salfred }} 191184610Salfred 192184610Salfred#define LIBUSB20_MAKE_FORMAT_SUB(n, type, field, arg) \ 193184610Salfred LIBUSB20_ME_##type (n, field, arg, LIBUSB20_YES) 194184610Salfred 195184610Salfred#define LIBUSB20_MAKE_FORMAT(what) (const uint8_t []) \ 196184610Salfred { what (LIBUSB20_MAKE_FORMAT_SUB, ) LIBUSB20_ME_MAX, 0, 0 } 197184610Salfred 198184610Salfred#define LIBUSB20_INIT(what, ptr) do { \ 199184610Salfred memset(ptr, 0, sizeof(*(ptr))); \ 200184610Salfred (ptr)->what##_FORMAT = what##_FORMAT; \ 201184610Salfred} while (0) 202184610Salfred 203184610Salfred#define LIBUSB20_DEVICE_DESC(m,n) \ 204184610Salfred m(n, UINT8_T, bLength, ) \ 205184610Salfred m(n, UINT8_T, bDescriptorType, ) \ 206184610Salfred m(n, UINT16_T, bcdUSB, ) \ 207184610Salfred m(n, UINT8_T, bDeviceClass, ) \ 208184610Salfred m(n, UINT8_T, bDeviceSubClass, ) \ 209184610Salfred m(n, UINT8_T, bDeviceProtocol, ) \ 210184610Salfred m(n, UINT8_T, bMaxPacketSize0, ) \ 211184610Salfred m(n, UINT16_T, idVendor, ) \ 212184610Salfred m(n, UINT16_T, idProduct, ) \ 213184610Salfred m(n, UINT16_T, bcdDevice, ) \ 214184610Salfred m(n, UINT8_T, iManufacturer, ) \ 215184610Salfred m(n, UINT8_T, iProduct, ) \ 216184610Salfred m(n, UINT8_T, iSerialNumber, ) \ 217184610Salfred m(n, UINT8_T, bNumConfigurations, ) \ 218184610Salfred 219184610SalfredLIBUSB20_MAKE_STRUCT(LIBUSB20_DEVICE_DESC); 220184610Salfred 221184610Salfred#define LIBUSB20_ENDPOINT_DESC(m,n) \ 222184610Salfred m(n, UINT8_T, bLength, ) \ 223184610Salfred m(n, UINT8_T, bDescriptorType, ) \ 224184610Salfred m(n, UINT8_T, bEndpointAddress, ) \ 225184610Salfred m(n, UINT8_T, bmAttributes, ) \ 226184610Salfred m(n, UINT16_T, wMaxPacketSize, ) \ 227184610Salfred m(n, UINT8_T, bInterval, ) \ 228184610Salfred m(n, UINT8_T, bRefresh, ) \ 229184610Salfred m(n, UINT8_T, bSynchAddress, ) \ 230184610Salfred 231184610SalfredLIBUSB20_MAKE_STRUCT(LIBUSB20_ENDPOINT_DESC); 232184610Salfred 233184610Salfred#define LIBUSB20_INTERFACE_DESC(m,n) \ 234184610Salfred m(n, UINT8_T, bLength, ) \ 235184610Salfred m(n, UINT8_T, bDescriptorType, ) \ 236184610Salfred m(n, UINT8_T, bInterfaceNumber, ) \ 237184610Salfred m(n, UINT8_T, bAlternateSetting, ) \ 238184610Salfred m(n, UINT8_T, bNumEndpoints, ) \ 239184610Salfred m(n, UINT8_T, bInterfaceClass, ) \ 240184610Salfred m(n, UINT8_T, bInterfaceSubClass, ) \ 241184610Salfred m(n, UINT8_T, bInterfaceProtocol, ) \ 242184610Salfred m(n, UINT8_T, iInterface, ) \ 243184610Salfred 244184610SalfredLIBUSB20_MAKE_STRUCT(LIBUSB20_INTERFACE_DESC); 245184610Salfred 246184610Salfred#define LIBUSB20_CONFIG_DESC(m,n) \ 247184610Salfred m(n, UINT8_T, bLength, ) \ 248184610Salfred m(n, UINT8_T, bDescriptorType, ) \ 249184610Salfred m(n, UINT16_T, wTotalLength, ) \ 250184610Salfred m(n, UINT8_T, bNumInterfaces, ) \ 251184610Salfred m(n, UINT8_T, bConfigurationValue, ) \ 252184610Salfred m(n, UINT8_T, iConfiguration, ) \ 253184610Salfred m(n, UINT8_T, bmAttributes, ) \ 254184610Salfred m(n, UINT8_T, bMaxPower, ) \ 255184610Salfred 256184610SalfredLIBUSB20_MAKE_STRUCT(LIBUSB20_CONFIG_DESC); 257184610Salfred 258184610Salfred#define LIBUSB20_CONTROL_SETUP(m,n) \ 259184610Salfred m(n, UINT8_T, bmRequestType, ) \ 260184610Salfred m(n, UINT8_T, bRequest, ) \ 261184610Salfred m(n, UINT16_T, wValue, ) \ 262184610Salfred m(n, UINT16_T, wIndex, ) \ 263184610Salfred m(n, UINT16_T, wLength, ) \ 264184610Salfred 265184610SalfredLIBUSB20_MAKE_STRUCT(LIBUSB20_CONTROL_SETUP); 266184610Salfred 267184610Salfred/* standard USB stuff */ 268184610Salfred 269184610Salfred/** \ingroup desc 270184610Salfred * Device and/or Interface Class codes */ 271184610Salfredenum libusb20_class_code { 272184610Salfred /** In the context of a \ref LIBUSB20_DEVICE_DESC "device 273184610Salfred * descriptor", this bDeviceClass value indicates that each 274184610Salfred * interface specifies its own class information and all 275184610Salfred * interfaces operate independently. 276184610Salfred */ 277184610Salfred LIBUSB20_CLASS_PER_INTERFACE = 0, 278184610Salfred 279184610Salfred /** Audio class */ 280184610Salfred LIBUSB20_CLASS_AUDIO = 1, 281184610Salfred 282184610Salfred /** Communications class */ 283184610Salfred LIBUSB20_CLASS_COMM = 2, 284184610Salfred 285184610Salfred /** Human Interface Device class */ 286184610Salfred LIBUSB20_CLASS_HID = 3, 287184610Salfred 288184610Salfred /** Printer dclass */ 289184610Salfred LIBUSB20_CLASS_PRINTER = 7, 290184610Salfred 291184610Salfred /** Picture transfer protocol class */ 292184610Salfred LIBUSB20_CLASS_PTP = 6, 293184610Salfred 294184610Salfred /** Mass storage class */ 295184610Salfred LIBUSB20_CLASS_MASS_STORAGE = 8, 296184610Salfred 297184610Salfred /** Hub class */ 298184610Salfred LIBUSB20_CLASS_HUB = 9, 299184610Salfred 300184610Salfred /** Data class */ 301184610Salfred LIBUSB20_CLASS_DATA = 10, 302184610Salfred 303184610Salfred /** Class is vendor-specific */ 304184610Salfred LIBUSB20_CLASS_VENDOR_SPEC = 0xff, 305184610Salfred}; 306184610Salfred 307184610Salfred/** \ingroup desc 308184610Salfred * Descriptor types as defined by the USB specification. */ 309184610Salfredenum libusb20_descriptor_type { 310184610Salfred /** Device descriptor. See LIBUSB20_DEVICE_DESC. */ 311184610Salfred LIBUSB20_DT_DEVICE = 0x01, 312184610Salfred 313184610Salfred /** Configuration descriptor. See LIBUSB20_CONFIG_DESC. */ 314184610Salfred LIBUSB20_DT_CONFIG = 0x02, 315184610Salfred 316184610Salfred /** String descriptor */ 317184610Salfred LIBUSB20_DT_STRING = 0x03, 318184610Salfred 319184610Salfred /** Interface descriptor. See LIBUSB20_INTERFACE_DESC. */ 320184610Salfred LIBUSB20_DT_INTERFACE = 0x04, 321184610Salfred 322184610Salfred /** Endpoint descriptor. See LIBUSB20_ENDPOINT_DESC. */ 323184610Salfred LIBUSB20_DT_ENDPOINT = 0x05, 324184610Salfred 325184610Salfred /** HID descriptor */ 326184610Salfred LIBUSB20_DT_HID = 0x21, 327184610Salfred 328184610Salfred /** HID report descriptor */ 329184610Salfred LIBUSB20_DT_REPORT = 0x22, 330184610Salfred 331184610Salfred /** Physical descriptor */ 332184610Salfred LIBUSB20_DT_PHYSICAL = 0x23, 333184610Salfred 334184610Salfred /** Hub descriptor */ 335184610Salfred LIBUSB20_DT_HUB = 0x29, 336184610Salfred}; 337184610Salfred 338184610Salfred/* Descriptor sizes per descriptor type */ 339184610Salfred#define LIBUSB20_DT_DEVICE_SIZE 18 340184610Salfred#define LIBUSB20_DT_CONFIG_SIZE 9 341184610Salfred#define LIBUSB20_DT_INTERFACE_SIZE 9 342184610Salfred#define LIBUSB20_DT_ENDPOINT_SIZE 7 343184610Salfred#define LIBUSB20_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ 344184610Salfred#define LIBUSB20_DT_HUB_NONVAR_SIZE 7 345184610Salfred 346184610Salfred#define LIBUSB20_ENDPOINT_ADDRESS_MASK 0x0f /* in bEndpointAddress */ 347184610Salfred#define LIBUSB20_ENDPOINT_DIR_MASK 0x80 348184610Salfred 349184610Salfred/** \ingroup desc 350184610Salfred * Endpoint direction. Values for bit 7 of the 351184610Salfred * \ref LIBUSB20_ENDPOINT_DESC::bEndpointAddress "endpoint address" scheme. 352184610Salfred */ 353184610Salfredenum libusb20_endpoint_direction { 354184610Salfred /** In: device-to-host */ 355184610Salfred LIBUSB20_ENDPOINT_IN = 0x80, 356184610Salfred 357184610Salfred /** Out: host-to-device */ 358184610Salfred LIBUSB20_ENDPOINT_OUT = 0x00, 359184610Salfred}; 360184610Salfred 361184610Salfred#define LIBUSB20_TRANSFER_TYPE_MASK 0x03 /* in bmAttributes */ 362184610Salfred 363184610Salfred/** \ingroup desc 364184610Salfred * Endpoint transfer type. Values for bits 0:1 of the 365184610Salfred * \ref LIBUSB20_ENDPOINT_DESC::bmAttributes "endpoint attributes" field. 366184610Salfred */ 367184610Salfredenum libusb20_transfer_type { 368184610Salfred /** Control endpoint */ 369184610Salfred LIBUSB20_TRANSFER_TYPE_CONTROL = 0, 370184610Salfred 371184610Salfred /** Isochronous endpoint */ 372184610Salfred LIBUSB20_TRANSFER_TYPE_ISOCHRONOUS = 1, 373184610Salfred 374184610Salfred /** Bulk endpoint */ 375184610Salfred LIBUSB20_TRANSFER_TYPE_BULK = 2, 376184610Salfred 377184610Salfred /** Interrupt endpoint */ 378184610Salfred LIBUSB20_TRANSFER_TYPE_INTERRUPT = 3, 379184610Salfred}; 380184610Salfred 381184610Salfred/** \ingroup misc 382184610Salfred * Standard requests, as defined in table 9-3 of the USB2 specifications */ 383184610Salfredenum libusb20_standard_request { 384184610Salfred /** Request status of the specific recipient */ 385184610Salfred LIBUSB20_REQUEST_GET_STATUS = 0x00, 386184610Salfred 387184610Salfred /** Clear or disable a specific feature */ 388184610Salfred LIBUSB20_REQUEST_CLEAR_FEATURE = 0x01, 389184610Salfred 390184610Salfred /* 0x02 is reserved */ 391184610Salfred 392184610Salfred /** Set or enable a specific feature */ 393184610Salfred LIBUSB20_REQUEST_SET_FEATURE = 0x03, 394184610Salfred 395184610Salfred /* 0x04 is reserved */ 396184610Salfred 397184610Salfred /** Set device address for all future accesses */ 398184610Salfred LIBUSB20_REQUEST_SET_ADDRESS = 0x05, 399184610Salfred 400184610Salfred /** Get the specified descriptor */ 401184610Salfred LIBUSB20_REQUEST_GET_DESCRIPTOR = 0x06, 402184610Salfred 403184610Salfred /** Used to update existing descriptors or add new descriptors */ 404184610Salfred LIBUSB20_REQUEST_SET_DESCRIPTOR = 0x07, 405184610Salfred 406184610Salfred /** Get the current device configuration value */ 407184610Salfred LIBUSB20_REQUEST_GET_CONFIGURATION = 0x08, 408184610Salfred 409184610Salfred /** Set device configuration */ 410184610Salfred LIBUSB20_REQUEST_SET_CONFIGURATION = 0x09, 411184610Salfred 412184610Salfred /** Return the selected alternate setting for the specified 413184610Salfred * interface */ 414184610Salfred LIBUSB20_REQUEST_GET_INTERFACE = 0x0A, 415184610Salfred 416184610Salfred /** Select an alternate interface for the specified interface */ 417184610Salfred LIBUSB20_REQUEST_SET_INTERFACE = 0x0B, 418184610Salfred 419184610Salfred /** Set then report an endpoint's synchronization frame */ 420184610Salfred LIBUSB20_REQUEST_SYNCH_FRAME = 0x0C, 421184610Salfred}; 422184610Salfred 423184610Salfred/** \ingroup misc 424184610Salfred * Request type bits of the 425184610Salfred * \ref libusb20_control_setup::bmRequestType "bmRequestType" field in 426184610Salfred * control transfers. */ 427184610Salfredenum libusb20_request_type { 428184610Salfred /** Standard */ 429184610Salfred LIBUSB20_REQUEST_TYPE_STANDARD = (0x00 << 5), 430184610Salfred 431184610Salfred /** Class */ 432184610Salfred LIBUSB20_REQUEST_TYPE_CLASS = (0x01 << 5), 433184610Salfred 434184610Salfred /** Vendor */ 435184610Salfred LIBUSB20_REQUEST_TYPE_VENDOR = (0x02 << 5), 436184610Salfred 437184610Salfred /** Reserved */ 438184610Salfred LIBUSB20_REQUEST_TYPE_RESERVED = (0x03 << 5), 439184610Salfred}; 440184610Salfred 441184610Salfred/** \ingroup misc 442184610Salfred * Recipient bits of the 443184610Salfred * \ref libusb20_control_setup::bmRequestType "bmRequestType" field in 444184610Salfred * control transfers. Values 4 through 31 are reserved. */ 445184610Salfredenum libusb20_request_recipient { 446184610Salfred /** Device */ 447184610Salfred LIBUSB20_RECIPIENT_DEVICE = 0x00, 448184610Salfred 449184610Salfred /** Interface */ 450184610Salfred LIBUSB20_RECIPIENT_INTERFACE = 0x01, 451184610Salfred 452184610Salfred /** Endpoint */ 453184610Salfred LIBUSB20_RECIPIENT_ENDPOINT = 0x02, 454184610Salfred 455184610Salfred /** Other */ 456184610Salfred LIBUSB20_RECIPIENT_OTHER = 0x03, 457184610Salfred}; 458184610Salfred 459184610Salfred#define LIBUSB20_ISO_SYNC_TYPE_MASK 0x0C 460184610Salfred 461184610Salfred/** \ingroup desc 462184610Salfred * Synchronization type for isochronous endpoints. Values for bits 2:3 463184610Salfred * of the \ref LIBUSB20_ENDPOINT_DESC::bmAttributes "bmAttributes" 464184610Salfred * field in LIBUSB20_ENDPOINT_DESC. 465184610Salfred */ 466184610Salfredenum libusb20_iso_sync_type { 467184610Salfred /** No synchronization */ 468184610Salfred LIBUSB20_ISO_SYNC_TYPE_NONE = 0, 469184610Salfred 470184610Salfred /** Asynchronous */ 471184610Salfred LIBUSB20_ISO_SYNC_TYPE_ASYNC = 1, 472184610Salfred 473184610Salfred /** Adaptive */ 474184610Salfred LIBUSB20_ISO_SYNC_TYPE_ADAPTIVE = 2, 475184610Salfred 476184610Salfred /** Synchronous */ 477184610Salfred LIBUSB20_ISO_SYNC_TYPE_SYNC = 3, 478184610Salfred}; 479184610Salfred 480184610Salfred#define LIBUSB20_ISO_USAGE_TYPE_MASK 0x30 481184610Salfred 482184610Salfred/** \ingroup desc 483184610Salfred * Usage type for isochronous endpoints. Values for bits 4:5 of the 484184610Salfred * \ref LIBUSB20_ENDPOINT_DESC::bmAttributes "bmAttributes" field in 485184610Salfred * LIBUSB20_ENDPOINT_DESC. 486184610Salfred */ 487184610Salfredenum libusb20_iso_usage_type { 488184610Salfred /** Data endpoint */ 489184610Salfred LIBUSB20_ISO_USAGE_TYPE_DATA = 0, 490184610Salfred 491184610Salfred /** Feedback endpoint */ 492184610Salfred LIBUSB20_ISO_USAGE_TYPE_FEEDBACK = 1, 493184610Salfred 494184610Salfred /** Implicit feedback Data endpoint */ 495184610Salfred LIBUSB20_ISO_USAGE_TYPE_IMPLICIT = 2, 496184610Salfred}; 497184610Salfred 498184610Salfredstruct libusb20_endpoint { 499184610Salfred struct LIBUSB20_ENDPOINT_DESC_DECODED desc; 500184610Salfred struct libusb20_me_struct extra; 501184610Salfred} __aligned(sizeof(void *)); 502184610Salfred 503184610Salfredstruct libusb20_interface { 504184610Salfred struct LIBUSB20_INTERFACE_DESC_DECODED desc; 505184610Salfred struct libusb20_me_struct extra; 506184610Salfred struct libusb20_interface *altsetting; 507184610Salfred struct libusb20_endpoint *endpoints; 508184610Salfred uint8_t num_altsetting; 509184610Salfred uint8_t num_endpoints; 510184610Salfred} __aligned(sizeof(void *)); 511184610Salfred 512184610Salfredstruct libusb20_config { 513184610Salfred struct LIBUSB20_CONFIG_DESC_DECODED desc; 514184610Salfred struct libusb20_me_struct extra; 515184610Salfred struct libusb20_interface *interface; 516184610Salfred uint8_t num_interface; 517184610Salfred} __aligned(sizeof(void *)); 518184610Salfred 519184610Salfreduint8_t libusb20_me_get_1(const struct libusb20_me_struct *ie, uint16_t offset); 520184610Salfreduint16_t libusb20_me_get_2(const struct libusb20_me_struct *ie, uint16_t offset); 521184610Salfreduint16_t libusb20_me_encode(void *ptr, uint16_t len, const void *pd); 522184610Salfreduint16_t libusb20_me_decode(const void *ptr, uint16_t len, void *pd); 523184610Salfredconst uint8_t *libusb20_desc_foreach(const struct libusb20_me_struct *pdesc, const uint8_t *psubdesc); 524184610Salfredstruct libusb20_config *libusb20_parse_config_desc(const void *config_desc); 525184610Salfred 526184610Salfred#if 0 527184610Salfred{ /* style */ 528184610Salfred#endif 529184610Salfred#ifdef __cplusplus 530184610Salfred} 531184610Salfred 532184610Salfred#endif 533184610Salfred 534184610Salfred#endif /* _LIBUSB20_DESC_H_ */ 535