Annotation of XNU/iokit/Families/IOADBBus/IOADBController.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 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991
        !            24:  *              All Rights Reserved
        !            25:  *
        !            26:  * Permission to use, copy, modify, and distribute this software and
        !            27:  * its documentation for any purpose and without fee is hereby granted,
        !            28:  * provided that the above copyright notice appears in all copies and
        !            29:  * that both the copyright notice and this permission notice appear in
        !            30:  * supporting documentation.
        !            31:  *
        !            32:  * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
        !            33:  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
        !            34:  * FOR A PARTICULAR PURPOSE.
        !            35:  *
        !            36:  * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
        !            37:  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
        !            38:  * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
        !            39:  * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
        !            40:  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            41:  *
        !            42:  */
        !            43: /*
        !            44:  * Copyright 1996 1995 by Apple Computer, Inc. 1997 1996 1995 1994 1993 1992 1991
        !            45:  *              All Rights Reserved
        !            46:  *
        !            47:  * Permission to use, copy, modify, and distribute this software and
        !            48:  * its documentation for any purpose and without fee is hereby granted,
        !            49:  * provided that the above copyright notice appears in all copies and
        !            50:  * that both the copyright notice and this permission notice appear in
        !            51:  * supporting documentation.
        !            52:  *
        !            53:  * APPLE COMPUTER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
        !            54:  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
        !            55:  * FOR A PARTICULAR PURPOSE.
        !            56:  *
        !            57:  * IN NO EVENT SHALL APPLE COMPUTER BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
        !            58:  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
        !            59:  * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
        !            60:  * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
        !            61:  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            62:  */
        !            63: /*
        !            64:  * MKLINUX-1.0DR2
        !            65:  */
        !            66: /*
        !            67:  * 18 June 1998 sdouglas  Start IOKit version.
        !            68:  * 16 Nov  1998 suurballe Port to c++
        !            69:  */
        !            70: 
        !            71: 
        !            72: #include <mach/mach_types.h>
        !            73: 
        !            74: #include "IOADBControllerUserClient.h"
        !            75: #include <IOKit/adb/IOADBController.h>
        !            76: #include <IOKit/adb/IOADBDevice.h>
        !            77: #include <libkern/c++/OSSymbol.h>
        !            78: #include <libkern/c++/OSNumber.h>
        !            79: #include <IOKit/IOLib.h>
        !            80: #include "IOADBBusPriv.h"
        !            81: 
        !            82: 
        !            83: #define super IOADBBus
        !            84: 
        !            85: OSDefineMetaClass(IOADBController,IOADBBus)
        !            86: OSDefineAbstractStructors(IOADBController,IOADBBus)
        !            87: 
        !            88: 
        !            89: // **********************************************************************************
        !            90: // start
        !            91: //
        !            92: // **********************************************************************************
        !            93: bool IOADBController::start ( IOService * nub )
        !            94: {
        !            95:    if( !super::start(nub)) {
        !            96:        return false;
        !            97:    }
        !            98: 
        !            99:    probeBus();
        !           100: 
        !           101:    return true;
        !           102: }
        !           103: 
        !           104: 
        !           105: // **********************************************************************************
        !           106: // probeAddress
        !           107: //
        !           108: // **********************************************************************************
        !           109: bool IOADBController::probeAddress ( IOADBAddress addr )
        !           110: {
        !           111:     IOReturn           err;
        !           112:     ADBDeviceControl * deviceInfo;
        !           113:     UInt16                     value;
        !           114:     IOByteCount                length;
        !           115: 
        !           116:     length = 2;
        !           117:     err = readFromDevice(addr,3,(UInt8 *)&value,&length);
        !           118: 
        !           119:     if (err == ADB_RET_OK) {
        !           120:         if( NULL == (deviceInfo = adbDevices[ addr ])) {
        !           121: 
        !           122:             deviceInfo = (ADBDeviceControl *)IOMalloc(sizeof(ADBDeviceControl));
        !           123:             bzero(deviceInfo, sizeof(ADBDeviceControl));
        !           124: 
        !           125:             adbDevices[ addr ] = deviceInfo;
        !           126:             deviceInfo->defaultAddress = addr;
        !           127:             deviceInfo->handlerID = deviceInfo->defaultHandlerID = (value & 0xff);
        !           128:             }
        !           129:         deviceInfo->address = addr;
        !           130:     }
        !           131:     return( (err == ADB_RET_OK));
        !           132: }
        !           133: 
        !           134: 
        !           135: // **********************************************************************************
        !           136: // firstBit
        !           137: //
        !           138: // **********************************************************************************
        !           139: unsigned int IOADBController::firstBit ( unsigned int mask )
        !           140: {
        !           141:     int bit = 15;
        !           142: 
        !           143:     while( 0 == (mask & (1 << bit))) {
        !           144:         bit--;
        !           145:     }
        !           146:     return(bit);
        !           147: }
        !           148: 
        !           149: 
        !           150: // **********************************************************************************
        !           151: // moveDeviceFrom
        !           152: //
        !           153: // **********************************************************************************
        !           154: bool IOADBController::moveDeviceFrom ( IOADBAddress from, IOADBAddress to, bool check )
        !           155: {
        !           156:     IOReturn   err;
        !           157:     UInt16             value;
        !           158:     IOByteCount        length;
        !           159:     bool               moved;
        !           160: 
        !           161:     length = 2;
        !           162:     value = ((to << 8) | ADB_DEVCMD_CHANGE_ID);
        !           163: 
        !           164:     err = writeToDevice(from,3,(UInt8 *)&value,&length);
        !           165: 
        !           166:     adbDevices[ to ] = adbDevices[ from ];
        !           167: 
        !           168:     moved = probeAddress(to);
        !           169: 
        !           170:     if( moved || (!check)) {
        !           171:         adbDevices[ from ] = NULL;
        !           172:     }
        !           173:     else {
        !           174:         adbDevices[ to ] = NULL;
        !           175:     }
        !           176: 
        !           177:     return moved;
        !           178: }
        !           179: 
        !           180: 
        !           181: // **********************************************************************************
        !           182: // probeBus
        !           183: //
        !           184: // **********************************************************************************
        !           185: IOReturn IOADBController::probeBus ( void )
        !           186: {
        !           187:     int                i;
        !           188:     UInt32             unresolvedAddrs;
        !           189:     UInt32             freeAddrs;
        !           190:     IOADBAddress       freeNum, devNum;
        !           191:     IOADBDevice *      newDev;
        !           192:     OSDictionary *     newProps;
        !           193:     char               nameStr[ 10 ];
        !           194:     const OSNumber * object;
        !           195:     const OSSymbol * key;
        !           196: 
        !           197:     /* Kill the auto poll until a new dev id's have been setup */
        !           198: 
        !           199:     setAutoPollEnable(false);
        !           200: 
        !           201:     /*
        !           202:      * Send a ADB bus reset - reply is sent after bus has reset,
        !           203:      * so there is no need to wait for the reset to complete.
        !           204:      */
        !           205: 
        !           206:     resetBus();
        !           207: 
        !           208:     /*
        !           209:      * Okay, now attempt reassign the
        !           210:      * bus
        !           211:      */
        !           212: 
        !           213:     unresolvedAddrs = 0;
        !           214:     freeAddrs = 0xfffe;
        !           215: 
        !           216:     /* Skip 0 -- it's special! */
        !           217:     for (i = 1; i < ADB_DEVICE_COUNT; i++) {
        !           218:         if( probeAddress(i) ) {
        !           219:             unresolvedAddrs |= ( 1 << i );
        !           220:             freeAddrs &= ~( 1 << i );
        !           221:             }
        !           222:     }
        !           223: 
        !           224:     /* Now attempt to reassign the addresses */
        !           225:     while( unresolvedAddrs) {
        !           226:         if( !freeAddrs) {
        !           227:             panic("ADB: Cannot find a free ADB slot for reassignment!");
        !           228:             }
        !           229: 
        !           230:         freeNum = firstBit(freeAddrs);
        !           231:         devNum = firstBit(unresolvedAddrs);
        !           232: 
        !           233:         if( !moveDeviceFrom(devNum, freeNum, true) ) {
        !           234: 
        !           235:             /* It didn't move.. bad! */
        !           236:             IOLog("WARNING : ADB DEVICE %d having problems "
        !           237:                   "probing!\n", devNum);
        !           238:         }
        !           239:         else {
        !           240:             if( probeAddress(devNum) ) {
        !           241:                 /* Found another device at the address, leave
        !           242:                 * the first device moved to one side and set up
        !           243:                 * newly found device for probing
        !           244:                 */
        !           245:                 freeAddrs &= ~( 1 << freeNum );
        !           246: 
        !           247:                 devNum = 0;
        !           248: 
        !           249:             }
        !           250:             else {
        !           251:                 /* no more at this address, good !*/
        !           252:                 /* Move it back.. */
        !           253:                 moveDeviceFrom(freeNum,devNum,false);
        !           254:             }
        !           255:             }
        !           256:         if(devNum) {
        !           257:             unresolvedAddrs &= ~( 1 << devNum );
        !           258:             }
        !           259:     }
        !           260: 
        !           261:     IOLog("ADB present:%lx\n", (freeAddrs ^ 0xfffe));
        !           262: 
        !           263:     setAutoPollList(freeAddrs ^ 0xfffe);
        !           264: 
        !           265:     setAutoPollPeriod(11111);
        !           266: 
        !           267:     setAutoPollEnable(true);
        !           268:     
        !           269: // publish the nubs
        !           270:     for ( i = 1; i < ADB_DEVICE_COUNT; i++ ) {
        !           271:         if( 0 == adbDevices[ i ] ) {
        !           272:             continue;
        !           273:         }
        !           274:         newDev = new IOADBDevice;                      // make a nub
        !           275:         if ( newDev == NULL ) {
        !           276:             continue;
        !           277:         }
        !           278:         newProps = OSDictionary::withCapacity( 10 );   // create a property table for it
        !           279:         if ( newProps == NULL ) {
        !           280:             newDev->free();
        !           281:             continue;
        !           282:         }
        !           283: 
        !           284:         key = OSSymbol::withCString(ADBaddressProperty);       // make key/object for address
        !           285:         if ( key == NULL ) {
        !           286:             newDev->free();
        !           287:             newProps->free();
        !           288:             continue;
        !           289:         }
        !           290:         
        !           291:         object = OSNumber::withNumber((unsigned long long)adbDevices[i]->address,8);
        !           292:         if ( object == NULL ) {
        !           293:             key->release();
        !           294:             newDev->free();
        !           295:             newProps->free();
        !           296:             continue;
        !           297:         }
        !           298:         newProps->setObject(key, (OSObject *)object);          // put it in newProps
        !           299:         key->release();
        !           300:         object->release();
        !           301: 
        !           302:         key = OSSymbol::withCString(ADBhandlerIDProperty);     // make key/object for handlerID
        !           303:         if ( key == NULL ) {
        !           304:             newDev->free();
        !           305:             newProps->free();
        !           306:             continue;
        !           307:         }
        !           308:         object = OSNumber::withNumber((unsigned long long)adbDevices[i]->handlerID,8);
        !           309:         if ( object == NULL ) {
        !           310:             key->release();
        !           311:             newDev->free();
        !           312:             newProps->free();
        !           313:             continue;
        !           314:         }
        !           315:         newProps->setObject(key, (OSObject *)object);          // put it in newProps
        !           316:         key->release();
        !           317:         object->release();
        !           318: 
        !           319:         key = OSSymbol::withCString(ADBdefAddressProperty);    // make key/object for default addr
        !           320:         if ( key == NULL ) {
        !           321:             newDev->free();
        !           322:             newProps->free();
        !           323:             continue;
        !           324:         }
        !           325:         object = OSNumber::withNumber((unsigned long long)adbDevices[i]->defaultAddress,8);
        !           326:         if ( object == NULL ) {
        !           327:             key->release();
        !           328:             newDev->free();
        !           329:             newProps->free();
        !           330:             continue;
        !           331:         }
        !           332:         newProps->setObject(key, (OSObject *)object);          // put it in newProps
        !           333:         key->release();
        !           334:         object->release();
        !           335: 
        !           336:         key = OSSymbol::withCString(ADBdefHandlerProperty);    // make key/object for default h id
        !           337:         if ( key == NULL ) {
        !           338:             newDev->free();
        !           339:             newProps->free();
        !           340:             continue;
        !           341:         }
        !           342:         object = OSNumber::withNumber((unsigned long long)adbDevices[i]->defaultHandlerID,8);
        !           343:         if ( object == NULL ) {
        !           344:             key->release();
        !           345:             newDev->free();
        !           346:             newProps->free();
        !           347:             continue;
        !           348:         }
        !           349:         newProps->setObject(key, (OSObject *)object);          // put it in newProps
        !           350:         key->release();
        !           351:         object->release();
        !           352: 
        !           353:         if ( ! newDev->init(newProps,adbDevices[i]) ) {                // give it to our new nub
        !           354:             kprintf("adb nub init failed\n");
        !           355:             newDev->release();
        !           356:             continue;
        !           357:         }
        !           358: 
        !           359:        sprintf(nameStr,"%x-%02x",adbDevices[i]->defaultAddress,adbDevices[i]->handlerID);
        !           360:         newDev->setName(nameStr);
        !           361:        sprintf(nameStr, "%x", adbDevices[i]->defaultAddress);
        !           362:        newDev->setLocation(nameStr);
        !           363: 
        !           364:         newProps->release();                           // we're done with it
        !           365:         if ( !newDev->attach(this) ) {
        !           366:             kprintf("adb nub attach failed\n");
        !           367:             newDev->release();
        !           368:             continue;
        !           369:         }
        !           370:         newDev->registerService();
        !           371:         newDev->start(this);
        !           372:     }                                                  // repeat loop
        !           373:     return kIOReturnSuccess;
        !           374: }
        !           375: 
        !           376: 
        !           377: // **********************************************************************************
        !           378: // autopollHandler
        !           379: //
        !           380: // **********************************************************************************
        !           381: void autopollHandler ( IOService * us, UInt8 adbCommand, IOByteCount length, UInt8 * data )
        !           382: {
        !           383:     ((IOADBController *)us)->packet(data,length,adbCommand);
        !           384: }
        !           385: 
        !           386: 
        !           387: // **********************************************************************************
        !           388: // packet
        !           389: //
        !           390: // **********************************************************************************
        !           391: void IOADBController::packet ( UInt8 * data, IOByteCount length, UInt8 adbCommand )
        !           392: {
        !           393:     ADBDeviceControl * deviceInfo;
        !           394: 
        !           395:     deviceInfo = adbDevices[ adbCommand >> 4 ];
        !           396:     if( deviceInfo != NULL ) {
        !           397:         if( deviceInfo->owner != NULL ) {
        !           398:             deviceInfo->handler(deviceInfo->owner, adbCommand, length, data);
        !           399:             }
        !           400:     }
        !           401:     else {
        !           402:         // new device arrival?
        !           403:         // IOLog("IOADBBus: new device @%x\n", address);
        !           404:     }
        !           405: }
        !           406: 
        !           407: 
        !           408: // **********************************************************************************
        !           409: // matchDevice
        !           410: //
        !           411: // **********************************************************************************
        !           412: bool IOADBController::matchNubWithPropertyTable( IOService * device, OSDictionary *  propTable )
        !           413: {
        !           414:     bool               matched = false;
        !           415:     const char *       keys;
        !           416:     ADBDeviceControl * deviceInfo = (ADBDeviceControl *)(((IOADBDevice *)device)->busRef());
        !           417:     OSObject * X;
        !           418: 
        !           419:     do {
        !           420:         X = propTable->getObject("ADB Match");
        !           421:         if( !X ) {
        !           422:             break;
        !           423:         }
        !           424:         keys = ((OSString *)X)->getCStringNoCopy();
        !           425:         if( *keys == '*' ) {
        !           426:             keys++;
        !           427:         }
        !           428:         else {
        !           429:             if( deviceInfo->defaultAddress != strtol(keys, &keys, 16)) {
        !           430:                 break;
        !           431:             }
        !           432:         }
        !           433:         if( *keys++ == '-' ) {
        !           434:             if( deviceInfo->defaultHandlerID != strtol(keys, &keys, 16)) {
        !           435:                 break;
        !           436:             }
        !           437:         }
        !           438:         matched = true;
        !           439: 
        !           440:     } while ( false );
        !           441:     return matched;
        !           442: }
        !           443: 
        !           444: 
        !           445: /////// nub -> bus
        !           446: 
        !           447: // **********************************************************************************
        !           448: // setOwner
        !           449: //
        !           450: // **********************************************************************************
        !           451: IOReturn IOADBController::setOwner ( void * device, IOService * client, ADB_callback_func handler )
        !           452: {
        !           453:    ADBDeviceControl * deviceInfo = (ADBDeviceControl *)device;
        !           454: 
        !           455:    deviceInfo->owner = client;
        !           456:    deviceInfo->handler = handler;
        !           457:    return kIOReturnSuccess;
        !           458: }
        !           459: 
        !           460: 
        !           461: // **********************************************************************************
        !           462: // clearOwner
        !           463: //
        !           464: // **********************************************************************************
        !           465: IOReturn IOADBController::clearOwner ( void * device )
        !           466: {
        !           467:    ADBDeviceControl * deviceInfo = (ADBDeviceControl *)device;
        !           468:     kprintf("IOADBController::clearOwner\n");
        !           469:     
        !           470:    deviceInfo->owner = NULL;
        !           471:    deviceInfo->handler = NULL;
        !           472:    return kIOReturnSuccess;
        !           473: }
        !           474: 
        !           475: 
        !           476: // **********************************************************************************
        !           477: // claimDevice
        !           478: //
        !           479: // Called by the user client
        !           480: // **********************************************************************************
        !           481: IOReturn IOADBController::claimDevice (unsigned long ADBaddress, IOService * client, ADB_callback_func handler )
        !           482: {
        !           483:    if ( claimed_devices[ADBaddress] == true ) {                        // is this address already claimed by the user?
        !           484:        return kIOReturnExclusiveAccess;                        // yes
        !           485:    }
        !           486:    if ( adbDevices[ADBaddress] == NULL )  {                    // no, is there a device at that address?
        !           487:        return kIOReturnNoDevice;                               // no
        !           488:    }
        !           489:    if (adbDevices[ADBaddress]->handler != NULL ) {             // yes, is it already owned by the kernel?
        !           490:        return kIOReturnExclusiveAccess;                        // yes
        !           491:    }
        !           492:    claimed_devices[ADBaddress] = true;                 // no, user can have it
        !           493:     return kIOReturnSuccess;
        !           494: }
        !           495: 
        !           496: 
        !           497: // **********************************************************************************
        !           498: // releaseDevice
        !           499: //
        !           500: // Called by the user client
        !           501: // **********************************************************************************
        !           502: IOReturn IOADBController::releaseDevice (unsigned long ADBaddress )
        !           503: {
        !           504:    if ( claimed_devices[ADBaddress] == false ) {
        !           505:        return kIOReturnBadArgument;
        !           506:    }
        !           507: 
        !           508:    claimed_devices[ADBaddress] = false;
        !           509: 
        !           510:     return kIOReturnSuccess;
        !           511: }
        !           512: 
        !           513: 
        !           514: // **********************************************************************************
        !           515: // readDeviceForUser
        !           516: //
        !           517: // Called by the user client
        !           518: // **********************************************************************************
        !           519: IOReturn IOADBController::readDeviceForUser  (unsigned long address, unsigned long adbRegister,
        !           520:                       UInt8 * data, IOByteCount * length)
        !           521: {
        !           522:   if ( claimed_devices[address] == false ) {
        !           523:       return kIOReturnBadArgument;
        !           524:   }
        !           525: 
        !           526:    return (readFromDevice((IOADBAddress)address,(IOADBRegister)adbRegister,data,length));
        !           527: }
        !           528: 
        !           529: 
        !           530: // **********************************************************************************
        !           531: // writeDeviceForUser
        !           532: //
        !           533: // Called by the user client
        !           534: // **********************************************************************************
        !           535: IOReturn IOADBController::writeDeviceForUser  (unsigned long address, unsigned long adbRegister,
        !           536:                       UInt8 * data, IOByteCount * length)
        !           537: {
        !           538:   if ( claimed_devices[address] == false ) {
        !           539:       return kIOReturnBadArgument;
        !           540:   }
        !           541: 
        !           542:    return (writeToDevice((IOADBAddress)address,(IOADBRegister)adbRegister,data,length));
        !           543: }
        !           544: 
        !           545: 
        !           546: // **********************************************************************************
        !           547: // address
        !           548: //
        !           549: // **********************************************************************************
        !           550: IOADBAddress IOADBController::address ( ADBDeviceControl * busRef )
        !           551: {
        !           552:     return busRef->address;
        !           553: }
        !           554: 
        !           555: 
        !           556: // **********************************************************************************
        !           557: // defaultAddress
        !           558: //
        !           559: // **********************************************************************************
        !           560: IOADBAddress IOADBController::defaultAddress ( ADBDeviceControl * busRef )
        !           561: {
        !           562:     return busRef->defaultAddress;
        !           563: }
        !           564: 
        !           565: 
        !           566: // **********************************************************************************
        !           567: // handlerID
        !           568: //
        !           569: // **********************************************************************************
        !           570: UInt8 IOADBController::handlerID ( ADBDeviceControl * busRef )
        !           571: {
        !           572:     return busRef->handlerID;
        !           573: }
        !           574: 
        !           575: 
        !           576: // **********************************************************************************
        !           577: // defaultHandlerID
        !           578: //
        !           579: // **********************************************************************************
        !           580: UInt8 IOADBController::defaultHandlerID ( ADBDeviceControl * busRef )
        !           581: {
        !           582:     return busRef->defaultHandlerID;
        !           583: }
        !           584: 
        !           585: 
        !           586: // **********************************************************************************
        !           587: // flush
        !           588: //
        !           589: // **********************************************************************************
        !           590: IOReturn IOADBController::flush ( ADBDeviceControl * busRef )
        !           591: {
        !           592:     return(flushDevice(busRef->address));
        !           593: }
        !           594: 
        !           595: 
        !           596: // **********************************************************************************
        !           597: // readRegister
        !           598: //
        !           599: // **********************************************************************************
        !           600: IOReturn IOADBController::readRegister ( ADBDeviceControl * busRef, IOADBRegister adbRegister,
        !           601:                                          UInt8 * data, IOByteCount * length )
        !           602: {
        !           603:     return readFromDevice(busRef->address,adbRegister,data,length);
        !           604: }
        !           605: 
        !           606: 
        !           607: // **********************************************************************************
        !           608: // writeRegister
        !           609: //
        !           610: // **********************************************************************************
        !           611: IOReturn IOADBController::writeRegister ( ADBDeviceControl * busRef, IOADBRegister adbRegister,
        !           612:                                           UInt8 * data, IOByteCount * length )
        !           613: {
        !           614:     return writeToDevice(busRef->address,adbRegister,data,length);
        !           615: }
        !           616: 
        !           617: 
        !           618: // **********************************************************************************
        !           619: // setHandlerID
        !           620: //
        !           621: // **********************************************************************************
        !           622: IOReturn IOADBController::setHandlerID ( ADBDeviceControl * deviceInfo, UInt8 handlerID )
        !           623: {
        !           624:     IOReturn   err;
        !           625:     UInt16             value;
        !           626:     IOByteCount        length;
        !           627:     IOADBAddress       addr = deviceInfo->address;
        !           628: 
        !           629:     length = 2;
        !           630:     err = readFromDevice(addr,3,(UInt8 *)&value,&length);
        !           631: 
        !           632:     if ( err ) {
        !           633:         return err;
        !           634:     }
        !           635: 
        !           636:     value = (value & 0xf000) | handlerID | (addr << 8);
        !           637:     length = 2;
        !           638:     err = writeToDevice(addr,3,(UInt8 *)&value,&length);
        !           639: 
        !           640:     length = 2;
        !           641:     err = readFromDevice(addr,3,(UInt8 *)&value,&length);
        !           642: 
        !           643:     if ( err == kIOReturnSuccess ) {
        !           644:         deviceInfo->handlerID = value & 0xff;
        !           645:     }
        !           646: 
        !           647:     if ( deviceInfo->handlerID == handlerID ) {
        !           648:         err = kIOReturnSuccess;
        !           649:     }
        !           650:     else {
        !           651:         err = kIOReturnNoResources;
        !           652:     }
        !           653: 
        !           654:     return err;
        !           655: }
        !           656: 
        !           657: 
        !           658: // **********************************************************************************
        !           659: // getURLComponentUnit
        !           660: //
        !           661: // **********************************************************************************
        !           662: int IOADBController::getURLComponentUnit ( IOService * device, char * path, int maxLen )
        !           663: {
        !           664:     ADBDeviceControl * deviceInfo = (ADBDeviceControl *)((IOADBDevice *)device)->busRef();
        !           665: 
        !           666:     if( maxLen > 1 ) {
        !           667:         sprintf( path, "%x", deviceInfo->address );
        !           668:         return(1);
        !           669:     }
        !           670:     else {
        !           671:         return(0);
        !           672:     }
        !           673: }
        !           674: 
        !           675: 
        !           676: // **********************************************************************************
        !           677: // newUserClient
        !           678: //
        !           679: // **********************************************************************************
        !           680: IOReturn IOADBController::newUserClient(  task_t owningTask,  void * /* security_id */, UInt32 type, IOUserClient ** handler )
        !           681: {
        !           682:     IOReturn           err = kIOReturnSuccess;
        !           683:    IOADBControllerUserClient * client;
        !           684: 
        !           685:   client = IOADBControllerUserClient::withTask(owningTask);
        !           686: 
        !           687:   if( !client || (false == client->attach( this )) ||
        !           688:       (false == client->start( this )) ) {
        !           689:       if(client) {
        !           690:           client->detach( this );
        !           691:           client->release();
        !           692:           client = NULL;
        !           693:       }
        !           694:       err = kIOReturnNoMemory;
        !           695:   }
        !           696:   *handler = client;   
        !           697:   return err;
        !           698: }

unix.superglobalmegacorp.com

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