|
|
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: /* ! 23: * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. ! 24: * ! 25: * Interface definition for the keylargo I2C interface ! 26: * ! 27: * HISTORY ! 28: * ! 29: */ ! 30: ! 31: #ifndef _PPCI2CINTERFACE_H ! 32: #define _PPCI2CINTERFACE_H ! 33: ! 34: #include <IOKit/IOTypes.h> ! 35: #include <IOKit/IOLib.h> ! 36: ! 37: class PPCI2CInterface ! 38: { ! 39: // Add here the default constructors ! 40: ! 41: ! 42: private: ! 43: // These are the possible states the driver can be in: ! 44: typedef enum { ! 45: ki2cStateIdle = 0, ! 46: ki2cStateWaitingForIADDR, ! 47: ki2cStateWaitingForIDATA, ! 48: ki2cStateWaitingForISTOP, ! 49: ki2cStateWaitingForISTART, ! 50: } PPCI2CState; ! 51: ! 52: // Constansts for the mode register: ! 53: typedef enum { ! 54: kDumbMode = 0x00, // ! 55: kStandardMode = 0x01, // ! 56: kStandardSubMode = 0x02, // ! 57: kCombinedMode = 0x03, // ! 58: kModeMask = 0x03 // ! 59: } I2CMode; ! 60: ! 61: typedef enum { ! 62: k100KhzMode = 0x00, // ! 63: k50KhzMode = 0x01, // ! 64: k25KhzMode = 0x02, // ! 65: kReservedMode = 0x03, // ! 66: kSpeedMask = 0x03 // ! 67: } I2CSpeed; ! 68: ! 69: enum { ! 70: I2CModeShift = 2 ! 71: }; ! 72: ! 73: enum { ! 74: I2CSpeedShift = 0 ! 75: }; ! 76: ! 77: // Constants for the Control register ! 78: typedef enum { ! 79: kClrCNTRL = 0x00, // 0 -> Clears all the control bits ! 80: kAakCNTRL = 0x01, // 1 -> AAK sent, 0 -> not AAK sent ! 81: kXAddrCNTRL = 0x02, // when set -> transmit address phase (not used by manual mode) ! 82: kStopCNTRL = 0x04, // when set -> transmit stop condition ! 83: kStartCNTRL = 0x08, // when set -> transmit start condition (manual mode only) ! 84: kCNTRLMask = 0x0F // Masks all the control bits ! 85: } I2CControl; ! 86: ! 87: enum { ! 88: I2CControlShift = 0 ! 89: }; ! 90: ! 91: // Constants for the STATUS register ! 92: typedef enum { ! 93: kBusySTATUS = 0x01, // 1 -> busy ! 94: kLastAakSTATUS = 0x02, // value of last AAK bit ! 95: kLastReadWriteSTATUS = 0x04, // value of last R/W bit transmitted ! 96: kIsdaSTATUS = 0x08, // data line SDA ! 97: kSclSTATUS = 0x10, // clock line SCL ! 98: kSTATUSMask = 0x1F // Mask all the status bits ! 99: } I2CStatus; ! 100: ! 101: enum { ! 102: I2CStatusShift = 0 ! 103: }; ! 104: ! 105: // Constants for the ISR register ! 106: typedef enum { ! 107: kIDataISR = 0x01, // Data Byte Sent or Received Interrupt ! 108: kIAddrISR = 0x02, // Address Phase Sent Interrupt ! 109: kIStopISR = 0x04, // Stop Condition Sent Interrupt ! 110: kIStartISR = 0x08, // Start Condition Sent Interrupt ! 111: kISRMask = 0x0F ! 112: } I2CInterruptStatus; ! 113: ! 114: enum { ! 115: I2CInterruptStatusShift = 0 ! 116: }; ! 117: ! 118: // Constants for the IER register ! 119: typedef enum { ! 120: kEDataIER = 0x01, // Enable Data Byte Sent or Received Interrupt ! 121: kEAddrIER = 0x02, // Enable AAddress Phase Sent Interrupt ! 122: kEStopIER = 0x04, // Enable Stop Condition Sent Interrupt ! 123: kEStartIER = 0x08, // Enable Start Condition Sent Interrupt ! 124: kIERMask = 0x0F ! 125: } I2CInterruptEnable; ! 126: ! 127: enum { ! 128: I2CInterruptEnableShift = 0 ! 129: }; ! 130: ! 131: // Constants for the Address register ! 132: enum I2CAddress { ! 133: kADDRMask = 0x7F // ! 134: }; ! 135: ! 136: typedef enum { ! 137: kWriteADDR = 0x00, // ! 138: kReadADDR = 0x01, // ! 139: kRWMask = 0x01 // ! 140: } I2CRWMode; ! 141: ! 142: enum { ! 143: I2CAddressShift = 1 ! 144: }; ! 145: ! 146: enum { ! 147: I2CRWShift = 0 ! 148: }; ! 149: ! 150: // redefine the types so it makes easyer to handle ! 151: // new i2c if they have wider registers. ! 152: typedef UInt8 *I2CRegister; ! 153: typedef UInt32 *I2CLongRegister; ! 154: ! 155: // These are the keylargo registers to access to the ! 156: // i2c bus: ! 157: I2CRegister mode; // Configure the transmission mode of the i2c cell and the databit rate. ! 158: I2CRegister control; // Holds the 4 bits used to start the operations on the i2c interface. ! 159: I2CRegister status; // Status bits for the i2 cell and the i2c interface. ! 160: I2CRegister ISR; // Holds the status bits for the interrupt conditions. ! 161: I2CRegister IER; // Eneables the bits that allow the four interrupt status conditions. ! 162: I2CRegister address; // Holds the 7 bits address and the R/W bit. ! 163: I2CRegister subAddr; // the 8bit subaddress.. ! 164: I2CRegister data; // the byte to sents or the last byte received ! 165: ! 166: // This is a parameter used in memory cells and useless for ! 167: // the mac-io. ! 168: UInt8 portSelect; ! 169: ! 170: // This is the current state for the driver: ! 171: PPCI2CState currentState; ! 172: ! 173: // This interface does not need to be attached to an interrrupt. (it is obvoiusly ! 174: // better to be, but it is not NECESSARY). When it is not attached to an interrupt ! 175: // it works in polling mode. The following bool flag sets the default behavior. ! 176: bool pollingMode; ! 177: ! 178: protected: ! 179: // Chaches the last mode set (I would not do this, but each access to getMode requires a mask and a shift): ! 180: I2CMode lastMode; ! 181: ! 182: // pointer to the data to be transfered ! 183: UInt8 *dataBuffer; ! 184: ! 185: // and the number of bytes still to transfer ! 186: UInt16 nBytes; ! 187: ! 188: // the current transfer address: ! 189: UInt8 currentAddress; ! 190: ! 191: // the current transfer subAddress: ! 192: UInt8 currentSubaddress; ! 193: ! 194: // Direction of the data ! 195: bool isReading; ! 196: ! 197: // prints the content of the registers: ! 198: void dumpI2CRegisters(); ! 199: ! 200: // Given the base of the i2c registers inits all the registers. ! 201: void SetI2CBase(UInt8 *baseAddress, UInt8 steps); ! 202: ! 203: // Returns the mask to use with the register: ! 204: UInt8 shiftedMask(UInt8 mask, UInt8 shift); ! 205: ! 206: // Returns the complement of the mask ! 207: UInt8 shiftedCompMask(UInt8 mask, UInt8 shift); ! 208: ! 209: // Generic read and write for register fields: ! 210: UInt8 readRegisterField(I2CRegister, UInt8, UInt8); ! 211: void writeRegisterField(I2CRegister, UInt8, UInt8, UInt8); ! 212: ! 213: // Intermediate methods to access to each field of all the registers: ! 214: ! 215: // Mode register: ! 216: void setMode(I2CMode); ! 217: I2CMode getMode(); ! 218: void setSpeed(I2CSpeed); ! 219: I2CSpeed getSpeed(); ! 220: ! 221: // Control register ! 222: void setControl(I2CControl); ! 223: I2CControl getControl(); ! 224: ! 225: // Status register ! 226: void setStatus(I2CStatus); ! 227: I2CStatus getStatus(); ! 228: ! 229: // Interrupt status ! 230: void setInterruptStatus(I2CInterruptStatus); ! 231: I2CInterruptStatus getInterruptStatus(); ! 232: ! 233: // Interrupt enable ! 234: void setInterruptEnable(I2CInterruptEnable); ! 235: I2CInterruptEnable setInterruptEnable(); ! 236: ! 237: // Address Register: ! 238: void setAddressRegister(UInt8, I2CRWMode); ! 239: void setAddress(UInt8); ! 240: UInt8 getAddress(); ! 241: ! 242: void setReadWrite(I2CRWMode); ! 243: I2CRWMode getReadWrite(); ! 244: ! 245: // SubAddress register ! 246: void setSubAddress(UInt8); ! 247: UInt8 getSubAddress(); ! 248: ! 249: // Data register ! 250: void setData(UInt8); ! 251: UInt8 getData(); ! 252: ! 253: // Waits for the completion of a read or write ! 254: // operation: ! 255: bool waitForCompletion(); ! 256: ! 257: // Each mode requires a specific interrupt handler (since the states are different for each mode) ! 258: // so here it is the one for the Standard + SubAddress mode: ! 259: bool i2cStandardSubModeInterrupts(UInt8 interruptStatus); ! 260: ! 261: public: ! 262: // Initialize the address of the registers and the registers themselfs: ! 263: virtual bool initI2CBus(UInt8 *baseAddress, UInt8 steps); ! 264: ! 265: // These are to setup the mode for the I2C bus: ! 266: virtual void setPollingMode(bool); ! 267: virtual void setDumbMode(); ! 268: virtual void setStandardMode(); ! 269: virtual void setStandardSubMode(); ! 270: virtual void setCombinedMode(); ! 271: ! 272: // These instead set the speed: ! 273: virtual bool setKhzSpeed(UInt); ! 274: ! 275: // Test to read the values set by the funtions above: ! 276: virtual bool isInDumbMode(); ! 277: virtual bool isInStandardMode(); ! 278: virtual bool isInStandardSubMode(); ! 279: virtual bool isInCombinedMode(); ! 280: ! 281: // These instead returns the speed: ! 282: virtual UInt getKhzSpeed(); ! 283: ! 284: // Starts the use of the interface: ! 285: virtual bool openI2CBus(UInt8 port); ! 286: ! 287: // Writes a block of data at a given address: ! 288: virtual bool writeI2CBus(UInt8 address, UInt8 subAddress, UInt8 *data, UInt16 len); ! 289: ! 290: // Reads a block of data at a given address: ! 291: virtual bool readI2CBus(UInt8 address, UInt8 subAddress, UInt8 *data, UInt16 len); ! 292: ! 293: // End using the interface: ! 294: virtual bool closei2CBus(); ! 295: ! 296: // The interrupt handler: ! 297: // (inheriting classes must call the parten method) ! 298: virtual bool handleI2CInterrupt(); ! 299: ! 300: // methods to setup and abort a transfer: ! 301: // (inheriting classes must call the parten method) ! 302: virtual bool setAddressAndDirection(); ! 303: virtual bool abortTransfer(); ! 304: }; ! 305: ! 306: #endif //_PPCI2CINTERFACE_H
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.