|
|
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: #ifdef __cplusplus ! 23: ! 24: #include <IOKit/IOService.h> ! 25: #include <IOKit/IOLocks.h> ! 26: #include <IOKit/IOTypes.h> ! 27: #include <IOKit/adb/adb.h> ! 28: #include "pmu.h" ! 29: ! 30: extern "C" { ! 31: #include <pexpert/pexpert.h> ! 32: } ! 33: ! 34: class IOSyncer; ! 35: class IOPMUADBController; ! 36: class IOPMUNVRAMController; ! 37: class IOPMURTCController; ! 38: /* ! 39: class IOPMUPwrController; ! 40: */ ! 41: ! 42: #else ! 43: ! 44: #include <IOKit/IODevice.h> ! 45: #include <IOKit/adb/IOADBController.h> ! 46: ! 47: #endif ! 48: ! 49: #include <IOKit/IOInterruptEventSource.h> ! 50: #include <IOKit/IOWorkLoop.h> ! 51: #include <IOKit/IOCommandQueue.h> ! 52: #include "pmumisc.h" ! 53: ! 54: typedef volatile unsigned char *VIAAddress; // This is an address on the bus ! 55: ! 56: // ********************************************************************************** ! 57: // ! 58: // VIA definitions ! 59: // ! 60: // ********************************************************************************** ! 61: ! 62: enum { // port B ! 63: // M2 uses VIA2 ! 64: M2Req = 2, // Power manager handshake request ! 65: M2Ack = 1, // Power manager handshake acknowledge ! 66: // Hooper uses VIA1 ! 67: HooperReq = 4, // request ! 68: HooperAck = 3 // acknowledge ! 69: }; ! 70: ! 71: enum { // IFR/IER ! 72: ifCA2 = 0, // CA2 interrupt ! 73: ifCA1 = 1, // CA1 interrupt ! 74: ifSR = 2, // SR shift register done ! 75: ifCB2 = 3, // CB2 interrupt ! 76: ifCB1 = 4, // CB1 interrupt ! 77: ifT2 = 5, // T2 timer2 interrupt ! 78: ifT1 = 6, // T1 timer1 interrupt ! 79: ifIRQ = 7 // any interrupt ! 80: }; ! 81: ! 82: // ********************************************************************************** ! 83: // bits in response to kPMUReadInt command ! 84: // ********************************************************************************** ! 85: ! 86: enum { ! 87: kPMUMD0Int = 0x01, // interrupt type 0 (machine-specific) ! 88: kPMUMD1Int = 0x02, // interrupt type 1 (machine-specific) ! 89: kPMUMD2Int = 0x04, // interrupt type 2 (machine-specific) ! 90: kPMUbrightnessInt = 0x08, // brightness button has been pressed, value changed ! 91: kPMUADBint = 0x10, // ADB ! 92: kPMUbattInt = 0x20, // battery ! 93: kPMUenvironmentInt = 0x40, // environment ! 94: kPMUoneSecInt = 0x80 // one second interrupt ! 95: }; ! 96: ! 97: enum { // when kPMUADBint is set ! 98: kPMUautopoll = 0x04 // input is autopoll data ! 99: }; ! 100: ! 101: // ********************************************************************************** ! 102: // states of the ISR ! 103: // ********************************************************************************** ! 104: ! 105: enum { ! 106: kPMUidle, ! 107: kPMUxmtLen, ! 108: kPMUxmtData, ! 109: kPMUreadLen_cmd, ! 110: kPMUrcvLen_cmd, ! 111: kPMUreadData, ! 112: kPMUrcvData_cmd, ! 113: kPMUdone, ! 114: kPMUreadLen_int, ! 115: kPMUrcvLen_int, ! 116: kPMUrcvData_int ! 117: }; ! 118: ! 119: ! 120: enum { ! 121: kPMUADBAddressField = 4 ! 122: }; ! 123: ! 124: enum { ! 125: kPMUResetADBBus = 0x00, ! 126: kPMUFlushADB = 0x01, ! 127: kPMUWriteADB = 0x08, ! 128: kPMUReadADB = 0x0C, ! 129: kPMURWMaskADB = 0x0C ! 130: }; ! 131: ! 132: #define MISC_LENGTH 8 ! 133: ! 134: ! 135: struct PMUrequest { ! 136: UInt32 pmCommand; ! 137: UInt32 pmSLength1; ! 138: UInt8 * pmSBuffer2; ! 139: UInt32 pmSLength2; ! 140: UInt8 * pmRBuffer; ! 141: UInt32 pmRLength; ! 142: bool pmFlag; ! 143: UInt8 pmSBuffer1[MISC_LENGTH]; ! 144: struct PMUrequest * next; ! 145: struct PMUrequest * prev; ! 146: IOSyncer * sync; ! 147: }; ! 148: ! 149: typedef struct PMUrequest PMUrequest; ! 150: ! 151: ! 152: class ApplePMU : IOService ! 153: { ! 154: OSDeclareDefaultStructors(ApplePMU) ! 155: ! 156: public: ! 157: // this stuff is public for the c-functions in the driver ! 158: // IOInterruptEventSource * SRintEventSrc; ! 159: IOInterruptEventSource * cmdDoneEventSrc; ! 160: IOInterruptEventSource * unsolicitedEventSrc; ! 161: IOInterruptEventSource * PMUintEventSrc; ! 162: UInt32 PGE_ISR_state; ! 163: VIAAddress VIA1_shift; // pointers to VIA registers ! 164: VIAAddress VIA1_auxillaryControl; ! 165: VIAAddress VIA2_dataB; ! 166: UInt8 PMreq; // req bit ! 167: UInt8 PMack; // ack bit ! 168: UInt8 interruptState[12]; ! 169: UInt8 receivedByte; ! 170: SInt32 charCountR; ! 171: SInt32 charCountR2; ! 172: UInt32 charCountS1; ! 173: UInt32 charCountS2; ! 174: UInt8 * dataPointer; ! 175: UInt8 * dataPointer1; ! 176: UInt8 * dataPointer2; ! 177: PMUrequest * clientRequest; ! 178: PMUrequest * queueHead; // our command queue ! 179: PMUrequest * queueTail; ! 180: bool adb_reading; // TRUE: we have a register read outstanding ! 181: bool PMU_int_pending; // TRUE: PMU has requested service ! 182: pmCallback_func RTCclient; // Tick handler in RTC client ! 183: IOPMURTCController * ourRTCinterface; ! 184: ! 185: ! 186: private: ! 187: ! 188: IOWorkLoop * workLoop; ! 189: IOCommandQueue * commandQueue; ! 190: IOPMUADBController * ourADBinterface; ! 191: IOPMUNVRAMController * ourNVRAMinterface; ! 192: /* ! 193: IOPMUPwrController * ourPwrinterface; ! 194: */ ! 195: // pointers to VIA registers ! 196: VIAAddress VIA1_interruptFlag; ! 197: VIAAddress VIA1_interruptEnable; ! 198: UInt8 savedPGEintEn; ! 199: UInt8 savedSRintEn; ! 200: ADB_callback_func ADBclient; // autopoll handler in ADB client ! 201: IOService * ADBid; // pointer to ADB client ! 202: IOService * RTCid; // pointer to RTC client ! 203: pmCallback_func PWRclient; // Button handler in Power Management client ! 204: IOService * PWRid; // pointer to Power Management client ! 205: UInt8 firstChar; ! 206: mach_timespec_t adb_read_timeout; // timeout on read to absent adb device ! 207: AbsoluteTime SR_to_ack_transition_delay; ! 208: ! 209: void timeoutOccurred ( void ); ! 210: void DisablePMUInterrupt ( void ); ! 211: void EnablePMUInterrupt ( void ); ! 212: void AcknowledgePMUInterrupt ( void ); ! 213: void DisableSRInterrupt ( void ); ! 214: void EnableSRInterrupt ( void ); ! 215: static bool serializeBatteryInfo( void * target, void * ref, OSSerialize * s ); ! 216: ! 217: protected: ! 218: virtual void free ( void ); ! 219: ! 220: ! 221: public: ! 222: ! 223: bool init ( OSDictionary * properties = 0 ); ! 224: bool start ( IOService * ); ! 225: virtual IOWorkLoop *getWorkLoop() const; ! 226: ! 227: //void poll_device ( void ); ! 228: void enqueueCommand ( PMUrequest * theRequest ); ! 229: void registerForADBInterrupts ( ADB_callback_func client, IOService * caller ); ! 230: void registerForPowerInterrupts ( pmCallback_func buttonHandler, IOService * caller ); ! 231: void registerForClockInterrupts ( pmCallback_func tickHandler, IOService * caller ); ! 232: IOReturn sendMiscCommand ( UInt32 Command, IOByteCount SLength, ! 233: UInt8 * SBuffer, IOByteCount * RLength, UInt8 * RBuffer ); ! 234: //void serviceShiftRegister ( void ); ! 235: void servicePMU ( void ); ! 236: void StartPMUTransmission ( PMUrequest * plugInMessage ); ! 237: void CheckRequestQueue ( void ); ! 238: void ADBinput ( UInt32 theLength, UInt8 * theInput ); ! 239: void buttonInput ( UInt32 theLength, UInt8 * theInput ); ! 240: bool WaitForAckHi ( void ); ! 241: bool WaitForAckLo( void ); ! 242: ! 243: }; ! 244: ! 245: ! 246: ! 247: ! 248: ! 249:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.