#ifndef _IOKIT_UHCI_H_
#define _IOKIT_UHCI_H_
enum {
kUHCI_CMD = 0x00,
kUHCI_STS = 0x02,
kUHCI_INTR = 0x04,
kUHCI_FRNUM = 0x06,
kUHCI_FRBASEADDR= 0x08,
kUHCI_SOFMOD = 0x0C,
kUHCI_PORTSC1 = 0x10,
kUHCI_PORTSC2 = 0x12
};
enum {
kUHCI_CMD_MAXP = 0x0080,
kUHCI_CMD_CF = 0x0040,
kUHCI_CMD_SWDBG = 0x0020,
kUHCI_CMD_FGR = 0x0010,
kUHCI_CMD_EGSM = 0x0008,
kUHCI_CMD_GRESET = 0x0004,
kUHCI_CMD_HCRESET = 0x0002,
kUHCI_CMD_RS = 0x0001
};
enum {
kUHCI_STS_HCH = 0x0020,
kUHCI_STS_HCPE = 0x0010,
kUHCI_STS_HSE = 0x0008,
kUHCI_STS_RD = 0x0004,
kUHCI_STS_EI = 0x0002,
kUHCI_STS_INT = 0x0001,
kUHCI_STS_MASK = 0x003F,
kUHCI_STS_INTR_MASK = 0x001F
};
enum {
kUHCI_INTR_SPIE = 0x0008,
kUHCI_INTR_IOCE = 0x0004,
kUHCI_INTR_RIE = 0x0002,
kUHCI_INTR_TIE = 0x0001
};
enum {
kUHCI_FRNUM_MASK = 0x07FF,
kUHCI_FRNUM_SHIFT = 11,
kUHCI_FRNUM_FRAME_MASK = 0x03FF,
kUHCI_FRNUM_COUNT = 0x0800,
kUHCI_NUM_FRAMES = 1024
};
enum {
kUHCI_FLBASEADD_BASE = 0xFFFFF000
};
enum {
kUHCI_SOF_TIMING = 0x7F
};
enum {
kUHCI_PORTSC_SUSPEND = 0x1000, kUHCI_PORTSC_OCI = 0x0800, kUHCI_PORTSC_OCA = 0x0400, kUHCI_PORTSC_RESET = 0x0200, kUHCI_PORTSC_LS = 0x0100, kUHCI_PORTSC_RD = 0x0040, kUHCI_PORTSC_LINE = 0x0030,
kUHCI_PORTSC_LINE0 = 0x0010,
kUHCI_PORTSC_LINE1 = 0x0020,
kUHCI_PORTSC_PEDC = 0x0008, kUHCI_PORTSC_PED = 0x0004, kUHCI_PORTSC_CSC = 0x0002, kUHCI_PORTSC_CCS = 0x0001, kUHCI_PORTSC_MASK = (0xFFF5)
};
enum {
kUHCI_PCI_CLASSC = 0x09,
kUHCI_PCI_USBBASE = 0x20,
kUHCI_PCI_SBRN = 0x60,
kUHCI_PCI_LEGKEY = 0xC0, kUHCI_PCI_RES = 0xC4,
kUHCI_LEGKEY_INTR_ENABLE = 0x2000
};
struct UHCIFrameListPointer {
volatile UInt32 pointer;
};
enum {
kUHCI_FRAME_FLP = 0xFFFFFFF0,
kUHCI_FRAME_Q = 0x00000002,
kUHCI_FRAME_T = 0x00000001
};
typedef struct UHCITransferDescriptorShared
UHCITransferDescriptorShared,
*UHCITransferDescriptorSharedPtr;
struct UHCITransferDescriptorShared {
volatile UInt32 link;
volatile UInt32 ctrlStatus;
volatile UInt32 token;
volatile UInt32 buffer;
};
enum {
kUHCI_TD_SPD = 0x20000000,
kUHCI_TD_LS = 0x04000000,
kUHCI_TD_ISO = 0x02000000,
kUHCI_TD_IOC = 0x01000000,
kUHCI_TD_ACTIVE = 0x00800000,
kUHCI_TD_STALLED= 0x00400000,
kUHCI_TD_DBUF = 0x00200000,
kUHCI_TD_BABBLE = 0x00100000,
kUHCI_TD_NAK = 0x00080000,
kUHCI_TD_CRCTO = 0x00040000,
kUHCI_TD_BITSTUFF= 0x00020000,
kUHCI_TD_PID = 0x000000FF,
kUHCI_TD_ACTLEN = 0x000007FF,
kUHCI_TD_D = 0x00080000,
kUHCI_TD_PID_IN = 0x00000069,
kUHCI_TD_PID_OUT= 0x000000E1,
kUHCI_TD_PID_SETUP= 0x0000002D,
kUHCI_TD_MAXLEN_MASK=0xFFE00000,
kUHCI_TD_ERROR_MASK = (kUHCI_TD_STALLED | kUHCI_TD_DBUF |
kUHCI_TD_BABBLE | kUHCI_TD_CRCTO |
kUHCI_TD_BITSTUFF)
};
#define UHCI_TD_GET_ERRCNT(n) (((n) >> 27) & 3)
#define UHCI_TD_SET_ERRCNT(n) (((n) & 3) << 27)
#define UHCI_TD_GET_ACTLEN(n) (((n) + 1) & 0x7FF)
#define UHCI_TD_SET_ACTLEN(n) (((n) - 1) & 0x7FF)
#define UHCI_TD_GET_STATUS(n) (((n) >> 16) & 0xFF)
#define UHCI_TD_GET_PID(n) ((n) & 0xFF)
#define UHCI_TD_GET_ADDR(n) (((n) >> 8) & 0x7F)
#define UHCI_TD_SET_ADDR(n) (((n) & 0x7F) << 8)
#define UHCI_TD_GET_ENDPT(n) (((n) >> 15) & 0xF)
#define UHCI_TD_SET_ENDPT(n) (((n) & 0xF) << 15)
#define UHCI_TD_GET_MAXLEN(n) ((((n) >> 21) + 1) & 0x7FF)
#define UHCI_TD_SET_MAXLEN(n) ((((n) - 1) & 0x7FF) << 21)
typedef struct UHCIQueueHeadShared
UHCIQueueHeadShared,
*UHCIQueueHeadSharedPtr;
struct UHCIQueueHeadShared {
volatile UInt32 hlink;
volatile UInt32 elink;
UInt32 pad[2]; };
enum {
kUHCI_QH_QLP = 0xFFFFFFF0,
kUHCI_QH_Q = 0x00000002,
kUHCI_QH_T = 0x00000001,
kUHCI_TD_VF = 0x00000004,
kUHCI_TD_Q = 0x00000002,
kUHCI_TD_T = 0x00000001
};
enum {
kUHCI_FRAME_COUNT = 1024,
kUHCI_FRAME_ALIGN = 4096,
kUHCI_TD_ALIGN = 16,
kUHCI_QH_ALIGN = 16,
kUHCI_NUM_PORTS = 2,
kUHCI_MAX_TRANSFER = 1024,
kUHCI_QH_REMOVE_DELAY = 5
};
enum
{
kUHCIPageSize = 4096,
};
#define kUHCIPageOffsetMask ( kUHCIPageSize - 1 ) // mask off just the offset bits (low 12)
#define kUHCIPageMask (~(kUHCIPageOffsetMask)) // mask off just the page number (high 20)
#define kUHCIPtrMask ( 0xFFFFFFF0 ) // mask for list element pointers
#define kUHCIStructureAllocationPhysicalMask 0x00000000FFFFF000ULL // for use with inTaskWithPhysicalMask (below 4GB and 4K aligned)
#endif