#ifndef _USBHUB_H
#define _USBHUB_H
#include <IOKit/usb/USB.h>
#include <IOKit/usb/USBSpec.h>
enum {
kUSBHubDescriptorType = 0x29,
#ifdef SUPPORTS_SS_USB
kUSB3HubDescriptorType = 0x2A
#endif
};
enum {
kUSBHubLocalPowerChangeFeature = 0,
kUSBHubOverCurrentChangeFeature = 1,
kUSBHubPortConnectionFeature = 0,
kUSBHubPortEnableFeature = 1,
kUSBHubPortSuspendFeature = 2,
kUSBHubPortOverCurrentFeature = 3,
kUSBHubPortResetFeature = 4,
kUSBHubPortPowerFeature = 8,
kUSBHubPortLowSpeedFeature = 9,
kUSBHubPortConnectionChangeFeature = 16,
kUSBHubPortEnableChangeFeature = 17,
kUSBHubPortSuspendChangeFeature = 18,
kUSBHubPortOverCurrentChangeFeature = 19,
kUSBHubPortResetChangeFeature = 20,
kUSBHubPortTestFeature = 21,
kUSBHubPortIndicatorFeature = 22,
#ifdef SUPPORTS_SS_USB
kUSBHubPortLinkStateFeature = 5,
kUSBHubPortU1TimeoutFeature = 23,
kUSBHubPortU2TimeoutFeature = 24,
kUSBHubPortLinkStateChangeFeature = 25,
kUSBHubPortConfigErrorChangeFeature = 26,
kUSBHubPortRemoteWakeMaskFeature = 27,
kUSBHubPortBHPortResetFeature = 28,
kUSBHubPortBHResetChangeFeature = 29,
kUSBHubPortForceLinkPMAcceptFeature = 30,
#endif
};
enum {
kSSHubPortStatusConnectionBit = 0,
kSSHubPortStatusEnabledBit = 1,
kSSHubPortStatusOverCurrentBit = 3,
kSSHubPortStatusResetBit = 4,
#ifdef SUPPORTS_SS_USB
kSSHubPortStatusLinkStateShift = 5,
kSSHubPortStatusPowerBit = 9,
kSSHubPortStatusSpeedShift = 10,
kSSHubPortChangeBHResetBit = 5,
kSSHubPortChangePortLinkStateBit = 6,
kSSHubPortChangePortConfigErrBit = 7,
#endif
kHubPortConnection = 0x0001,
kHubPortEnabled = 0x0002,
kHubPortSuspend = 0x0004,
kHubPortOverCurrent = 0x0008,
kHubPortBeingReset = 0x0010,
kHubPortPower = 0x0100,
kHubPortLowSpeed = 0x0200,
kHubPortHighSpeed = 0x0400,
kHubPortTestMode = 0x0800,
kHubPortIndicator = 0x1000,
#ifdef SUPPORTS_SS_USB
kHubPortSuperSpeed = 0x2000, kHubPortBit14 = 0x4000, kHubPortDebouncing = 0x8000,
kSSHubPortStatusConnectionMask = ( 1 << kSSHubPortStatusConnectionBit ),
kSSHubPortStatusEnabledMask = ( 1 << kSSHubPortStatusEnabledBit ),
kSSHubPortStatusOverCurrentMask = ( 1 << kSSHubPortStatusOverCurrentBit ),
kSSHubPortStatusBeingResetMask = ( 1 << kSSHubPortStatusResetBit ),
kSSHubPortStatusLinkStateMask = 0x01E0,
kSSHubPortStatusPowerMask = ( 1 << kSSHubPortStatusPowerBit ),
kSSHubPortStatusSpeedMask = 0x1C00,
kSSHubPortChangeBHResetMask = ( 1 << kSSHubPortChangeBHResetBit ),
kSSHubPortChangePortLinkStateMask = ( 1 << kSSHubPortChangePortLinkStateBit ),
kSSHubPortChangePortConfigErrMask = ( 1 << kSSHubPortChangePortConfigErrBit ),
kHubPortSuperSpeedStateChangeMask = (kHubPortConnection | kHubPortEnabled | kHubPortSuspend | kHubPortOverCurrent | kHubPortBeingReset | kSSHubPortStatusBeingResetMask | kSSHubPortChangePortLinkStateMask | kSSHubPortChangePortConfigErrMask),
#endif
kHubPortStateChangeMask = (kHubPortConnection | kHubPortEnabled | kHubPortSuspend | kHubPortOverCurrent | kHubPortBeingReset)
};
enum {
kHubLocalPowerStatus = 1,
kHubOverCurrentIndicator = 2,
kHubLocalPowerStatusChange = 1,
kHubOverCurrentIndicatorChange = 2
};
enum {
kPerPortSwitchingBit = (1 << 0),
kNoPowerSwitchingBit = (1 << 1),
kCompoundDeviceBit = (1 << 2),
kPerPortOverCurrentBit = (1 << 3),
kNoOverCurrentBit = (1 << 4),
kHubTTThinkTimeMask = 0x60,
kHubTTThinkTimeShift = 5,
kHubPortIndicatorBit = 7,
kHubPortIndicatorMask = 0x0080
};
enum {
kHubSupportsGangPower = 0,
kHubSupportsIndividualPortPower = 1,
kHubPortSetPowerOff = 0,
kHubPortSetPowerOn = 1
};
enum {
kHubPortIndicatorAutomatic = 0,
kHubPortIndicatorAmber,
kHubPortIndicatorGreen,
kHubPortIndicatorOff
};
enum {
kPrdRootHubApple = 0x8005, kPrdRootHubAppleE = 0x8006, #ifdef SUPPORTS_SS_USB
kPrdRootHubAppleSS = 0x8007, #endif
kUSBRootHubPollingRate = 32 };
enum USBHubClassRequest {
kUSBHubRqGetStatus = 0,
kUSBHubRqClearFeature = 1,
kUSBHubRqGetState = 2,
kUSBHubRqSetFeature = 3,
kUSBHubRqReserved2 = 4,
kUSBHubRqSetAddress = 5,
kUSBHubRqGetDescriptor = 6,
kUSBHubRqSetDescriptor = 7,
kUSBHubRqGetConfig = 8,
kUSBHubRqSetConfig = 9,
kUSBHubRqGetInterface = 10,
kUSBHubRqSetInterface = 11,
};
enum {
kClearHubFeature = EncodeRequest(kUSBRqClearFeature, kUSBOut, kUSBClass, kUSBDevice),
kClearPortFeature = EncodeRequest(kUSBRqClearFeature, kUSBOut, kUSBClass, kUSBOther),
kGetPortState = EncodeRequest(kUSBRqGetState, kUSBIn, kUSBClass, kUSBOther),
kGetHubDescriptor = EncodeRequest(kUSBRqGetDescriptor, kUSBIn, kUSBClass, kUSBDevice),
#ifdef SUPPORTS_SS_USB
kGetHub3Descriptor= EncodeRequest(kUSBRqGetDescriptor, kUSBIn, kUSBClass, kUSBDevice),
#endif
kGetHubStatus = EncodeRequest(kUSBRqGetStatus, kUSBIn, kUSBClass, kUSBDevice),
kGetPortStatus = EncodeRequest(kUSBRqGetStatus, kUSBIn, kUSBClass, kUSBOther),
kSetHubDescriptor = EncodeRequest(kUSBRqGetDescriptor, kUSBOut, kUSBClass, kUSBDevice),
kSetHubFeature = EncodeRequest(kUSBRqSetFeature, kUSBOut, kUSBClass, kUSBDevice),
kSetPortFeature = EncodeRequest(kUSBRqSetFeature, kUSBOut, kUSBClass, kUSBOther)
};
enum{
kNumPortBytes = 9
};
struct IOUSBHubDescriptor {
UInt8 length;
UInt8 hubType;
UInt8 numPorts;
UInt16 characteristics __attribute__((packed));
UInt8 powerOnToGood; UInt8 hubCurrent;
UInt8 removablePortFlags[kNumPortBytes];
UInt8 pwrCtlPortFlags[kNumPortBytes];
};
typedef struct IOUSBHubDescriptor IOUSBHubDescriptor;
enum
{
kUSBHSHubCommandAddHub = 1,
kUSBHSHubCommandRemoveHub = 2,
kUSBHSHubFlagsMultiTTMask = 0x01,
kUSBHSHubFlagsMoreInfoMask = 0x02,
kUSBHSHubFlagsTTThinkTimeShift = 2,
kUSBHSHubFlagsTTThinkTimeMask = 0x0C,
kUSBHSHubFlagsNumPortsShift = 4,
kUSBHSHubFlagsNumPortsMask = 0xF0
};
#ifdef SUPPORTS_SS_USB
struct IOUSB3HubDescriptor {
UInt8 length;
UInt8 hubType;
UInt8 numPorts;
UInt16 characteristics __attribute__((packed));
UInt8 powerOnToGood; UInt8 hubCurrent;
UInt8 hubHdrDecLat; UInt16 hubDelay __attribute__((packed));
UInt8 removablePortFlags[kNumPortBytes];
UInt8 pwrCtlPortFlags[kNumPortBytes]; };
typedef struct IOUSB3HubDescriptor IOUSB3HubDescriptor;
#endif
struct IOUSBHubStatus {
UInt16 statusFlags;
UInt16 changeFlags;
};
typedef struct IOUSBHubStatus IOUSBHubStatus;
typedef IOUSBHubStatus * IOUSBHubStatusPtr;
typedef struct IOUSBHubStatus IOUSBHubPortStatus;
typedef struct IOUSBHubPortReEnumerateParam IOUSBHubPortReEnumerateParam;
struct IOUSBHubPortReEnumerateParam {
UInt32 portNumber;
UInt32 options;
};
typedef struct IOUSBHubPortClearTTParam IOUSBHubPortClearTTParam;
struct IOUSBHubPortClearTTParam {
UInt32 portNumber;
UInt32 options;
#if 0
UInt8 deviceAddress; <<0
UInt8 endpointNum; <<8
UInt8 endpointType; <<16 UInt8 IN; <<24 #endif
};
#ifdef SUPPORTS_SS_USB
#pragma mark USB 3 Additions
enum {
kUSBHubRqSetHubDepth = 12,
kUSBHubRqGetPortErrorCount = 13
};
enum {
kSetHubDepth = EncodeRequest(kUSBHubRqSetHubDepth, kUSBOut, kUSBClass, kUSBDevice),
kGetPortErrorCount = EncodeRequest(kUSBHubRqGetPortErrorCount, kUSBIn, kUSBClass, kUSBOther)
};
enum {
kSSHubPortLinkStateU0 = 0,
kSSHubPortLinkStateU1 = 1,
kSSHubPortLinkStateU2 = 2,
kSSHubPortLinkStateU3 = 3,
kSSHubPortLinkStateSSDisabled = 4,
kSSHubPortLinkStateRxDetect = 5,
kSSHubPortLinkStateSSInactive = 6,
kSSHubPortLinkStatePolling = 7,
kSSHubPortLinkStateRecovery = 8,
kSSHubPortLinkStateHotReset = 9,
kSSHubPortLinkStateComplianceMode = 10,
kSSHubPortLinkStateLoopBack = 11,
kSSHubPortSpeed5Gbps = 0
};
#endif
#endif