#ifndef _USBHUB_H
#define _USBHUB_H
#include <IOKit/usb/USB.h>
#include <IOKit/usb/USBSpec.h>
enum {
kUSBHubDescriptorType = 0x29
};
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
};
enum {
kHubPortConnection = 0x0001,
kHubPortEnabled = 0x0002,
kHubPortSuspend = 0x0004,
kHubPortOverCurrent = 0x0008,
kHubPortBeingReset = 0x0010,
kHubPortPower = 0x0100,
kHubPortLowSpeed = 0x0200,
kHubPortHighSpeed = 0x0400,
kHubPortTestMode = 0x0800,
kHubPortIndicator = 0x1000,
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),
kHubPortIndicatorBit = 7,
kHubPortIndicatorMask = 0x0080
};
enum {
kHubSupportsGangPower = 0,
kHubSupportsIndividualPortPower = 1,
kHubPortSetPowerOff = 0,
kHubPortSetPowerOn = 1
};
enum {
kHubPortIndicatorAutomatic = 0,
kHubPortIndicatorAmber,
kHubPortIndicatorGreen,
kHubPortIndicatorOff
};
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),
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)
};
struct IOUSBHubDescriptor {
UInt8 length;
UInt8 hubType;
UInt8 numPorts;
UInt16 characteristics __attribute__((packed));
UInt8 powerOnToGood;
UInt8 hubCurrent;
UInt8 removablePortFlags[8];
UInt8 pwrCtlPortFlags[8];
};
typedef struct IOUSBHubDescriptor IOUSBHubDescriptor;
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
};
#endif