|
|
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: /* ! 23: * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. ! 24: * ! 25: * HISTORY ! 26: * ! 27: */ ! 28: ! 29: ! 30: #ifndef _IOKIT_IOUSBNUB_H ! 31: #define _IOKIT_IOUSBNUB_H ! 32: ! 33: #include <IOKit/IOService.h> ! 34: #include <libkern/c++/OSData.h> ! 35: #include <IOKit/IOMemoryDescriptor.h> ! 36: ! 37: #include <IOKit/usb/USB.h> ! 38: ! 39: class IOUSBController; ! 40: class IOUSBPipe; ! 41: ! 42: /*! ! 43: @struct IOUSBDevRequest ! 44: parameter block for control requests, using a simple pointer ! 45: for the data to be transferred. ! 46: @field rdDirection Direction of data part of request: kUSBIn or kUSBOut ! 47: @field rqType Request type: kUSBStandard, kUSBClass or kUSBVendor ! 48: @field rqRecipient Target of the request: kUSBDevice, kUSBInterface, ! 49: kUSBEndpoint or kUSBOther ! 50: @field bRequest Request code ! 51: @field wValue 16 bit parameter for request, low byte first ! 52: @field wIndex 16 bit parameter for request, low byte first ! 53: @field wLength Length of data part of request, 16 bits, low byte first ! 54: @field pData Pointer to data for request ! 55: @field wLenDone Set by standard completion routine to number of data bytes ! 56: actually transferred ! 57: */ ! 58: typedef struct { ! 59: UInt8 rqDirection:1; // bmRequestType:7 ! 60: UInt8 rqType:2; // bmRequestType:6..5 ! 61: UInt8 rqRecipient:5; // bmRequestType:4..0 ! 62: UInt8 bRequest; ! 63: USBWord wValue; ! 64: USBWord wIndex; ! 65: USBWord wLength; ! 66: void * pData; // data pointer ! 67: UInt32 wLenDone; // # bytes transferred ! 68: } IOUSBDevRequest; ! 69: typedef IOUSBDevRequest * IOUSBDeviceRequestPtr; ! 70: ! 71: /*! ! 72: @struct IOUSBDevRequestDesc ! 73: parameter block for control requests, using a memory descriptor ! 74: for the data to be transferred ! 75: @field rdDirection Direction of data part of request: kUSBIn or kUSBOut ! 76: @field rqType Request type: kUSBStandard, kUSBClass or kUSBVendor ! 77: @field rqRecipient Target of the request: kUSBDevice, kUSBInterface, ! 78: kUSBEndpoint or kUSBOther ! 79: @field bRequest Request code ! 80: @field wValue 16 bit parameter for request, low byte first ! 81: @field wIndex 16 bit parameter for request, low byte first ! 82: @field wLength Length of data part of request, 16 bits, low byte first ! 83: @field pData Pointer to memory descriptor for data for request ! 84: @field wLenDone Set by standard completion routine to number of data bytes ! 85: actually transferred ! 86: */ ! 87: typedef struct { ! 88: UInt8 rqDirection:1; // bmRequestType:7 ! 89: UInt8 rqType:2; // bmRequestType:6..5 ! 90: UInt8 rqRecipient:5; // bmRequestType:4..0 ! 91: UInt8 bRequest; ! 92: USBWord wValue; ! 93: USBWord wIndex; ! 94: USBWord wLength; ! 95: IOMemoryDescriptor *pData; // data pointer ! 96: UInt32 wLenDone; // # bytes transferred ! 97: } IOUSBDevRequestDesc; ! 98: ! 99: /*! ! 100: @class IOUSBNub ! 101: @abstract abstract base class for IOUSBDevice and IOUSBInterface ! 102: @discussion This class provides functionality that is useful for both ! 103: a device driver (which would attach to an IOUSBDevice) and an interface driver ! 104: (which would attach to an IOUSBInterface). ! 105: */ ! 106: ! 107: class IOUSBNub : public IOService ! 108: { ! 109: OSDeclareDefaultStructors(IOUSBNub) ! 110: ! 111: protected: ! 112: USBDeviceAddress _address; ! 113: IOUSBController * _controller; ! 114: IOUSBPipe * _pipeZero; ! 115: IOUSBDeviceDescriptor _descriptor; ! 116: UInt32 _busPowerAvailable; ! 117: UInt8 _speed; ! 118: ! 119: public: ! 120: virtual bool finalize(IOOptionBits options); ! 121: ! 122: /*! ! 123: @struct FindInterfaceRequest ! 124: Parameter block for finding interfaces in a device. ! 125: Initialize each field to the desired value ! 126: before calling findNextInterface, set a field to 0 if any value is OK. ! 127: @field theClass Requested class ! 128: @field subClass Requested subclass ! 129: @field protocol Requested protocol ! 130: @field maxPower max power consumption in 2mA units ! 131: @field busPowered 1 = not bus powered, 2 = bus powered ! 132: @field selfPowered 1 = not self powered, 2 = self powered ! 133: @field remoteWakeup 1 = doesn't support remote wakeup, 2 = does ! 134: */ ! 135: struct FindInterfaceRequest { ! 136: UInt8 theClass; // requested class, 0 = don't care ! 137: UInt8 subClass; // requested subclass; 0 = don't care ! 138: UInt8 protocol; // requested protocol; 0 = don't care ! 139: UInt8 maxPower; // max power in 2ma increments; 0 = don't care ! 140: UInt8 busPowered:2; // 1 = not bus powered, 2 = bus powered, ! 141: UInt8 selfPowered:2; // 1 = not self powered, 2 = self powered, ! 142: UInt8 remoteWakeup:2; // 1 = doesn't support remote wakeup; 2 = does ! 143: UInt8 reserved:2; ! 144: }; ! 145: ! 146: /*! ! 147: @function findNextDescriptor ! 148: @abstract find next descriptor in configuration list of given type ! 149: (kUSBAnyDesc matches any type). ! 150: @discussion call this function with a pointer to a descriptor in a descriptor list, ! 151: for example the descriptor list returned by IOUSBDevice::getFullConfigurationDescriptor(). ! 152: Returns NULL if no more descriptors match descType. ! 153: @param cur current descriptor in list ! 154: @param descType descriptor type to return (kUSBAnyDesc to match any type) ! 155: @result Pointer to the next matching descriptor, or NULL if no more match. ! 156: */ ! 157: static const IOUSBDescriptorHeader *findNextDescriptor(const void *cur, UInt8 descType); ! 158: ! 159: /*! ! 160: @function GetStringDescriptor ! 161: Get a string descriptor as ASCII, in the specified language (default is US English) ! 162: @param index Index of the string descriptor to get. ! 163: @param buf Pointer to place to store ASCII string ! 164: @param maxLen Size of buffer pointed to by buf ! 165: @param lang Language to get string in (default is US English) ! 166: */ ! 167: virtual IOReturn GetStringDescriptor(UInt8 index, ! 168: char *buf, int maxLen, UInt16 lang=0x409); ! 169: ! 170: // Lowlevel requests for non-standard device requests ! 171: /*! ! 172: @function deviceRequest ! 173: @abstract execute a device request ! 174: @param request The parameter block to send to the device ! 175: @completion Function to call when request completes. If omitted then deviceRequest() ! 176: executes synchronously, blocking until the request is complete. ! 177: */ ! 178: virtual IOReturn deviceRequest(IOUSBDevRequest *request, ! 179: IOUSBCompletion *completion = 0); ! 180: ! 181: // Same but with a memory descriptor ! 182: virtual IOReturn deviceRequest(IOUSBDevRequestDesc *request, ! 183: IOUSBCompletion *completion = 0); ! 184: ! 185: /*! ! 186: @function GetConfiguration ! 187: Gets the current configuration from the device ! 188: @param configNum Pointer to place to store configuration value ! 189: */ ! 190: virtual IOReturn GetConfiguration(UInt8 *configNumber); ! 191: ! 192: /*! ! 193: @function GetConfiguration ! 194: Gets the current configuration from the device ! 195: @param configNum Pointer to place to store configuration value ! 196: */ ! 197: virtual IOReturn GetDeviceStatus(USBStatus *status); ! 198: ! 199: // Access to addressing and cached info ! 200: /*! ! 201: @function address ! 202: returns the bus address of the device ! 203: */ ! 204: virtual USBDeviceAddress address(void); ! 205: /*! ! 206: @function deviceDescriptor ! 207: returns a pointer to the device descriptor ! 208: */ ! 209: virtual const IOUSBDeviceDescriptor *deviceDescriptor(void); ! 210: /*! ! 211: @function bus ! 212: returns a pointer to the bus object for the device ! 213: */ ! 214: virtual IOUSBController * bus(void); ! 215: /*! ! 216: @function busPowerAvailable ! 217: returns the power available to the device, in units of 2mA ! 218: */ ! 219: virtual UInt32 busPowerAvailable( void ); ! 220: ! 221: /*! ! 222: @function GetBandwidthAvailable ! 223: Returns the available bandwidth (in bytes) per frame for ! 224: isochronous transfers. ! 225: @result maximum number of bytes that a new iso pipe could transfer ! 226: per frame given current allocations. ! 227: */ ! 228: virtual UInt32 GetBandwidthAvailable(); ! 229: ! 230: /*! ! 231: @function GetFrameNumber ! 232: Returns the full current frame number of the bus the device is ! 233: attached to ! 234: @result The frame number. ! 235: */ ! 236: virtual UInt64 GetFrameNumber(); ! 237: ! 238: /*! ! 239: @function pipeZero ! 240: returns a pointer to the device's default pipe ! 241: */ ! 242: virtual IOUSBPipe * pipeZero(); ! 243: ! 244: virtual bool init(OSDictionary * propTable); ! 245: virtual bool matchPropertyTable(OSDictionary * table); ! 246: }; ! 247: ! 248: #ifdef __cplusplus ! 249: extern "C" { ! 250: #endif ! 251: ! 252: void printDescriptor(IOUSBDescriptorHeader *desc); ! 253: void printDeviceDescriptor(IOUSBDeviceDescriptor *desc); ! 254: void printConfigDescriptor(IOUSBConfigurationDescriptor *cd); ! 255: void printEndpointDescriptor(IOUSBEndpointDescriptor *ed); ! 256: void printInterfaceDescriptor(IOUSBInterfaceDescriptor *id); ! 257: ! 258: #ifdef __cplusplus ! 259: } ! 260: #endif ! 261: ! 262: #endif /* _IOKIT_IOUSBNUB_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.