Annotation of XNU/iokit/Families/IOADBBus/IOADBController.cpp, revision 1.1.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.