#ifndef _USB_H
#define _USB_H
#if KERNEL
#include <libkern/OSByteOrder.h>
#include <IOKit/IOMemoryDescriptor.h>
#else
#include <architecture/byte_order.h>
#endif
#include <IOKit/IOTypes.h>
#if !defined(__USB__)
# include <IOKit/usb/USBSpec.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
#if KERNEL
#define USBToHostWord OSSwapLittleToHostInt16
#define HostToUSBWord OSSwapHostToLittleInt16
#define USBToHostLong OSSwapLittleToHostInt32
#define HostToUSBLong OSSwapHostToLittleInt32
#else
#define USBToHostWord NXSwapLittleShortToHost
#define HostToUSBWord NXSwapHostShortToLittle
#define USBToHostLong NXSwapLittleLongToHost
#define HostToUSBLong NXSwapHostLongToLittle
#endif
enum {
kUSBDeviceIDShift = 7,
kUSBMaxDevices = 128,
kUSBMaxDevice = kUSBMaxDevices-1,
kUSBDeviceIDMask = 0x7f,
kUSBPipeIDMask = 0xf,
kUSBMaxPipes = 32,
kUSBInterfaceIDShift = 8,
kUSBMaxInterfaces = 1 << kUSBInterfaceIDShift,
kUSBInterfaceIDMask = kUSBMaxInterfaces-1,
kUSBEndPtShift = 7,
kUSBDeviceMask = ((1 << kUSBEndPtShift) -1),
kUSBNoPipeIdx = -1
};
enum {
kUSBRqDirnShift = 7,
kUSBRqDirnMask = 1,
kUSBRqTypeShift = 5,
kUSBRqTypeMask = 3,
kUSBRqRecipientMask = 0X1F
};
#define USBmakebmRequestType(direction, type, recipient) \
((direction & kUSBRqDirnMask) << kUSBRqDirnShift) | \
((type & kUSBRqTypeMask) << kUSBRqTypeShift) | \
(recipient & kUSBRqRecipientMask)
enum {
kUSBMaxIsocFrameReqCount = 1023 };
#define EncodeRequest(request, direction, type, recipient) \
(((UInt16)request << 8) + \
((UInt16)recipient + \
((UInt16)type << kUSBRqTypeShift) + \
((UInt16)direction << kUSBRqDirnShift)))
enum {
kClearDeviceFeature
= EncodeRequest(kUSBRqClearFeature, kUSBOut, kUSBStandard, kUSBDevice),
kClearInterfaceFeature
= EncodeRequest(kUSBRqClearFeature, kUSBOut, kUSBStandard, kUSBInterface),
kClearEndpointFeature
= EncodeRequest(kUSBRqClearFeature, kUSBOut, kUSBStandard, kUSBEndpoint),
kGetConfiguration
= EncodeRequest(kUSBRqGetConfig, kUSBIn, kUSBStandard, kUSBDevice),
kGetDescriptor
= EncodeRequest(kUSBRqGetDescriptor, kUSBIn, kUSBStandard, kUSBDevice),
kGetInterface
= EncodeRequest(kUSBRqGetInterface, kUSBIn, kUSBStandard, kUSBInterface),
kGetDeviceStatus
= EncodeRequest(kUSBRqGetStatus, kUSBIn, kUSBStandard, kUSBDevice),
kGetInterfaceStatus
= EncodeRequest(kUSBRqGetStatus, kUSBIn, kUSBStandard, kUSBInterface),
kGetEndpointStatus
= EncodeRequest(kUSBRqGetStatus, kUSBIn, kUSBStandard, kUSBEndpoint),
kSetAddress
= EncodeRequest(kUSBRqSetAddress, kUSBOut, kUSBStandard, kUSBDevice),
kSetConfiguration
= EncodeRequest(kUSBRqSetConfig, kUSBOut, kUSBStandard, kUSBDevice),
kSetDescriptor
= EncodeRequest(kUSBRqSetDescriptor, kUSBOut, kUSBStandard, kUSBDevice),
kSetDeviceFeature
= EncodeRequest(kUSBRqSetFeature, kUSBOut, kUSBStandard, kUSBDevice),
kSetInterfaceFeature
= EncodeRequest(kUSBRqSetFeature, kUSBOut, kUSBStandard, kUSBInterface),
kSetEndpointFeature
= EncodeRequest(kUSBRqSetFeature, kUSBOut, kUSBStandard, kUSBEndpoint),
kSetInterface
= EncodeRequest(kUSBRqSetInterface, kUSBOut, kUSBStandard, kUSBInterface),
kSyncFrame
= EncodeRequest(kUSBRqSyncFrame, kUSBIn, kUSBStandard, kUSBEndpoint),
};
typedef UInt16 USBDeviceAddress;
typedef struct IOUSBIsocFrame {
IOReturn frStatus;
UInt16 frReqCount;
UInt16 frActCount;
} IOUSBIsocFrame;
struct IOUSBLowLatencyIsocFrame {
IOReturn frStatus;
UInt16 frReqCount;
UInt16 frActCount;
AbsoluteTime frTimeStamp;
};
typedef struct IOUSBLowLatencyIsocFrame IOUSBLowLatencyIsocFrame;
typedef void (*IOUSBCompletionAction)(
void * target,
void * parameter,
IOReturn status,
UInt32 bufferSizeRemaining);
typedef void (*IOUSBIsocCompletionAction)(
void * target,
void * parameter,
IOReturn status,
IOUSBIsocFrame *pFrames);
typedef void (*IOUSBLowLatencyIsocCompletionAction)(
void * target,
void * parameter,
IOReturn status,
IOUSBLowLatencyIsocFrame *pFrames);
typedef struct IOUSBCompletion {
void * target;
IOUSBCompletionAction action;
void * parameter;
} IOUSBCompletion;
typedef struct IOUSBIsocCompletion {
void * target;
IOUSBIsocCompletionAction action;
void * parameter;
} IOUSBIsocCompletion;
typedef struct IOUSBLowLatencyIsocCompletion {
void * target;
IOUSBLowLatencyIsocCompletionAction action;
void * parameter;
} IOUSBLowLatencyIsocCompletion;
typedef struct IOUSBLowLatencyIsocCompletion IOUSBLowLatencyIsocCompletion;
#define iokit_usb_err(return) (sys_iokit|sub_iokit_usb|return)
#define kIOUSBUnknownPipeErr iokit_usb_err(97) // 0x61 Pipe ref not recognised
#define kIOUSBTooManyPipesErr iokit_usb_err(96) // 0x60 Too many pipes
#define kIOUSBNoAsyncPortErr iokit_usb_err(95) // 0x5f no async port
#define kIOUSBNotEnoughPipesErr iokit_usb_err(94) // 0x5e not enough pipes in interface
#define kIOUSBNotEnoughPowerErr iokit_usb_err(93) // 0x5d not enough power for selected configuration
#define kIOUSBEndpointNotFound iokit_usb_err(87) // 0x57 Not found
#define kIOUSBConfigNotFound iokit_usb_err(86) // 0x56 Not found
#define kIOUSBTransactionTimeout iokit_usb_err(81) // 0x51 time out
#define kIOUSBTransactionReturned iokit_usb_err(80) // 0x50 The transaction has been returned to the caller
#define kIOUSBPipeStalled iokit_usb_err(79) // 0x4f Pipe has stalled, error needs to be cleared
#define kIOUSBInterfaceNotFound iokit_usb_err(78) // 0x4e Interface ref not recognized
#define kIOUSBLowLatencyBufferNotPreviouslyAllocated iokit_usb_err(77) // 0x4d Attempted to use user land low latency isoc calls w/out calling PrepareBuffer first
#define kIOUSBLowLatencyFrameListNotPreviouslyAllocated iokit_usb_err(76) // 0x4c Attempted to use user land low latency isoc calls w/out calling PrepareBuffer first
#define kIOUSBLinkErr iokit_usb_err(16) //
#define kIOUSBNotSent2Err iokit_usb_err(15) // Transaction not sent
#define kIOUSBNotSent1Err iokit_usb_err(14) // Transaction not sent
#define kIOUSBBufferUnderrunErr iokit_usb_err(13) // Buffer Underrun (Host hardware failure on data out, PCI busy?)
#define kIOUSBBufferOverrunErr iokit_usb_err(12) // Buffer Overrun (Host hardware failure on data out, PCI busy?)
#define kIOUSBReserved2Err iokit_usb_err(11) // Reserved
#define kIOUSBReserved1Err iokit_usb_err(10) // Reserved
#define kIOUSBWrongPIDErr iokit_usb_err(7) // Pipe stall, Bad or wrong PID
#define kIOUSBPIDCheckErr iokit_usb_err(6) // Pipe stall, PID CRC error
#define kIOUSBDataToggleErr iokit_usb_err(3) // Pipe stall, Bad data toggle
#define kIOUSBBitstufErr iokit_usb_err(2) // Pipe stall, bitstuffing
#define kIOUSBCRCErr iokit_usb_err(1) // Pipe stall, bad CRC
#define iokit_usb_msg(message) (UInt32)(sys_iokit|sub_iokit_usb|message)
#define kIOUSBMessageHubResetPort iokit_usb_msg(1)
#define kIOUSBMessageHubSuspendPort iokit_usb_msg(2)
#define kIOUSBMessageHubResumePort iokit_usb_msg(3)
#define kIOUSBMessageHubIsDeviceConnected iokit_usb_msg(4)
#define kIOUSBMessageHubIsPortEnabled iokit_usb_msg(5)
#define kIOUSBMessageHubReEnumeratePort iokit_usb_msg(6)
#define kIOUSBMessagePortHasBeenReset iokit_usb_msg(10)
#define kIOUSBMessagePortHasBeenResumed iokit_usb_msg(11)
struct IOUSBMouseData {
UInt16 buttons;
SInt16 XDelta;
SInt16 YDelta;
};
typedef struct IOUSBMouseData IOUSBMouseData;
typedef IOUSBMouseData * IOUSBMouseDataPtr;
struct IOUSBKeyboardData {
UInt16 keycount;
UInt16 usbkeycode[32];
};
typedef struct IOUSBKeyboardData IOUSBKeyboardData;
typedef IOUSBKeyboardData * IOUSBKeyboardDataPtr;
union IOUSBHIDData {
IOUSBKeyboardData kbd;
IOUSBMouseData mouse;
};
typedef union IOUSBHIDData IOUSBHIDData;
typedef IOUSBHIDData * IOUSBHIDDataPtr;
struct IOUSBDeviceDescriptor {
UInt8 bLength;
UInt8 bDescriptorType;
UInt16 bcdUSB;
UInt8 bDeviceClass;
UInt8 bDeviceSubClass;
UInt8 bDeviceProtocol;
UInt8 bMaxPacketSize0;
UInt16 idVendor;
UInt16 idProduct;
UInt16 bcdDevice;
UInt8 iManufacturer;
UInt8 iProduct;
UInt8 iSerialNumber;
UInt8 bNumConfigurations;
};
typedef struct IOUSBDeviceDescriptor IOUSBDeviceDescriptor;
typedef IOUSBDeviceDescriptor * IOUSBDeviceDescriptorPtr;
struct IOUSBDescriptorHeader {
UInt8 bLength;
UInt8 bDescriptorType;
};
typedef struct IOUSBDescriptorHeader IOUSBDescriptorHeader;
typedef IOUSBDescriptorHeader * IOUSBDescriptorHeaderPtr;
struct IOUSBConfigurationDescriptor {
UInt8 bLength;
UInt8 bDescriptorType;
UInt16 wTotalLength;
UInt8 bNumInterfaces;
UInt8 bConfigurationValue;
UInt8 iConfiguration;
UInt8 bmAttributes;
UInt8 MaxPower;
};
typedef struct IOUSBConfigurationDescriptor IOUSBConfigurationDescriptor;
typedef IOUSBConfigurationDescriptor * IOUSBConfigurationDescriptorPtr;
struct IOUSBConfigurationDescHeader {
UInt8 bLength;
UInt8 bDescriptorType;
UInt16 wTotalLength;
};
typedef struct IOUSBConfigurationDescHeader IOUSBConfigurationDescHeader;
typedef IOUSBConfigurationDescHeader * IOUSBConfigurationDescHeaderPtr;
struct IOUSBInterfaceDescriptor {
UInt8 bLength;
UInt8 bDescriptorType;
UInt8 bInterfaceNumber;
UInt8 bAlternateSetting;
UInt8 bNumEndpoints;
UInt8 bInterfaceClass;
UInt8 bInterfaceSubClass;
UInt8 bInterfaceProtocol;
UInt8 iInterface;
};
typedef struct IOUSBInterfaceDescriptor IOUSBInterfaceDescriptor;
typedef IOUSBInterfaceDescriptor * IOUSBInterfaceDescriptorPtr;
struct IOUSBEndpointDescriptor {
UInt8 bLength;
UInt8 bDescriptorType;
UInt8 bEndpointAddress;
UInt8 bmAttributes;
UInt16 wMaxPacketSize;
UInt8 bInterval;
};
typedef struct IOUSBEndpointDescriptor IOUSBEndpointDescriptor;
typedef IOUSBEndpointDescriptor * IOUSBEndpointDescriptorPtr;
struct IOUSBHIDDescriptor {
UInt8 descLen;
UInt8 descType;
UInt16 descVersNum;
UInt8 hidCountryCode;
UInt8 hidNumDescriptors;
UInt8 hidDescriptorType;
UInt8 hidDescriptorLengthLo;
UInt8 hidDescriptorLengthHi;
};
typedef struct IOUSBHIDDescriptor IOUSBHIDDescriptor;
typedef IOUSBHIDDescriptor *IOUSBHIDDescriptorPtr;
struct IOUSBHIDReportDesc {
UInt8 hidDescriptorType;
UInt8 hidDescriptorLengthLo;
UInt8 hidDescriptorLengthHi;
};
typedef struct IOUSBHIDReportDesc IOUSBHIDReportDesc;
typedef IOUSBHIDReportDesc * IOUSBHIDReportDescPtr;
#pragma pack(1)
struct IOUSBDeviceQualifierDescriptor
{
UInt8 bLength;
UInt8 bDescriptorType;
UInt16 bcdUSB;
UInt8 bDeviceClass;
UInt8 bDeviceSubClass;
UInt8 bDeviceProtocol;
UInt8 bMaxPacketSize0;
UInt8 bNumConfigurations;
UInt8 bReserved;
};
typedef struct IOUSBDeviceQualifierDescriptor IOUSBDeviceQualifierDescriptor;
typedef IOUSBDeviceQualifierDescriptor * IOUSBDeviceQualifierDescriptorPtr;
struct IOUSBDFUDescriptor
{
UInt8 bLength;
UInt8 bDescriptorType;
UInt8 bmAttributes;
UInt16 wDetachTimeout;
UInt16 wTransferSize;
};
typedef struct IOUSBDFUDescriptor IOUSBDFUDescriptor;
typedef IOUSBDFUDescriptor * IOUSBDFUDescriptorPtr;
#pragma options align=reset
typedef UInt16 USBStatus;
typedef USBStatus * USBStatusPtr;
enum {
kIOUSBAnyClass = 0xFFFF,
kIOUSBAnySubClass = 0xFFFF,
kIOUSBAnyProtocol = 0xFFFF,
kIOUSBAnyVendor = 0xFFFF,
kIOUSBAnyProduct = 0xFFFF
};
typedef struct IOUSBMatch {
UInt16 usbClass;
UInt16 usbSubClass;
UInt16 usbProtocol;
UInt16 usbVendor;
UInt16 usbProduct;
} IOUSBMatch;
typedef struct {
UInt8 type; UInt8 direction; UInt16 maxPacketSize;
UInt8 interval;
} IOUSBFindEndpointRequest;
typedef struct {
UInt8 bmRequestType;
UInt8 bRequest;
UInt16 wValue;
UInt16 wIndex;
UInt16 wLength;
void * pData; UInt32 wLenDone; } IOUSBDevRequest;
typedef IOUSBDevRequest * IOUSBDeviceRequestPtr;
typedef struct {
UInt8 bmRequestType;
UInt8 bRequest;
UInt16 wValue;
UInt16 wIndex;
UInt16 wLength;
void * pData; UInt32 wLenDone; UInt32 noDataTimeout;
UInt32 completionTimeout;
} IOUSBDevRequestTO;
enum
{
kUSBDefaultControlNoDataTimeoutMS = 5000,
kUSBDefaultControlCompletionTimeoutMS = 0
};
typedef struct
{
UInt32 pipeRef;
void *buf;
UInt32 size;
UInt32 noDataTimeout;
UInt32 completionTimeout;
} IOUSBBulkPipeReq;
#if KERNEL
typedef struct {
UInt8 bmRequestType;
UInt8 bRequest;
UInt16 wValue;
UInt16 wIndex;
UInt16 wLength;
IOMemoryDescriptor *pData; UInt32 wLenDone; } IOUSBDevRequestDesc;
enum {
kIOUSBInterfaceOpenAlt = 0x00010000
};
#endif
typedef struct {
UInt8 bmRequestType;
UInt8 bRequest;
UInt16 wValue;
UInt16 wIndex;
UInt16 wLength;
void * pData; UInt32 wLenDone; UInt8 pipeRef;
} IOUSBDevReqOOL;
typedef struct {
UInt8 bmRequestType;
UInt8 bRequest;
UInt16 wValue;
UInt16 wIndex;
UInt16 wLength;
void * pData; UInt32 wLenDone; UInt8 pipeRef;
UInt32 noDataTimeout;
UInt32 completionTimeout;
} IOUSBDevReqOOLTO;
typedef struct {
UInt32 fPipe;
void *fBuffer;
UInt32 fBufSize;
UInt64 fStartFrame;
UInt32 fNumFrames;
IOUSBIsocFrame *fFrameCounts;
} IOUSBIsocStruct;
struct IOUSBLowLatencyIsocStruct {
UInt32 fPipe;
UInt32 fBufSize;
UInt64 fStartFrame;
UInt32 fNumFrames;
UInt32 fUpdateFrequency;
UInt32 fDataBufferCookie;
UInt32 fDataBufferOffset;
UInt32 fFrameListBufferCookie;
UInt32 fFrameListBufferOffset;
};
typedef struct IOUSBLowLatencyIsocStruct IOUSBLowLatencyIsocStruct;
typedef struct {
UInt64 frame;
AbsoluteTime timeStamp;
} IOUSBGetFrameStruct;
typedef struct {
UInt16 bInterfaceClass; UInt16 bInterfaceSubClass; UInt16 bInterfaceProtocol; UInt16 bAlternateSetting; } IOUSBFindInterfaceRequest;
enum {
kIOUSBFindInterfaceDontCare = 0xFFFF
};
enum {
kIOUSBVendorIDAppleComputer = 0x05AC
};
enum {
kUSBDeviceSpeedLow = 0, kUSBDeviceSpeedFull = 1, kUSBDeviceSpeedHigh = 2 };
enum {
kUSBLowLatencyIsochTransferKey = 'llit' };
typedef struct LowLatencyUserBufferInfo LowLatencyUserBufferInfo;
struct LowLatencyUserBufferInfo {
UInt32 cookie;
void * bufferAddress;
IOByteCount bufferSize;
UInt32 bufferType;
bool isPrepared;
LowLatencyUserBufferInfo * nextBuffer;
};
typedef enum {
kUSBLowLatencyWriteBuffer = 0,
kUSBLowLatencyReadBuffer = 1,
kUSBLowLatencyFrameListBuffer = 2
} USBLowLatencyBufferType;
#define kUSBDevicePropertySpeed "Device Speed"
#define kUSBDevicePropertyBusPowerAvailable "Bus Power Available"
#define kUSBDevicePropertyAddress "USB Address"
#define kUSBDevicePropertyLocationID "locationID"
#ifdef __cplusplus
}
#endif
#endif