Annotation of XNU/iokit/Drivers/hidsystem/drvAppleADBDevices/AppleADBDisplay.cpp, revision 1.1

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) 1997-1998 Apple Computer, Inc.
        !            24:  *
        !            25:  *
        !            26:  * HISTORY
        !            27:  *
        !            28:  * sdouglas  22 Oct 97 - first checked in.
        !            29:  * sdouglas  23 Jul 98 - start IOKit
        !            30:  * suurballe 17 Nov 98 - ported to C++
        !            31:  */
        !            32: 
        !            33: #include <assert.h>
        !            34: #include <IOKit/IOLib.h>
        !            35: 
        !            36: #include "AppleADBDisplay.h"
        !            37: 
        !            38: 
        !            39: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        !            40: 
        !            41: #define super IODisplay
        !            42: OSDefineMetaClassAndStructors( AppleADBDisplay, IODisplay )
        !            43: 
        !            44: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        !            45: 
        !            46: IOReturn AppleADBDisplay::findADBDisplayInfoForType( UInt16 deviceType )
        !            47: {
        !            48:     char       stringBuf[ 32 ];
        !            49:     OSNumber * off;
        !            50:     OSString * key;
        !            51:     OSData *   data;
        !            52: 
        !            53:     sprintf( stringBuf, "adb%dWiggle", deviceType);
        !            54:     if( (off = OSDynamicCast( OSNumber, getProperty( stringBuf ))))
        !            55:         wiggleLADAddr = off->unsigned32BitValue();
        !            56:     else
        !            57:         wiggleLADAddr = kWiggleLADAddr;
        !            58: 
        !            59:     sprintf( stringBuf, "adb%dModes", deviceType);
        !            60:     key = OSDynamicCast( OSString, getProperty( stringBuf ));
        !            61: 
        !            62:     if( key && (data = OSDynamicCast( OSData, getProperty( key )))) {
        !            63:        modeList = (UInt32 *) data->getBytesNoCopy();
        !            64:        numModes = data->getLength() / sizeof( UInt32);
        !            65:     }
        !            66:     if( modeList )
        !            67:         return(kIOReturnSuccess);
        !            68:     else
        !            69:         return( -49 );
        !            70: }
        !            71: 
        !            72: 
        !            73: IOReturn AppleADBDisplay::getConnectFlagsForDisplayMode(
        !            74:                        IODisplayModeID mode, UInt32 * flags )
        !            75: {
        !            76:     IOReturn           err;
        !            77:     IODisplayConnect * connect;
        !            78:     IOFramebuffer *    framebuffer;
        !            79:     int                        timingNum;
        !            80:     IOTimingInformation        info;
        !            81: 
        !            82:     *flags = 0;
        !            83: 
        !            84:     connect = getConnection();
        !            85:     assert( connect );
        !            86:     framebuffer = connect->getFramebuffer();
        !            87:     assert( framebuffer );
        !            88:   
        !            89:     err = framebuffer->getTimingInfoForDisplayMode( mode, &info );
        !            90: 
        !            91:     if( kIOReturnSuccess == err) {
        !            92:         for( timingNum = 0; timingNum < numModes; timingNum++ ) {
        !            93:             if( info.appleTimingID == modeList[ timingNum ] ) {
        !            94:                 *flags = timingNum
        !            95:                    ? ( kDisplayModeValidFlag | kDisplayModeSafeFlag )
        !            96:                     : ( kDisplayModeValidFlag | kDisplayModeSafeFlag
        !            97:                        | kDisplayModeDefaultFlag );
        !            98:                 break;
        !            99:             }
        !           100:         }
        !           101:     }
        !           102: 
        !           103:     return( err );
        !           104: }
        !           105: 
        !           106: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        !           107: 
        !           108: IOReturn AppleADBDisplay::doConnect( void )
        !           109: {
        !           110:     IOReturn                   err;
        !           111:     UInt16             value;
        !           112:     UInt32             retries = 9;
        !           113:     IOByteCount                length;
        !           114: 
        !           115:     while ( retries-- ) {
        !           116: 
        !           117:        value = 0x6000 | (adbDevice->address() << 8);
        !           118:        length = sizeof( value);
        !           119:        err = adbDevice->writeRegister( 3, (UInt8 *) &value, &length );
        !           120:        if( err)
        !           121:             continue;
        !           122: 
        !           123:        /* IOSleep(10); */
        !           124:        /* IODelay(1000); */
        !           125:        length = sizeof( value);
        !           126:        err = adbDevice->readRegister( 3, (UInt8 *) &value, &length );
        !           127:        if( err)
        !           128:            continue;
        !           129: 
        !           130:        if( (value & 0xf000) == 0x6000 )
        !           131:            break;
        !           132:        else
        !           133:            err = kIOReturnNotAttached;
        !           134:     }
        !           135: 
        !           136:     if( err)
        !           137:         kprintf("%s: %d\n", __FUNCTION__, err);
        !           138: 
        !           139:     return(err);
        !           140: }
        !           141: 
        !           142: static void autoPollHandler( IOService * self, UInt8 adbCommand,
        !           143:                                 IOByteCount length, UInt8 * data )
        !           144: {
        !           145:     ((AppleADBDisplay *)self)->packet( adbCommand, length, data );
        !           146: }
        !           147: 
        !           148: void AppleADBDisplay::packet( UInt8 adbCommand,
        !           149:                                 IOByteCount length, UInt8 * data )
        !           150: {
        !           151:     if( length && (*data == waitAckValue) )
        !           152:         waitAckValue = 0;
        !           153: }
        !           154: 
        !           155: IOReturn AppleADBDisplay::writeWithAcknowledge( UInt8 regNum,
        !           156:                                UInt16 data, UInt8 ackValue )
        !           157: {
        !           158:     IOReturn   err;
        !           159:     enum       { kTimeoutMS = 400 };
        !           160:     UInt32     timeout;
        !           161:     IOByteCount        length;
        !           162: 
        !           163:     waitAckValue = ackValue;
        !           164: 
        !           165:     length = sizeof(data);
        !           166:     err = adbDevice->writeRegister( regNum, (UInt8 *) &data, &length );
        !           167: 
        !           168:     if( !err) {
        !           169:         timeout = kTimeoutMS / 50;
        !           170:         while( waitAckValue && timeout-- )
        !           171:             IOSleep( 50 );
        !           172: 
        !           173:         if( waitAckValue )
        !           174:             err = -3;
        !           175:     }
        !           176:     waitAckValue = 0;
        !           177: 
        !           178:     return( err );
        !           179: }
        !           180: 
        !           181: IOReturn AppleADBDisplay::setLogicalRegister( UInt16 address, UInt16 data )
        !           182: {
        !           183:     IOReturn   err = -1;
        !           184:     UInt32     reconnects = 3;
        !           185: 
        !           186:     while( err && reconnects-- ) {
        !           187:        err = writeWithAcknowledge( kADBReg1, address, kReg2DataRdy);
        !           188:        if( err == kIOReturnSuccess )
        !           189:            err = writeWithAcknowledge( kADBReg2, data, kReg2DataAck);
        !           190: 
        !           191:        if( err ) {
        !           192:            if( doConnect() )
        !           193:                break;
        !           194:        }
        !           195:     }
        !           196:     if( err)
        !           197:         kprintf( "%s: %x, %d\n", __FUNCTION__, address, err);
        !           198: 
        !           199:     return( err);
        !           200: }
        !           201: 
        !           202: IOReturn AppleADBDisplay::getLogicalRegister( UInt16 address, UInt16 * data )
        !           203: {
        !           204:     IOReturn   err = -1;
        !           205:     UInt32     reconnects = 3;
        !           206:     UInt16     value;
        !           207:     IOByteCount        length;
        !           208: 
        !           209:     while ( err && reconnects--) {
        !           210:        err = writeWithAcknowledge( kADBReg1, address, kReg2DataRdy);
        !           211:        if( err == kIOReturnSuccess ) {
        !           212:             length = sizeof( value);
        !           213:             err = adbDevice->readRegister( 2, (UInt8 *)&value, &length);
        !           214:            *data = value & 0xff;               // actually only 8 bits
        !           215:        }
        !           216:        if( err) {
        !           217:            if ( doConnect())
        !           218:                break;
        !           219:        }
        !           220:     }
        !           221:     if( err)
        !           222:        kprintf( "%s: %x=%x, %d\n", __FUNCTION__, address, *data, err);
        !           223: 
        !           224:     return err;
        !           225: }
        !           226: 
        !           227: void AppleADBDisplay::setWiggle( bool active )
        !           228: {
        !           229:     setLogicalRegister( wiggleLADAddr, (active ? 1 : 0));
        !           230: }
        !           231: 
        !           232: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        !           233: 
        !           234: bool AppleADBDisplay::start( IOService * nub )
        !           235: {
        !           236:     IOReturn   err;
        !           237:     UInt16     data, deviceType;
        !           238: 
        !           239:     if( !super::start( nub))
        !           240:         return false;
        !           241: 
        !           242:     if( OSDynamicCast( IODisplayConnect, nub ))
        !           243:        return( true );
        !           244: 
        !           245:     assert( OSDynamicCast( IOADBDevice, nub ));
        !           246:     adbDevice = (IOADBDevice *) nub;
        !           247: 
        !           248:     if( !adbDevice->seizeForClient( this, &autoPollHandler) ) {
        !           249:         IOLog("%s: sieze failed\n", getName());
        !           250:         return( false);
        !           251:     }
        !           252: 
        !           253:     do {
        !           254:        err = doConnect();
        !           255:        if( err )
        !           256:            continue;
        !           257: 
        !           258:        err = setLogicalRegister( 0xff, 0xff);
        !           259:        if( err)
        !           260:            continue;
        !           261: 
        !           262:        err = getLogicalRegister( 0xff, &data);
        !           263:        if( err)
        !           264:            continue;
        !           265: 
        !           266:        err = getLogicalRegister( 0xff, &deviceType);
        !           267:        if( err)
        !           268:            continue;
        !           269: 
        !           270:        kprintf("%s: found AVType %d\n",
        !           271:                adbDevice->getName(), deviceType );
        !           272: 
        !           273:        err = findADBDisplayInfoForType( deviceType );
        !           274:        if( err)
        !           275:            continue;
        !           276: 
        !           277:        avDisplayID = deviceType;
        !           278:        setWiggle( false);
        !           279: 
        !           280:        registerService();
        !           281:        return( true );
        !           282: 
        !           283:     } while( false );
        !           284: 
        !           285:     adbDevice->releaseFromClient( this );
        !           286:     return( false );
        !           287: }
        !           288: 
        !           289: 
        !           290: bool AppleADBDisplay::tryAttach( IODisplayConnect * connect )
        !           291: {
        !           292:     IOReturn           err;
        !           293:     bool               attached = false;
        !           294:     UInt32             sense, extSense;
        !           295:     IOFramebuffer *    framebuffer;
        !           296:     IOIndex            fbConnect;
        !           297:     UInt32             senseType;
        !           298:     enum {
        !           299:         kRSCFour       = 4,
        !           300:         kRSCSix                = 6,
        !           301:         kESCFourNTSC   = 0x0A,
        !           302:         kESCSixStandard        = 0x2B,
        !           303:     };
        !           304: 
        !           305:     do {
        !           306: 
        !           307:        framebuffer = connect->getFramebuffer();
        !           308:        fbConnect = connect->getConnection();
        !           309:        assert( framebuffer );
        !           310: 
        !           311:         if( kIOReturnSuccess != framebuffer->getAttributeForConnection(
        !           312:                                fbConnect,
        !           313:                                kConnectionSupportsAppleSense, NULL ))
        !           314:             continue;
        !           315: 
        !           316:        err = framebuffer->getAppleSense( fbConnect,
        !           317:                                &senseType, &sense, &extSense, 0 );
        !           318:        if( err)
        !           319:            continue;
        !           320:        if( (sense != kRSCSix) || (extSense != kESCSixStandard) )       // straight-6
        !           321:            continue;
        !           322: 
        !           323:        setWiggle( true );
        !           324:        err = framebuffer->getAppleSense( fbConnect,
        !           325:                                &senseType, &sense, &extSense, 0 );
        !           326:        setWiggle( false );
        !           327:        if( err)
        !           328:            continue;
        !           329:        if( (sense != kRSCFour) || (extSense != kESCFourNTSC) )         // straight-4
        !           330:            continue;
        !           331: 
        !           332:        kprintf( "%s: attached to %s\n",
        !           333:                adbDevice->getName(), framebuffer->getName() );
        !           334: 
        !           335:        attached = true;
        !           336: 
        !           337:     } while( false);
        !           338: 
        !           339:     return( attached);
        !           340: }
        !           341: 
        !           342: 
        !           343: IOService * AppleADBDisplay::probe( IOService * nub, SInt32 * score )
        !           344: {
        !           345:     IODisplayConnect * connect;
        !           346: 
        !           347:     // both ADB device & display connections come here!
        !           348: 
        !           349:     do {
        !           350:         if( OSDynamicCast( IOADBDevice, nub))
        !           351:            continue;
        !           352: 
        !           353:         if( (connect = OSDynamicCast( IODisplayConnect, nub))
        !           354:          && tryAttach( connect))
        !           355:            continue;
        !           356: 
        !           357:        nub = 0;
        !           358: 
        !           359:     } while( false );
        !           360: 
        !           361:     if( nub)
        !           362:        return( super::probe( nub, score ));
        !           363:     else
        !           364:        return( 0 );
        !           365: }
        !           366: 
        !           367: 
        !           368: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.