|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: #ifndef _USB_H ! 23: #define _USB_H ! 24: ! 25: #include <IOKit/IOTypes.h> ! 26: ! 27: #if !defined(__USB__) ! 28: # include <IOKit/usb/USBSpec.h> ! 29: #endif ! 30: ! 31: #ifdef __cplusplus ! 32: extern "C" { ! 33: #endif ! 34: ! 35: #define EndianSwap16(data16) \ ! 36: ( \ ! 37: ((((UInt16) data16) >> 8) & 0x00FF) | \ ! 38: ((((UInt16) data16) << 8) & 0xFF00) \ ! 39: ) ! 40: #define USBToHostWord EndianSwap16 ! 41: #define HostToUSBWord EndianSwap16 ! 42: ! 43: /*! ! 44: @typedef USBWord ! 45: A 16 bit value in little-endian format, best accessed using ! 46: the OSRead/WriteLittleInt16 functions ! 47: @field loByte least significant byte ! 48: @field hiByte most significant byte ! 49: */ ! 50: typedef struct USBWord { ! 51: UInt8 loByte; ! 52: UInt8 hiByte; ! 53: } USBWord; ! 54: ! 55: enum { ! 56: kUSBDeviceIDShift = 7, ! 57: kUSBMaxDevices = 128, ! 58: kUSBMaxDevice = kUSBMaxDevices-1, ! 59: kUSBDeviceIDMask = 0x7f, ! 60: ! 61: kUSBPipeIDMask = 0xf, ! 62: kUSBMaxPipes = 32, // In and Out pipes can have same pipe number. ! 63: ! 64: kUSBInterfaceIDShift = 8, ! 65: kUSBMaxInterfaces = 1 << kUSBInterfaceIDShift, ! 66: kUSBInterfaceIDMask = kUSBMaxInterfaces-1, ! 67: ! 68: kUSBEndPtShift = 7, ! 69: kUSBDeviceMask = ((1 << kUSBEndPtShift) -1), ! 70: ! 71: kUSBNoPipeIdx = -1, ! 72: }; ! 73: ! 74: enum { ! 75: kUSBRqDirnShift = 7, ! 76: kUSBRqDirnMask = 1, ! 77: ! 78: kUSBRqTypeShift = 5, ! 79: kUSBRqTypeMask = 3, ! 80: ! 81: kUSBRqRecipientMask = 0X1F ! 82: }; ! 83: ! 84: enum { ! 85: kUSBHighSpeed = 0, ! 86: kUSBLowSpeed = 1 ! 87: }; ! 88: ! 89: enum { ! 90: kUSBMaxIsocFrameReqCount = 1023 // max size (bytes) of any one Isoc frame ! 91: }; ! 92: ! 93: #define EncodeRequest(request, direction, type, recipient) \ ! 94: (((UInt16)request << 8) + \ ! 95: ((UInt16)recipient + \ ! 96: ((UInt16)type << kUSBRqTypeShift) + \ ! 97: ((UInt16)direction << kUSBRqDirnShift))) ! 98: ! 99: ! 100: enum { ! 101: /* ! 102: Standard Requests ! 103: ! 104: bmRequestType bRequest wValue wIndex wLength Data ! 105: 00000000B CLEAR_FEATURE Feature Zero Zero None (device) ! 106: 00000001B Feature Interface Zero None (Interface) ! 107: 00000010B Feature Endpoint Zero None (Endpoint) ! 108: ! 109: 10000000B GET_CONFIGURATION Zero Zero One Configuration ! 110: 10000000B GET_DESCRIPTOR Type LangID Length Descriptor ! 111: 10000001B GET_INTERFACE Zero Interface One Alternate ! 112: ! 113: 10000000B GET_STATUS Zero Zero Two status (device) ! 114: 10000001B Zero Interface Two status (Interface) ! 115: 10000010B Zero Endpoint Two status (Endpoint) ! 116: ! 117: 00000000B SET_ADDRESS Address Zero Zero None ! 118: 00000000B SET_CONFIGURATION Configuration Zero Zero None ! 119: 00000000B SET_DESCRIPTOR Type LangID Length Descriptor ! 120: ! 121: 00000000B SET_FEATURE Feature Zero Zero None (device) ! 122: 00000001B Feature Interface Zero None (Interface) ! 123: 00000010B Feature Endpoint Zero None (Endpoint) ! 124: ! 125: 00000001B SET_INTERFACE Alternate Interface Zero None ! 126: 10000010B SYNCH_FRAME Zero Endpoint Two Frame Number ! 127: */ ! 128: kClearDeviceFeature ! 129: = EncodeRequest(kUSBRqClearFeature, kUSBOut, kUSBStandard, kUSBDevice), ! 130: kClearInterfaceFeature ! 131: = EncodeRequest(kUSBRqClearFeature, kUSBOut, kUSBStandard, kUSBInterface), ! 132: kClearEndpointFeature ! 133: = EncodeRequest(kUSBRqClearFeature, kUSBOut, kUSBStandard, kUSBEndpoint), ! 134: kGetConfiguration ! 135: = EncodeRequest(kUSBRqGetConfig, kUSBIn, kUSBStandard, kUSBDevice), ! 136: kGetDescriptor ! 137: = EncodeRequest(kUSBRqGetDescriptor, kUSBIn, kUSBStandard, kUSBDevice), ! 138: kGetInterface ! 139: = EncodeRequest(kUSBRqGetInterface, kUSBIn, kUSBStandard, kUSBInterface), ! 140: kGetDeviceStatus ! 141: = EncodeRequest(kUSBRqGetStatus, kUSBIn, kUSBStandard, kUSBDevice), ! 142: kGetInterfaceStatus ! 143: = EncodeRequest(kUSBRqGetStatus, kUSBIn, kUSBStandard, kUSBInterface), ! 144: kGetEndpointStatus ! 145: = EncodeRequest(kUSBRqGetStatus, kUSBIn, kUSBStandard, kUSBEndpoint), ! 146: kSetAddress ! 147: = EncodeRequest(kUSBRqSetAddress, kUSBOut, kUSBStandard, kUSBDevice), ! 148: kSetConfiguration ! 149: = EncodeRequest(kUSBRqSetConfig, kUSBOut, kUSBStandard, kUSBDevice), ! 150: kSetDescriptor ! 151: = EncodeRequest(kUSBRqSetDescriptor, kUSBOut, kUSBStandard, kUSBDevice), ! 152: kSetDeviceFeature ! 153: = EncodeRequest(kUSBRqSetFeature, kUSBOut, kUSBStandard, kUSBDevice), ! 154: kSetInterfaceFeature ! 155: = EncodeRequest(kUSBRqSetFeature, kUSBOut, kUSBStandard, kUSBInterface), ! 156: kSetEndpointFeature ! 157: = EncodeRequest(kUSBRqSetFeature, kUSBOut, kUSBStandard, kUSBEndpoint), ! 158: kSetInterface ! 159: = EncodeRequest(kUSBRqSetInterface, kUSBOut, kUSBStandard, kUSBInterface), ! 160: kSyncFrame ! 161: = EncodeRequest(kUSBRqSyncFrame, kUSBIn, kUSBStandard, kUSBEndpoint), ! 162: ! 163: }; ! 164: ! 165: // TYPES ! 166: ! 167: typedef struct IOUSBIsocFrame { ! 168: IOReturn frStatus; ! 169: UInt16 frReqCount; ! 170: UInt16 frActCount; ! 171: } IOUSBIsocFrame; ! 172: ! 173: typedef UInt16 USBDeviceAddress; ! 174: ! 175: /*! ! 176: @typedef IOUSBCompletionAction ! 177: Function called when USB I/O completes ! 178: @param target The target specified in the IOUSBCompletion struct. ! 179: @param parameter The parameter specified in the IOUSBCompletion struct. ! 180: @param status Completion status ! 181: @param bufferSizeRemaining bytes left to be transferred ! 182: */ ! 183: typedef void (*IOUSBCompletionAction)( ! 184: void * target, ! 185: void * parameter, ! 186: IOReturn status, ! 187: UInt32 bufferSizeRemaining); ! 188: ! 189: typedef void (*IOUSBIsocCompletionAction)( ! 190: void * target, ! 191: void * parameter, ! 192: IOReturn status, ! 193: IOUSBIsocFrame *pFrames); ! 194: ! 195: /*! ! 196: @typedef IOUSBCompletion ! 197: Struct spefifying action to perform when a USB I/O completes ! 198: @param target The target to pass to the action function. ! 199: @param action The function to call. ! 200: @param parameter The parameter to pass to the action function. ! 201: @param bufferSizeRemaining bytes left to be transferred ! 202: */ ! 203: typedef struct IOUSBCompletion { ! 204: void * target; ! 205: IOUSBCompletionAction action; ! 206: void * parameter; ! 207: } IOUSBCompletion; ! 208: ! 209: typedef struct IOUSBIsocCompletion { ! 210: void * target; ! 211: IOUSBIsocCompletionAction action; ! 212: void * parameter; ! 213: } IOUSBIsocCompletion; ! 214: ! 215: /* ************* Constants ************* */ ! 216: ! 217: #define iokit_usb_err(return) (sys_iokit|sub_iokit_usb|return) ! 218: #define kIOUSBUnknownPipeErr iokit_usb_err(97) /* Pipe ref not recognised */ ! 219: #define kIOUSBTooManyPipesErr iokit_usb_err(96) /* Too many pipes */ ! 220: #define kIOUSBEndpointNotFound iokit_usb_err(87) /* Not found */ ! 221: #define kIOUSBConfigNotFound iokit_usb_err(86) /* Not found */ ! 222: #define kIOUSBPipeStalled iokit_usb_err(79) /* Pipe has stalled, error needs to be cleared */ ! 223: #define kIOUSBInterfaceNotFound iokit_usb_err(78) /* Interface ref not recognised */ ! 224: ! 225: /* ************* types ************* */ ! 226: ! 227: struct IOUSBMouseData { ! 228: UInt16 buttons; ! 229: SInt16 XDelta; ! 230: SInt16 YDelta; ! 231: }; ! 232: typedef struct IOUSBMouseData IOUSBMouseData; ! 233: typedef IOUSBMouseData * IOUSBMouseDataPtr; ! 234: ! 235: struct IOUSBKeyboardData { ! 236: UInt16 keycount; ! 237: UInt16 usbkeycode[32]; ! 238: }; ! 239: typedef struct IOUSBKeyboardData IOUSBKeyboardData; ! 240: typedef IOUSBKeyboardData * IOUSBKeyboardDataPtr; ! 241: ! 242: union IOUSBHIDData { ! 243: IOUSBKeyboardData kbd; ! 244: IOUSBMouseData mouse; ! 245: }; ! 246: typedef union IOUSBHIDData IOUSBHIDData; ! 247: typedef IOUSBHIDData * IOUSBHIDDataPtr; ! 248: ! 249: struct IOUSBDeviceDescriptor { ! 250: UInt8 length; ! 251: UInt8 descType; ! 252: UInt16 usbRel; ! 253: UInt8 deviceClass; ! 254: UInt8 deviceSubClass; ! 255: UInt8 protocol; ! 256: UInt8 maxPacketSize; ! 257: UInt16 vendor; ! 258: UInt16 product; ! 259: UInt16 devRel; ! 260: UInt8 manuIdx; ! 261: UInt8 prodIdx; ! 262: UInt8 serialIdx; ! 263: UInt8 numConf; ! 264: }; ! 265: typedef struct IOUSBDeviceDescriptor IOUSBDeviceDescriptor; ! 266: typedef IOUSBDeviceDescriptor * IOUSBDeviceDescriptorPtr; ! 267: ! 268: struct IOUSBDescriptorHeader { ! 269: UInt8 length; ! 270: UInt8 descriptorType; ! 271: }; ! 272: typedef struct IOUSBDescriptorHeader IOUSBDescriptorHeader; ! 273: typedef IOUSBDescriptorHeader * IOUSBDescriptorHeaderPtr; ! 274: ! 275: struct IOUSBConfigurationDescriptor { ! 276: UInt8 length; ! 277: UInt8 descriptorType; ! 278: UInt16 totalLength; ! 279: UInt8 numInterfaces; ! 280: UInt8 configValue; ! 281: UInt8 configStrIndex; ! 282: UInt8 attributes; ! 283: UInt8 maxPower; ! 284: }; ! 285: typedef struct IOUSBConfigurationDescriptor IOUSBConfigurationDescriptor; ! 286: typedef IOUSBConfigurationDescriptor * IOUSBConfigurationDescriptorPtr; ! 287: ! 288: struct IOUSBInterfaceDescriptor { ! 289: UInt8 length; ! 290: UInt8 descriptorType; ! 291: UInt8 interfaceNumber; ! 292: UInt8 alternateSetting; ! 293: UInt8 numEndpoints; ! 294: UInt8 interfaceClass; ! 295: UInt8 interfaceSubClass; ! 296: UInt8 interfaceProtocol; ! 297: UInt8 interfaceStrIndex; ! 298: }; ! 299: typedef struct IOUSBInterfaceDescriptor IOUSBInterfaceDescriptor; ! 300: typedef IOUSBInterfaceDescriptor * IOUSBInterfaceDescriptorPtr; ! 301: ! 302: struct IOUSBEndpointDescriptor { ! 303: UInt8 length; ! 304: UInt8 descriptorType; ! 305: UInt8 endpointAddress; ! 306: UInt8 attributes; ! 307: /* Split up maxPacketSize to avoid packing & alignment problems */ ! 308: UInt8 maxPacketSizeLo; ! 309: UInt8 maxPacketSizeHi; ! 310: UInt8 interval; ! 311: }; ! 312: typedef struct IOUSBEndpointDescriptor IOUSBEndpointDescriptor; ! 313: typedef IOUSBEndpointDescriptor * IOUSBEndpointDescriptorPtr; ! 314: ! 315: struct IOUSBHIDDescriptor { ! 316: UInt8 descLen; ! 317: UInt8 descType; ! 318: UInt16 descVersNum; ! 319: UInt8 hidCountryCode; ! 320: UInt8 hidNumDescriptors; ! 321: UInt8 hidDescriptorType; ! 322: /* can't make this a single 16bit value or the compiler will add a filler byte*/ ! 323: UInt8 hidDescriptorLengthLo; ! 324: UInt8 hidDescriptorLengthHi; ! 325: }; ! 326: typedef struct IOUSBHIDDescriptor IOUSBHIDDescriptor; ! 327: typedef IOUSBHIDDescriptor *IOUSBHIDDescriptorPtr; ! 328: ! 329: struct IOUSBHIDReportDesc { ! 330: UInt8 hidDescriptorType; ! 331: /* can't make this a single 16bit value or the compiler will add a filler byte*/ ! 332: UInt8 hidDescriptorLengthLo; ! 333: UInt8 hidDescriptorLengthHi; ! 334: }; ! 335: typedef struct IOUSBHIDReportDesc IOUSBHIDReportDesc; ! 336: typedef IOUSBHIDReportDesc * IOUSBHIDReportDescPtr; ! 337: ! 338: typedef UInt16 USBStatus; ! 339: typedef USBStatus * USBStatusPtr; ! 340: ! 341: enum { ! 342: kIOUSBAnyClass = 0xFFFF, ! 343: kIOUSBAnySubClass = 0xFFFF, ! 344: kIOUSBAnyProtocol = 0xFFFF, ! 345: kIOUSBAnyVendor = 0xFFFF, ! 346: kIOUSBAnyProduct = 0xFFFF ! 347: }; ! 348: typedef struct IOUSBMatch { ! 349: UInt16 usbClass; ! 350: UInt16 usbSubClass; ! 351: UInt16 usbProtocol; ! 352: UInt16 usbVendor; ! 353: UInt16 usbProduct; ! 354: } IOUSBMatch; ! 355: ! 356: /*! ! 357: @typedef IOUSBFindEndpointRequest ! 358: Struct used to find endpoints of an interface ! 359: type and direction are used to match endpoints, ! 360: type, direction, maxPacketSize and interval are updated ! 361: with the properties of the found endpoint. ! 362: @field type Type of endpoint: kUSBControl, kUSBIsoc, kUSBBulk, kUSBInterrupt, kUSBAnyType ! 363: @field direction Direction of endpoint: kUSBOut, kUSBIn, kUSBAnyDirn ! 364: @field maxPacketSize maximum packet size of endpoint. ! 365: @field interval Polling interval in mSec for endpoint. ! 366: */ ! 367: typedef struct { ! 368: UInt8 type; // kUSBAnyType = don't care ! 369: UInt8 direction; // kUSBAnyDirn = don't care ! 370: UInt16 maxPacketSize; ! 371: UInt8 interval; ! 372: } IOUSBFindEndpointRequest; ! 373: ! 374: /* ! 375: * Stuff for IOUserClient ! 376: */ ! 377: enum { ! 378: // for IOServiceOpen ! 379: kIOUSBDeviceConnectType = 10 ! 380: }; ! 381: ! 382: enum { ! 383: kUSBSetConfig = 0, ! 384: kUSBGetConfig, ! 385: kUSBGetConfigDescriptor, ! 386: kUSBControlReqOut, ! 387: kUSBControlReqIn, ! 388: kUSBOpenPipe, ! 389: kUSBClosePipe, ! 390: kUSBReadPipe, ! 391: kUSBWritePipe, ! 392: kUSBGetPipeStatus, ! 393: kUSBAbortPipe, ! 394: kUSBResetPipe, ! 395: kUSBSetPipeIdle, ! 396: kUSBSetPipeActive, ! 397: kUSBClearPipeStall, ! 398: kUSBReadPipeOOL, ! 399: kUSBWritePipeOOL, ! 400: kUSBControlReqOutOOL, ! 401: kUSBControlReqInOOL, ! 402: kUSBResetDevice, ! 403: kNumUSBMethods ! 404: }; ! 405: ! 406: // use a structure because there's a limit of 6 total arguments ! 407: // to a user client method. ! 408: typedef struct devReqOOL { ! 409: void *buf; ! 410: UInt32 pipe; ! 411: UInt32 sizeIn; ! 412: UInt16 wValue; ! 413: UInt16 wIndex; ! 414: UInt8 bmreqtype; ! 415: UInt8 request; ! 416: } DevReqOOL; ! 417: ! 418: #ifdef __cplusplus ! 419: } ! 420: #endif ! 421: ! 422: #endif /* _USB_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.