|
|
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: #include <IOKit/IOTypes.h> ! 23: ! 24: typedef char *Ptr; ! 25: ! 26: #define bit0 0x00000001 ! 27: #define bit1 0x00000002 ! 28: #define bit2 0x00000004 ! 29: #define bit3 0x00000008 ! 30: #define bit4 0x00000010 ! 31: #define bit5 0x00000020 ! 32: #define bit6 0x00000040 ! 33: #define bit7 0x00000080 ! 34: #define bit8 0x00000100 ! 35: #define bit9 0x00000200 ! 36: #define bit10 0x00000400 ! 37: #define bit11 0x00000800 ! 38: #define bit12 0x00001000 ! 39: #define bit13 0x00002000 ! 40: #define bit14 0x00004000 ! 41: #define bit15 0x00008000 ! 42: #define bit16 0x00010000 ! 43: #define bit17 0x00020000 ! 44: #define bit18 0x00040000 ! 45: #define bit19 0x00080000 ! 46: #define bit20 0x00100000 ! 47: #define bit21 0x00200000 ! 48: #define bit22 0x00400000 ! 49: #define bit23 0x00800000 ! 50: #define bit24 0x01000000 ! 51: #define bit25 0x02000000 ! 52: #define bit26 0x04000000 ! 53: #define bit27 0x08000000 ! 54: #define bit28 0x10000000 ! 55: #define bit29 0x20000000 ! 56: #define bit30 0x40000000 ! 57: #define bit31 0x80000000 ! 58: ! 59: ! 60: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! 61: * Configuration Registers ! 62: * ! 63: */ ! 64: enum { ! 65: kConfigStart = 0x00, ! 66: cwVendorID = 0x00, /* 0x1000 */ ! 67: cwDeviceID = 0x02, /* 0x0003 */ ! 68: cwCommand = 0x04, ! 69: cwStatus = 0x06, ! 70: clClassCodeAndRevID = 0x08, ! 71: clHeaderAndLatency = 0x0C, ! 72: clBaseAddressZero = 0x10, /* I/O Base address */ ! 73: clBaseAddressOne = 0x14, /* Memory Base address */ ! 74: clExpansionRomAddr = 0x30, ! 75: clLatGntIntPinLine = 0x3C, /* Max_Lat, Max_Gnt, Int. Pin, Int. Line */ ! 76: kConfigEnd = 0x40 ! 77: }; ! 78: ! 79: /* ! 80: * 0x04 cwCommand Command Register (read/write) ! 81: */ ! 82: enum { ! 83: cwCommandSERREnable = bit8, ! 84: cwCommandEnableParityError = bit6, ! 85: cwCommandEnableBusMaster = bit2, /* Set this on initialization */ ! 86: cwCommandEnableMemorySpace = bit1, /* Respond at Base Address One if set */ ! 87: cwCommandEnableIOSpace = bit0 /* Respond at Base Address Zero if set */ ! 88: }; ! 89: /* ! 90: * 0x06 cwStatus Status Register (read/write) ! 91: */ ! 92: enum { ! 93: cwStatusDetectedParityError = bit15, /* Detected from slave */ ! 94: cwStatusSignaledSystemError = bit14, /* Device asserts SERR/ signal */ ! 95: cwStatusMasterAbort = bit13, /* Master sets when transaction aborts */ ! 96: cwStatusReceivedTargetAbort = bit12, /* Master sets when target-abort */ ! 97: cwStatusDEVSELTimingMask = (bit10 | bit9), /* DEVSEL timing encoding R/O */ ! 98: cwStatusDEVSELFastTiming = 0, ! 99: cwStatusDEVSELMediumTiming = bit9, ! 100: cwStatusDEVSELSlowTiming = bit10, ! 101: cwStatusDataParityReported = bit8 ! 102: }; ! 103: ! 104: ! 105: //////////////////////////////////////////////////////////////////////////////// ! 106: // ! 107: // OHCI type defs. ! 108: // ! 109: typedef UInt32 PhysicalPtr; ! 110: ! 111: typedef struct OHCIRegistersStruct ! 112: OHCIRegisters, ! 113: *OHCIRegistersPtr; ! 114: ! 115: typedef struct OHCIIntHeadStruct ! 116: OHCIIntHead, ! 117: *OHCIIntHeadPtr; ! 118: ! 119: typedef struct OHCIEndpointDescriptorStruct ! 120: OHCIEndpointDescriptor, ! 121: *OHCIEndpointDescriptorPtr; ! 122: ! 123: typedef struct OHCIGeneralTransferDescriptorStruct ! 124: OHCIGeneralTransferDescriptor, ! 125: *OHCIGeneralTransferDescriptorPtr; ! 126: ! 127: typedef struct OHCIIsochTransferDescriptorStruct ! 128: OHCIIsochTransferDescriptor, ! 129: *OHCIIsochTransferDescriptorPtr; ! 130: ! 131: typedef struct OHCIUIMDataStruct ! 132: OHCIUIMData, ! 133: *OHCIUIMDataPtr; ! 134: ! 135: typedef struct OHCIPhysicalLogicalStruct ! 136: OHCIPhysicalLogical, ! 137: *OHCIPhysicalLogicalPtr; ! 138: ! 139: ! 140: //////////////////////////////////////////////////////////////////////////////// ! 141: // ! 142: // OHCI register file. ! 143: // ! 144: ! 145: enum ! 146: { ! 147: kOHCIBit0 = (1 << 0), ! 148: kOHCIBit1 = (1 << 1), ! 149: kOHCIBit2 = (1 << 2), ! 150: kOHCIBit3 = (1 << 3), ! 151: kOHCIBit4 = (1 << 4), ! 152: kOHCIBit5 = (1 << 5), ! 153: kOHCIBit6 = (1 << 6), ! 154: kOHCIBit7 = (1 << 7), ! 155: kOHCIBit8 = (1 << 8), ! 156: kOHCIBit9 = (1 << 9), ! 157: kOHCIBit10 = (1 << 10), ! 158: kOHCIBit11 = (1 << 11), ! 159: kOHCIBit12 = (1 << 12), ! 160: kOHCIBit13 = (1 << 13), ! 161: kOHCIBit14 = (1 << 14), ! 162: kOHCIBit15 = (1 << 15), ! 163: kOHCIBit16 = (1 << 16), ! 164: kOHCIBit17 = (1 << 17), ! 165: kOHCIBit18 = (1 << 18), ! 166: kOHCIBit19 = (1 << 19), ! 167: kOHCIBit20 = (1 << 20), ! 168: kOHCIBit21 = (1 << 21), ! 169: kOHCIBit22 = (1 << 22), ! 170: kOHCIBit23 = (1 << 23), ! 171: kOHCIBit24 = (1 << 24), ! 172: kOHCIBit25 = (1 << 25), ! 173: kOHCIBit26 = (1 << 26), ! 174: kOHCIBit27 = (1 << 27), ! 175: kOHCIBit28 = (1 << 28), ! 176: kOHCIBit29 = (1 << 29), ! 177: kOHCIBit30 = (1 << 30), ! 178: kOHCIBit31 = (1 << 31) ! 179: }; ! 180: ! 181: #define OHCIBitRange(start, end) \ ! 182: ( \ ! 183: ((((UInt32) 0xFFFFFFFF) << (31 - (end))) >> \ ! 184: ((31 - (end)) + (start))) << \ ! 185: (start) \ ! 186: ) ! 187: ! 188: #define OHCIBitRangePhase(start, end) \ ! 189: (start) ! 190: ! 191: ! 192: // OHCI register file. ! 193: ! 194: struct OHCIRegistersStruct ! 195: { ! 196: // Control and status group. ! 197: volatile UInt32 hcRevision; ! 198: volatile UInt32 hcControl; ! 199: volatile UInt32 hcCommandStatus; ! 200: volatile UInt32 hcInterruptStatus; ! 201: volatile UInt32 hcInterruptEnable; ! 202: volatile UInt32 hcInterruptDisable; ! 203: ! 204: // Memory pointer group. ! 205: volatile UInt32 hcHCCA; ! 206: volatile UInt32 hcPeriodCurrentED; ! 207: volatile UInt32 hcControlHeadED; ! 208: volatile UInt32 hcControlCurrentED; ! 209: volatile UInt32 hcBulkHeadED; ! 210: volatile UInt32 hcBulkCurrentED; ! 211: volatile UInt32 hcDoneHead; ! 212: ! 213: // Frame counter group. ! 214: volatile UInt32 hcFmInterval; ! 215: volatile UInt32 hcFmRemaining; ! 216: volatile UInt32 hcFmNumber; ! 217: volatile UInt32 hcPeriodicStart; ! 218: volatile UInt32 hcLSThreshold; ! 219: ! 220: // Root hub group. ! 221: volatile UInt32 hcRhDescriptorA; ! 222: volatile UInt32 hcRhDescriptorB; ! 223: volatile UInt32 hcRhStatus; ! 224: volatile UInt32 hcRhPortStatus[1]; ! 225: }; ! 226: ! 227: typedef struct OHCIRegistersStruct *OHCIRegistersPtr; ! 228: ! 229: // hcControl register defs. ! 230: enum ! 231: { ! 232: kOHCIHcControl_CBSR = OHCIBitRange (0, 1), ! 233: kOHCIHcControl_CBSRPhase = OHCIBitRangePhase (0, 1), ! 234: kOHCIHcControl_PLE = kOHCIBit2, ! 235: kOHCIHcControl_IE = kOHCIBit3, ! 236: kOHCIHcControl_CLE = kOHCIBit4, ! 237: kOHCIHcControl_BLE = kOHCIBit5, ! 238: kOHCIHcControl_HCFS = OHCIBitRange (6, 7), ! 239: kOHCIHcControl_HCFSPhase = OHCIBitRangePhase (6, 7), ! 240: kOHCIHcControl_IR = kOHCIBit8, ! 241: kOHCIHcControl_RWC = kOHCIBit9, ! 242: kOHCIHcControl_RWE = kOHCIBit10, ! 243: ! 244: kOHCIHcControl_Reserved = OHCIBitRange (11, 31), ! 245: ! 246: kOHCIFunctionalState_Reset = 0, ! 247: kOHCIFunctionalState_Resume = 1, ! 248: kOHCIFunctionalState_Operational = 2, ! 249: kOHCIFunctionalState_Suspend = 3 ! 250: }; ! 251: ! 252: // hcCommandStatus register defs. ! 253: enum ! 254: { ! 255: kOHCIHcCommandStatus_HCR = kOHCIBit0, ! 256: kOHCIHcCommandStatus_CLF = kOHCIBit1, ! 257: kOHCIHcCommandStatus_BLF = kOHCIBit2, ! 258: kOHCIHcCommandStatus_OCR = kOHCIBit3, ! 259: kOHCIHcCommandStatus_SOC = OHCIBitRange (16, 17), ! 260: kOHCIHcCommandStatus_SOCPhase = OHCIBitRangePhase (16, 17), ! 261: ! 262: kOHCIHcCommandStatus_Reserved = OHCIBitRange (4, 15) | OHCIBitRange (18, 31) ! 263: }; ! 264: ! 265: // hcInterrupt register defs. ! 266: enum ! 267: { ! 268: kOHCIHcInterrupt_SO = kOHCIBit0, ! 269: kOHCIHcInterrupt_WDH = kOHCIBit1, ! 270: kOHCIHcInterrupt_SF = kOHCIBit2, ! 271: kOHCIHcInterrupt_RD = kOHCIBit3, ! 272: kOHCIHcInterrupt_UE = kOHCIBit4, ! 273: kOHCIHcInterrupt_FNO = kOHCIBit5, ! 274: kOHCIHcInterrupt_RHSC = kOHCIBit6, ! 275: kOHCIHcInterrupt_OC = kOHCIBit30, ! 276: kOHCIHcInterrupt_MIE = kOHCIBit31 ! 277: }; ! 278: ! 279: // this is what I would like it to be ! 280: //#define kOHCIDefaultInterrupts (kOHCIHcInterrupt_SO | kOHCIHcInterrupt_WDH | kOHCIHcInterrupt_UE | kOHCIHcInterrupt_FNO | kOHCIHcInterrupt_RHSC) ! 281: #define kOHCIDefaultInterrupts (kOHCIHcInterrupt_WDH | kOHCIHcInterrupt_UE | kOHCIHcInterrupt_FNO) ! 282: ! 283: ! 284: // hcFmInterval register defs. ! 285: enum ! 286: { ! 287: kOHCIHcFmInterval_FI = OHCIBitRange (0, 13), ! 288: kOHCIHcFmInterval_FIPhase = OHCIBitRangePhase (0, 13), ! 289: kOHCIHcFmInterval_FSMPS = OHCIBitRange (16, 30), ! 290: kOHCIHcFmInterval_FSMPSPhase = OHCIBitRangePhase (16, 30), ! 291: kOHCIHcFmInterval_FIT = kOHCIBit31, ! 292: ! 293: kOHCIHcFmInterval_Reserved = OHCIBitRange (14, 15) ! 294: }; ! 295: ! 296: enum ! 297: { ! 298: kOHCIMax_OverHead = 210 // maximum bit time overhead for a xaction ! 299: }; ! 300: ! 301: ! 302: // hcRhDescriptorA register defs. ! 303: enum ! 304: { ! 305: kOHCIHcRhDescriptorA_NDP = OHCIBitRange (0, 7), ! 306: kOHCIHcRhDescriptorA_NDPPhase = OHCIBitRangePhase (0, 7), ! 307: kOHCIHcRhDescriptorA_PSM = kOHCIBit8, ! 308: kOHCIHcRhDescriptorA_NPS = kOHCIBit9, ! 309: kOHCIHcRhDescriptorA_DT = kOHCIBit10, ! 310: kOHCIHcRhDescriptorA_OCPM = kOHCIBit11, ! 311: kOHCIHcRhDescriptorA_NOCP = kOHCIBit12, ! 312: kOHCIHcRhDescriptorA_POTPGT = OHCIBitRange (24, 31), ! 313: kOHCIHcRhDescriptorA_POTPGTPhase = OHCIBitRangePhase (24, 31), ! 314: ! 315: kOHCIHcRhDescriptorA_Reserved = OHCIBitRange (13,23) ! 316: }; ! 317: ! 318: ! 319: // hcRhDescriptorB register defs. ! 320: enum ! 321: { ! 322: kOHCIHcRhDescriptorB_DR = OHCIBitRange (0, 15), ! 323: kOHCIHcRhDescriptorB_DRPhase = OHCIBitRangePhase (0, 15), ! 324: kOHCIHcRhDescriptorB_PPCM = OHCIBitRange (16, 31), ! 325: kOHCIHcRhDescriptorB_PPCMPhase = OHCIBitRangePhase (16, 31) ! 326: }; ! 327: ! 328: ! 329: // Config space defs. ! 330: enum ! 331: { ! 332: kOHCIConfigRegBaseAddressRegisterNumber = 0x10 ! 333: }; ! 334: ! 335: ! 336: enum ! 337: { ! 338: kOHCIEDControl_FA = OHCIBitRange (0, 6), ! 339: kOHCIEDControl_FAPhase = OHCIBitRangePhase (0, 6), ! 340: kOHCIEDControl_EN = OHCIBitRange (7, 10), ! 341: kOHCIEDControl_ENPhase = OHCIBitRangePhase (7, 10), ! 342: kOHCIEDControl_D = OHCIBitRange (11, 12), ! 343: kOHCIEDControl_DPhase = OHCIBitRangePhase (11, 12), ! 344: kOHCIEDControl_S = OHCIBitRange (13, 13), ! 345: kOHCIEDControl_SPhase = OHCIBitRangePhase (13, 13), ! 346: kOHCIEDControl_K = kOHCIBit14, ! 347: kOHCIEDControl_F = OHCIBitRange (15, 15), ! 348: kOHCIEDControl_FPhase = OHCIBitRangePhase (15, 15), ! 349: kOHCIEDControl_MPS = OHCIBitRange (16, 26), ! 350: kOHCIEDControl_MPSPhase = OHCIBitRangePhase (16, 26), ! 351: ! 352: kOHCITailPointer_tailP = OHCIBitRange (4, 31), ! 353: kOHCITailPointer_tailPPhase = OHCIBitRangePhase (4, 31), ! 354: ! 355: kOHCIHeadPointer_H = kOHCIBit0, ! 356: kOHCIHeadPointer_C = kOHCIBit1, ! 357: kOHCIHeadPointer_headP = OHCIBitRange (4, 31), ! 358: kOHCIHeadPointer_headPPhase = OHCIBitRangePhase (4, 31), ! 359: ! 360: kOHCINextEndpointDescriptor_nextED = OHCIBitRange (4, 31), ! 361: kOHCINextEndpointDescriptor_nextEDPhase = OHCIBitRangePhase (4, 31), ! 362: ! 363: kOHCIEDDirectionTD = 0, ! 364: kOHCIEDDirectionOut = 1, ! 365: kOHCIEDDirectionIn = 2, ! 366: ! 367: kOHCIEDSpeedFull = 0, ! 368: kOHCIEDSpeedLow = 1, ! 369: ! 370: kOHCIEDFormatGeneralTD = 0, ! 371: kOHCIEDFormatIsochronousTD = 1 ! 372: }; ! 373: ! 374: typedef UInt8 OHCIEDFormat; // really only need 1 bit ! 375: ! 376: // General Transfer Descriptor ! 377: enum ! 378: { ! 379: kOHCIGTDControl_R = kOHCIBit18, ! 380: kOHCIGTDControl_DP = OHCIBitRange (19, 20), ! 381: kOHCIGTDControl_DPPhase = OHCIBitRangePhase (19, 20), ! 382: kOHCIGTDControl_DI = OHCIBitRange (21, 23), ! 383: kOHCIGTDControl_DIPhase = OHCIBitRangePhase (21, 23), ! 384: kOHCIGTDControl_T = OHCIBitRange (24, 25), ! 385: kOHCIGTDControl_TPhase = OHCIBitRangePhase (24, 25), ! 386: kOHCIGTDControl_EC = OHCIBitRange (26, 27), ! 387: kOHCIGTDControl_ECPhase = OHCIBitRangePhase (26, 27), ! 388: kOHCIGTDControl_CC = OHCIBitRange (28, 31), ! 389: kOHCIGTDControl_CCPhase = OHCIBitRangePhase (28, 31), ! 390: ! 391: kOHCIGTDPIDSetup = 0, ! 392: kOHCIGTDPIDOut = 1, ! 393: kOHCIGTDPIDIn = 2, ! 394: ! 395: kOHCIGTDNoInterrupt = 7, ! 396: ! 397: kOHCIGTDDataToggleCarry = 0, ! 398: kOHCIGTDDataToggle0 = 2, ! 399: kOHCIGTDDataToggle1 = 3, ! 400: ! 401: kOHCIGTDConditionNoError = 0, ! 402: kOHCIGTDConditionCRC = 1, ! 403: kOHCIGTDConditionBitStuffing = 2, ! 404: kOHCIGTDConditionDataToggleMismatch = 3, ! 405: kOHCIGTDConditionStall = 4, ! 406: kOHCIGTDConditionDeviceNotResponding = 5, ! 407: kOHCIGTDConditionPIDCheckFailure = 6, ! 408: kOHCIGTDConditionUnexpectedPID = 7, ! 409: kOHCIGTDConditionDataOverrun = 8, ! 410: kOHCIGTDConditionDataUnderrun = 9, ! 411: kOHCIGTDConditionBufferOverrun = 12, ! 412: kOHCIGTDConditionBufferUnderrun = 13, ! 413: kOHCIGTDConditionNotAccessed = 15 ! 414: }; ! 415: ! 416: // Isochronous Transfer Descriptor ! 417: enum ! 418: { ! 419: kOHCIITDControl_SF = OHCIBitRange (0,15), ! 420: kOHCIITDControl_SFPhase = OHCIBitRangePhase(0,15), ! 421: kOHCIITDControl_DI = OHCIBitRange (21,23), ! 422: kOHCIITDControl_DIPhase = OHCIBitRangePhase (21,23), ! 423: kOHCIITDControl_FC = OHCIBitRange (24,26), ! 424: kOHCIITDControl_FCPhase = OHCIBitRangePhase (24,26), ! 425: kOHCIITDControl_CC = OHCIBitRange (28,31), ! 426: kOHCIITDControl_CCPhase = OHCIBitRangePhase (28,31), ! 427: ! 428: // The Offset/PSW words have two slightly different formats depending on whether they have been accessed ! 429: // by the host controller or not. They are initialized in Offset format, with 3-bit of condition code (=NOTACCESSED) ! 430: // if the OHCI controller accesses this frame it fills in the 4-bit condition code, and the PSW size field contains ! 431: // the number of bytes transferred IN, or 0 for an OUT transaction. ! 432: ! 433: // PSW format bit field definitions ! 434: kOHCIITDPSW_Size = OHCIBitRange(0,10), ! 435: kOHCIITDPSW_SizePhase = OHCIBitRangePhase(0,10), ! 436: kOHCIITDPSW_CC = OHCIBitRange(12,15), ! 437: kOHCIITDPSW_CCPhase = OHCIBitRangePhase(12,15), ! 438: kOHCIITDPSW_CCNA = OHCIBitRange(13,15), ! 439: kOHCIITDPSW_CCNAPhase = OHCIBitRangePhase(13,15), ! 440: ! 441: // offset format bit field definitions ! 442: kOHCIITDOffset_Size = OHCIBitRange(0,11), ! 443: kOHCIITDOffset_SizePhase = OHCIBitRangePhase(0,11), ! 444: kOHCIITDOffset_PC = OHCIBitRange(12,12), ! 445: kOHCIITDOffset_PCPhase = OHCIBitRangePhase(12,12), ! 446: kOHCIITDOffset_CC = OHCIBitRange(13,15), ! 447: kOHCIITDOffset_CCPhase = OHCIBitRangePhase(13,15), ! 448: kOHCIITDConditionNoError = 0, ! 449: kOHCIITDConditionCRC = 1, ! 450: kOHCIITDConditionBitStuffing = 2, ! 451: kOHCIITDConditionDataToggleMismatch = 3, ! 452: kOHCIITDConditionStall = 4, ! 453: kOHCIITDConditionDeviceNotResponding = 5, ! 454: kOHCIITDConditionPIDCheckFailure = 6, ! 455: kOHCIITDConditionUnExpectedPID = 7, ! 456: kOHCIITDConditionDataOverrun = 8, ! 457: kOHCIITDConditionDataUnderrun = 9, ! 458: kOHCIITDConditionBufferOverrun = 12, ! 459: kOHCIITDConditionBufferUnderrun = 13, ! 460: kOHCIITDOffsetConditionNotAccessed = 7, // note that this is the "Offset" variant (3-bit) of this condition code ! 461: kOHCIITDConditionNotAccessedReturn = 15, ! 462: kOHCIITDConditionNotCrossPage = 0, ! 463: kOHCIITDConditionCrossPage = 1 ! 464: }; ! 465: ! 466: ! 467: ! 468: // misc definitions -- most of these need to be cleaned up/replaced with better terms defined previously ! 469: ! 470: enum ! 471: { ! 472: // Barry, note - Root hub defines moved to OHCIRootHub.h ! 473: ! 474: kOHCIEndpointNumberOffset = 7, ! 475: kOHCIEndpointDirectionOffset = 11, ! 476: kOHCIMaxPacketSizeOffset = 16, ! 477: kOHCISpeedOffset = 13, ! 478: kOHCIBufferRoundingOffset = 18, ! 479: kOHCIDirectionOffset = 19, ! 480: kENOffset = 7, ! 481: ! 482: kUniqueNumMask = OHCIBitRange (0, 12), ! 483: kUniqueNumNoDirMask = OHCIBitRange (0, 10), ! 484: kOHCIHeadPMask = OHCIBitRange (4, 31), ! 485: kOHCIInterruptSOFMask = kOHCIHcInterrupt_SF, ! 486: kOHCISkipped = kOHCIEDControl_K, ! 487: kOHCIDelayIntOffset = 21, ! 488: kOHCIPageSize = 4096, ! 489: kOHCIEndpointDirectionMask = OHCIBitRange (11, 12), ! 490: kOHCIEDToggleBitMask = OHCIBitRange (1, 1), ! 491: kOHCIGTDClearErrorMask = OHCIBitRange (0, 25), ! 492: kHCCAalignment = 0x100, // required alignment for HCCA ! 493: kHCCAsize = 256 // size of HCCA ! 494: }; ! 495: ! 496: ! 497: enum { ! 498: kOHCIBulkTransferOutType = 1, ! 499: kOHCIBulkTransferInType = 2, ! 500: kOHCIControlSetupType = 3, ! 501: kOHCIControlDataType = 4, ! 502: kOHCIControlStatusType = 5, ! 503: kOHCIInterruptInType = 6, ! 504: kOHCIInterruptOutType = 7, ! 505: kOHCIOptiLSBug = 8, ! 506: kOHCIIsochronousInType = 9, ! 507: kOHCIIsochronousOutType = 10 ! 508: }; ! 509: ! 510: enum { ! 511: kOHCIFrameOffset = 16, ! 512: kOHCIFmNumberMask = OHCIBitRange (0, 15), ! 513: kOHCIFrameOverflowBit = kOHCIBit16, ! 514: kOHCIMaxRetrys = 20 ! 515: ! 516: }; ! 517: ! 518: //////////////////////////////////////////////////////////////////////////////// ! 519: // ! 520: // OHCI UIM data records. ! 521: // ! 522: ! 523: //typedef short RootHubID; ! 524: ! 525: // Interrupt head struct ! 526: struct OHCIIntHeadStruct ! 527: { ! 528: OHCIEndpointDescriptorPtr pHead; ! 529: OHCIEndpointDescriptorPtr pTail; ! 530: UInt32 pHeadPhysical; ! 531: int nodeBandwidth; ! 532: }; ! 533: ! 534: struct OHCIUIMDataStruct ! 535: { ! 536: // RegEntryID ohciRegEntryID; // Name Registry entry of OHCI. ! 537: // UIMID uimID; // ID for OHCI UIM. ! 538: // RootHubID rootHubID; // Status of root hub, if 0, not initialized otherwise has virtual ID number ! 539: UInt32 errataBits; // various bits for chip erratas ! 540: OHCIRegistersPtr pOHCIRegisters; // Pointer to base address of OHCI registers. ! 541: Ptr pHCCA; // Pointer to HCCA. ! 542: OHCIIntHead pInterruptHead[63]; // ptr to private list of all interrupts heads ! 543: volatile OHCIEndpointDescriptorPtr pIsochHead; // ptr to Isochtonous list ! 544: volatile UInt32 pIsochTail; // ptr to Isochtonous list ! 545: volatile UInt32 pBulkHead; // ptr to Bulk list ! 546: volatile UInt32 pControlHead; // ptr to Control list ! 547: volatile UInt32 pBulkTail; // ptr to Bulk list ! 548: volatile UInt32 pControlTail; // ptr to Control list ! 549: volatile OHCIPhysicalLogicalPtr pPhysicalLogical; // ptr to list of memory maps ! 550: volatile OHCIGeneralTransferDescriptorPtr pFreeTD; // list of availabble Trasfer Descriptors ! 551: volatile OHCIIsochTransferDescriptorPtr pFreeITD; // list of availabble Trasfer Descriptors ! 552: volatile OHCIEndpointDescriptorPtr pFreeED; // list of available Endpoint Descriptors ! 553: volatile OHCIGeneralTransferDescriptorPtr pLastFreeTD; // last of availabble Trasfer Descriptors ! 554: volatile OHCIIsochTransferDescriptorPtr pLastFreeITD; // last of availabble Trasfer Descriptors ! 555: volatile OHCIEndpointDescriptorPtr pLastFreeED; // last of available Endpoint Descriptors ! 556: volatile OHCIGeneralTransferDescriptorPtr pPendingTD; // list of non processed Trasfer Descriptors ! 557: Ptr pDataAllocation; // ptr to block used for TD, ED, ITD ! 558: Ptr pPCIAssignedAddresses; // ptr to PCI assigned addresses ! 559: UInt32 pageSize; // OS Logical page size ! 560: struct { ! 561: volatile UInt32 scheduleOverrun; // updated by the interrupt handler ! 562: volatile UInt32 unrecoverableError; // updated by the interrupt handler ! 563: volatile UInt32 frameNumberOverflow; // updated by the interrupt handler ! 564: volatile UInt32 ownershipChange; // updated by the interrupt handler ! 565: } errors; ! 566: volatile UInt64 frameNumber; ! 567: UInt16 rootHubFuncAddress; // Function Address for the root hub ! 568: int OptiOn; ! 569: UInt32 isochBandwidthAvail; // amount of available bandwidth for Isochronous transfers ! 570: }; ! 571: ! 572: struct OHCIEndpointDescriptorStruct ! 573: { ! 574: UInt32 flags; // 0x00 control ! 575: PhysicalPtr tdQueueTailPtr; // 0x04 pointer to last TD (physical address) ! 576: PhysicalPtr tdQueueHeadPtr; // 0x08 pointer to first TD (physical) ! 577: PhysicalPtr nextED; // 0x0c Pointer to next ED (physical) ! 578: OHCIEndpointDescriptorPtr pLogicalNext; // 0x10 ! 579: PhysicalPtr pPhysical; // 0x14 ! 580: void* pLogicalTailP; // 0x18 ! 581: void* pLogicalHeadP; // 0x1c ! 582: }; // 0x20 length of structure ! 583: ! 584: struct OHCIGeneralTransferDescriptorStruct ! 585: { ! 586: volatile UInt32 flags; // 0x00 Data controlling transfer. ! 587: volatile PhysicalPtr currentBufferPtr; // 0x04 Current buffer pointer (physical) ! 588: volatile PhysicalPtr nextTD; // 0x08 Pointer to next transfer descriptor ! 589: PhysicalPtr bufferEnd; // 0x0c Pointer to end of buffer (physical) ! 590: IOUSBCompletion completion; // only used if last TD, other wise its nil ! 591: OHCIEndpointDescriptorPtr pEndpoint; // pointer to TD's Endpoint ! 592: UInt32 pType; // 0x20 Note this must appear at the same offset (32) in GTD & ITD structs ! 593: PhysicalPtr pPhysical; // 0x24 Note this must appear at the same offset (36) in GTD & ITD structs ! 594: OHCIGeneralTransferDescriptorPtr pLogicalNext; // 0x28 Note this must appear at the same offset (40) in GTD & ITD structs ! 595: UInt32 bufferSize; // used only by control transfers to keep track of data buffers size leftover ! 596: }; ! 597: ! 598: struct OHCIIsochTransferDescriptorStruct ! 599: { ! 600: UInt32 flags; // 0x00 Condition code/FrameCount/DelayInterrrupt/StartingFrame. ! 601: PhysicalPtr bufferPage0; // 0x04 Buffer Page 0 (physical) ! 602: PhysicalPtr nextTD; // 0x08 Pointer to next transfer descriptor (physical) ! 603: PhysicalPtr bufferEnd; // 0x0c Pointer to end of buffer (physical) ! 604: UInt16 offset[8]; ! 605: UInt32 pType; // 0x20 Note this must appear at the same offset (32) in GTD & ITD structs ! 606: UInt32 pPhysical; // 0x24 Note this must appear at the same offset (36) in GTD & ITD structs ! 607: OHCIIsochTransferDescriptorPtr pLogicalNext; // 0x28 Note this must appear at the same offset (40) in GTD & ITD structs ! 608: IOUSBIsocCompletion completion; // callback for Isoch transactions ! 609: IOUSBIsocFrame * pIsocFrame; // ptr to USLs status and length array ! 610: UInt32 frameNum; // index to pIsocFrame array ! 611: }; ! 612: ! 613: struct OHCIPhysicalLogicalStruct ! 614: { ! 615: UInt32 LogicalStart; ! 616: UInt32 LogicalEnd; ! 617: UInt32 PhysicalStart; ! 618: UInt32 PhysicalEnd; ! 619: UInt32 type; ! 620: OHCIPhysicalLogicalStruct * pNext; ! 621: }; ! 622: ! 623: #define kOHCIPageOffsetMask ( kOHCIPageSize - 1 ) // mask off just the offset bits (low 12) ! 624: #define kOHCIPageMask (~(kOHCIPageOffsetMask)) // mask off just the page number (high 20) ! 625:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.