|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /* Copyright (c) 1997 Apple Computer, Inc. All rights reserved. ! 26: * ! 27: * IOADBBus.m - This file contains the definition of the ! 28: * IOADBBus Class, which is an indirect driver designed to ! 29: * communicate with devices on the ADB bus. ! 30: * ! 31: * Note: this API is very preliminary and is expected to change drastically ! 32: * in future releases, caveat emptor. In the future it will probably be based ! 33: * on some extension to the PortDevices protocol. ! 34: * ! 35: * define FAKE_ADB_DRIVER to true if you do not want to actually talk to the ! 36: * adb driver in the kernel, but rather talk to fake devices implemented here ! 37: * ! 38: * ! 39: * HISTORY ! 40: * 1997-12-19 Brent Schorsch (schorsch) created IOADBDevice.m ! 41: * 1998-01-19 Dave Suurballe transformed into IOADBBus.m ! 42: */ ! 43: ! 44: // DS2 #import <driverkit/ppc/IOADBDevice.h> ! 45: #import <kernserv/prototypes.h> ! 46: #import "busses.h" // DS2 ! 47: #import <dev/ppc/adb.h> ! 48: // DS2 #import <dev/ppc/adb_io.h> ! 49: #import "IOADBBus.h" // DS2 ! 50: #import "drvPMU/pmu.h" // DS2 ! 51: ! 52: // DS2... ! 53: ! 54: typedef struct privDataStruct ! 55: { ! 56: id mDriver_p; // pointer to Cuda or PMU driver ! 57: } PrivDataT; ! 58: ! 59: #define PrivDataSize (sizeof(PrivDataT)) ! 60: // ...DS2 ! 61: ! 62: #define mDriver (((PrivDataT *) _priv)->mDriver_p) ! 63: ! 64: ! 65: extern void kprintf (const char * format, ...); ! 66: extern void InitializeADB(void); ! 67: extern int adb_flush(int); ! 68: extern int adb_readreg2(int, int, unsigned char *, int *); ! 69: extern int adb_writereg2(int, int, unsigned char *, int); ! 70: ! 71: /* DS2... ! 72: typedef struct privDataStruct ! 73: { ! 74: ! 75: IOADBDeviceInfo mADBInfo_p; // ! 76: ! 77: #if FAKE_ADB_DRIVER ! 78: unsigned char mReg_p[4][IO_ADB_MAX_PACKET]; ! 79: int mRegLen_p[4]; ! 80: #endif ! 81: } PrivDataT; ! 82: #define PrivDataSize (sizeof(PrivDataT)) ! 83: ! 84: #define mADBInfo (((PrivDataT *) _priv)->mADBInfo_p) ! 85: ! 86: #if FAKE_ADB_DRIVER ! 87: #define mReg (((PrivDataT *) _priv)->mReg_p) ! 88: #define mRegLen (((PrivDataT *) _priv)->mRegLen_p) ! 89: #endif ! 90: ! 91: typedef struct _adbDeviceTableInfo ! 92: { ! 93: IOADBDeviceInfo info; ! 94: IOADBDevice * object; ! 95: } IOADBDeviceTableInfo; ! 96: ! 97: static BOOL initialized = NO; ! 98: static IOADBDeviceTableInfo gDeviceTable [IO_ADB_MAX_DEVICE*4]; ! 99: static int gDeviceCount; ! 100: ...DS2 */ ! 101: ! 102: extern id PMUdriver; // in adb.m DS2 ! 103: extern adb_device_t adb_devices[ADB_DEVICE_COUNT]; // in adb.m DS2 ! 104: ! 105: /* FROM kernel/.../adb.c */ ! 106: #if !FAKE_ADB_DRIVER ! 107: extern boolean_t adb_initted; ! 108: extern int adb_count; ! 109: ! 110: extern adb_device_t adb_devices[]; ! 111: #endif ! 112: /* END from kernel/.../adb.c */ ! 113: ! 114: // DS2 static IOReturn initalize (PrivDataT *_priv); ! 115: ! 116: @implementation IOADBBus ! 117: ! 118: // Class methods ! 119: ! 120: // DS2... ! 121: + (BOOL) probe: (id) deviceDescription ! 122: { ! 123: id dev; ! 124: extern int kdp_flag; ! 125: ! 126: if ( (dev = [ self alloc ]) == nil ) { ! 127: return NO; ! 128: } ! 129: ! 130: if ([dev initFromDeviceDescription:deviceDescription] == nil) { ! 131: return NO; ! 132: } ! 133: ! 134: [super init]; ! 135: ! 136: [dev setDeviceKind:"ADBBus"]; ! 137: [dev setLocation:NULL]; ! 138: [dev setName:"ADBBus"]; ! 139: [dev registerDevice]; ! 140: ! 141: if (kdp_flag & 1) ! 142: { ! 143: call_kdp(); ! 144: } ! 145: ! 146: return YES; ! 147: } ! 148: ! 149: ! 150: - initFromDeviceDescription:(IODeviceDescription *)deviceDescription ! 151: { ! 152: _priv = NXZoneCalloc([self zone], 1, PrivDataSize); ! 153: ! 154: if (!_priv) { ! 155: return [super free]; ! 156: } ! 157: ! 158: mDriver = [deviceDescription directDevice]; ! 159: PMUdriver = mDriver; ! 160: InitializeADB(); // initialize adb and probe bus ! 161: ! 162: return self; ! 163: } ! 164: ! 165: + (IODeviceStyle) deviceStyle ! 166: { ! 167: return IO_IndirectDevice; ! 168: } ! 169: ! 170: static Protocol *protocols[] = { ! 171: @protocol(ADBservice), ! 172: nil ! 173: }; ! 174: ! 175: + (Protocol **)requiredProtocols ! 176: { ! 177: return protocols; ! 178: } ! 179: ! 180: // ...DS2 ! 181: ! 182: /* ! 183: * Call this method with an array that is IO_ADB_MAX_DEVICE long. ! 184: */ ! 185: - (IOReturn) GetTable: (IOADBDeviceInfo *) table ! 186: : (int *) lenP ! 187: { ! 188: IOReturn status = IO_R_SUCCESS; ! 189: int index; ! 190: ! 191: /* DS2... ! 192: initalize (_priv); ! 193: ! 194: *lenP = gDeviceCount; ! 195: ! 196: for (index = 0; index < gDeviceCount; index++) ! 197: table[index] = gDeviceTable.info; ! 198: ...DS2 */ ! 199: ! 200: // DS2... ! 201: *lenP = IO_ADB_MAX_DEVICE; ! 202: ! 203: for (index = 0; index < IO_ADB_MAX_DEVICE; index++) { ! 204: [self getADBInfo:index:&table[index]]; ! 205: } ! 206: // ...DS2 ! 207: ! 208: return status; ! 209: } ! 210: ! 211: /* DS2... ! 212: - initForDevice: (long) uniqueID ! 213: : (IOReturn *) result; ! 214: { ! 215: int index; ! 216: ! 217: initalize (_priv); ! 218: ! 219: [super init]; ! 220: ! 221: _priv = NXZoneCalloc([self zone], 1, PrivDataSize); ! 222: if (!_priv) ! 223: { ! 224: *result = IO_R_NO_MEMORY; ! 225: return [super free]; ! 226: } ! 227: ! 228: for (index = 0; index < gDeviceCount; index++) ! 229: { ! 230: if (gDeviceTable[index].info.uniqueID == uniqueID) ! 231: break; ! 232: } ! 233: ! 234: if (index >= gDeviceCount) ! 235: { ! 236: *result = IO_R_NO_DEVICE; ! 237: return [self free]; ! 238: } ! 239: ! 240: ASSERT (gDeviceTable[index].info.uniqueID == uniqueID); ! 241: ! 242: if (gDeviceTable[index].object != NULL) ! 243: { ! 244: *result = IO_R_PRIVILEGE; ! 245: return [self free]; ! 246: } ! 247: ! 248: gDeviceTable[index].object = self; ! 249: ! 250: mADBInfo = gDeviceTable[index].info; ! 251: ! 252: #if FAKE_ADB_DRIVER ! 253: mRegLen[0] = 0; ! 254: mRegLen[1] = 0; ! 255: mRegLen[2] = 0; ! 256: mRegLen[3] = 0; ! 257: #endif ! 258: ! 259: *result = IO_R_SUCCESS; ! 260: return self; ! 261: } ! 262: ...DS2 */ ! 263: ! 264: - free ! 265: { ! 266: if (_priv) ! 267: { ! 268: NXZoneFree([self zone], _priv); ! 269: _priv = NULL; ! 270: } ! 271: ! 272: return [super free]; ! 273: } ! 274: ! 275: - (IOReturn) getADBInfo: (int) whichDevice // DS2 ! 276: : (IOADBDeviceInfo *) deviceInfo ! 277: { ! 278: // DS2 deviceInfo = mADBInfo; ! 279: ! 280: deviceInfo->originalAddress = adb_devices[whichDevice].a_dev_type; ! 281: deviceInfo->address = adb_devices[whichDevice].a_addr; ! 282: deviceInfo->originalHandlerID = adb_devices[whichDevice].a_dev_orighandler; ! 283: deviceInfo->handlerID = adb_devices[whichDevice].a_dev_handler; ! 284: deviceInfo->uniqueID = 0; ! 285: deviceInfo->flags = adb_devices[whichDevice].a_flags; ! 286: ! 287: return IO_R_SUCCESS; ! 288: } ! 289: ! 290: - (IOReturn) flushADBDevice: (int) whichDevice // DS2 ! 291: { ! 292: IOReturn status = IO_R_SUCCESS; ! 293: ! 294: /* DS2... ! 295: #if !FAKE_ADB_DRIVER ! 296: adb_request_t flush; ! 297: ! 298: adb_init_request(&flush); ! 299: ADB_BUILD_CMD2(&flush, ADB_PACKET_ADB, (ADB_ADBCMD_FLUSH_ADB | mADBInfo.address << 4)); ! 300: adb_send(&flush, TRUE); ! 301: ! 302: status = flush.a_result; ! 303: #endif ! 304: ...DS2 */ ! 305: ! 306: adb_flush(whichDevice); // DS2 ! 307: return status; ! 308: } ! 309: ! 310: /* ! 311: * Note, the buffers must be IO_ADM_MAX_PACKET long. ! 312: */ ! 313: - (IOReturn) readADBDeviceRegister: (int) whichDevice // DS2 ! 314: : (int) whichRegister ! 315: : (unsigned char *) buffer ! 316: : (int *) length; ! 317: { ! 318: IOReturn status = IO_R_SUCCESS; ! 319: ! 320: /* DS2... ! 321: #if FAKE_ADB_DRIVER ! 322: *length = mRegLen[whichRegister]; ! 323: memcpy (buffer, mReg[whichRegister], mRegLen[whichRegister]); ! 324: #else ! 325: adb_request_t readreg; ! 326: ! 327: adb_init_request(&readreg); ! 328: ADB_BUILD_CMD2(&readreg, ADB_PACKET_ADB, ! 329: (ADB_ADBCMD_READ_ADB | mADBInfo.address << 4 | whichRegister)); ! 330: ! 331: adb_send(&readreg, TRUE); ! 332: ! 333: *length = readreg.a_reply.a_bcount; ! 334: memcpy (buffer, readreg.a_reply.a_buffer, length); ! 335: ! 336: status = readreg.a_result; ! 337: #endif ! 338: ! 339: ...DS2 */ ! 340: ! 341: adb_readreg2(whichDevice, whichRegister, buffer, length); // DS2 ! 342: return status; ! 343: } ! 344: ! 345: - (IOReturn) writeADBDeviceRegister: (int) whichDevice // DS2 ! 346: : (int) whichRegister ! 347: : (unsigned char *) buffer ! 348: : (int) length; ! 349: { ! 350: IOReturn status = IO_R_SUCCESS; ! 351: ! 352: /* DS2... ! 353: #if FAKE_ADB_DRIVER ! 354: mRegLen[whichRegister] = length; ! 355: memcpy (mReg[whichRegister], buffer, length); ! 356: #else ! 357: adb_request_t writereg; ! 358: ! 359: if (length > IO_ADB_MAX_PACKET) length = IO_ADB_MAX_PACKET; ! 360: ! 361: adb_init_request(&writereg); ! 362: ADB_BUILD_CMD2_BUFFER(&writereg, ADB_PACKET_ADB, ! 363: (ADB_ADBCMD_WRITE_ADB | mADBInfo.address << 4 | whichRegister), ! 364: length, buffer); ! 365: ! 366: adb_send(&writereg, TRUE); ! 367: ! 368: status = writereg.a_result; ! 369: #endif ! 370: ! 371: ...DS2 */ ! 372: ! 373: adb_writereg2(whichDevice, whichRegister, buffer, length); // DS2 ! 374: return status; ! 375: } ! 376: ! 377: /* The state functions below are not currently implemented */ ! 378: /* ! 379: * Set the state for the port device. ! 380: */ ! 381: - (IOReturn) setState: (int) whichDevice // DS2 ! 382: : (IOADBDeviceState) state ! 383: : (IOADBDeviceState) mask; ! 384: { ! 385: return IO_R_UNSUPPORTED; ! 386: } ! 387: ! 388: /* ! 389: * Get the state for the port device. ! 390: */ ! 391: - (IOADBDeviceState) getState: (int) whichDevice // DS2 ! 392: { ! 393: return IO_R_UNSUPPORTED; ! 394: } ! 395: ! 396: // DS2... ! 397: - (IOReturn) adb_register_handler: (int) type // DS2 ! 398: : (autopoll_callback) handler ! 399: { ! 400: //kprintf("[IOADBBus adb_register_handler: %08x handler: %08x]\n", ! 401: // type, handler); ! 402: ! 403: adb_register_handler(type, handler); ! 404: return IO_R_SUCCESS; ! 405: } ! 406: // ...DS2 ! 407: /* ! 408: * Wait for the atleast one of the state bits defined in mask to be equal ! 409: * to the value defined in state. ! 410: * Check on entry then sleep until necessary. ! 411: */ ! 412: - (IOReturn) watchState: (int) whichDevice // DS2 ! 413: : (IOADBDeviceState *) state ! 414: : (IOADBDeviceState) mask ! 415: { ! 416: ! 417: return IO_R_UNSUPPORTED; ! 418: } ! 419: ! 420: ! 421: @end ! 422: ! 423: /* DS2... ! 424: static IOReturn initalize (PrivDataT *_priv) ! 425: { ! 426: IOReturn status = IO_R_SUCCESS; ! 427: ! 428: if (initialized) ! 429: { ! 430: if (gDeviceCount != adb_count) ! 431: { ! 432: IOLog ("Error! adb seems to have been reset, IOADBDevice is invalid!"); ! 433: return IO_R_INTERNAL; ! 434: } ! 435: ! 436: return IO_R_SUCCESS; ! 437: } ! 438: ! 439: // build the table ! 440: #if FAKE_ADB_DRIVER ! 441: gDeviceCount = 1; ! 442: gDeviceTable[0].info.originalAddress = 3; ! 443: gDeviceTable[0].info.address = 3; ! 444: gDeviceTable[0].info.originalHandlerID = 1; ! 445: gDeviceTable[0].info.handlerID = 4; ! 446: gDeviceTable[0].info.uniqueID = 1; ! 447: gDeviceTable[0].info.flags = kIOADBDeviceAvailable; ! 448: ! 449: gDeviceTable[0].object = NULL; ! 450: ! 451: #else ! 452: int index; ! 453: int address; ! 454: adb_device_t *adbDevice; ! 455: ! 456: if (!adb_initted) return IO_R_NOT_OPEN; ! 457: ! 458: gDeviceCount = adb_count; ! 459: address = 0; ! 460: ! 461: for (index = 0; index < gDeviceCount && address < IO_ADB_MAX_DEVICE; index++) ! 462: { ! 463: // scan thru adb addresses, looking for once that is present ! 464: while ((adb_devices[address].a_flags & ADB_FLAGS_PRESENT) == 0) ! 465: address++; ! 466: ! 467: if (address >= IO_ADB_MAX_DEVICE) ! 468: IOLog ("IOADBDevice->initialize error: adb devices count mismatch"); ! 469: ! 470: gDeviceTable[index].info.originalAddress = adb_devices[address].a_dev_type; ! 471: gDeviceTable[index].info.address = adb_devices[address].a_addr; // (== address) ! 472: gDeviceTable[index].info.originalHandlerID = adb_devices[address].a_dev_orighandler; ! 473: gDeviceTable[index].info.handlerID = adb_devices[address].a_dev_handler; ! 474: gDeviceTable[index].info.uniqueID = index + 1; ! 475: gDeviceTable[index].info.flags = 0; ! 476: ! 477: // if the device is not registered, and not unresolved, they we can access it ! 478: if ((adb_devices[address].a_flags & ADB_FLAGS_REGISTERED) == 0) && ! 479: (adb_devices[address].a_flags & ADB_FLAGS_UNRESOLVED) == 0)) ! 480: gDeviceTable[index].info.flags |= kIOADBDeviceAvailable; ! 481: ! 482: gDeviceTable[index].object = NULL; ! 483: } ! 484: #endif ! 485: ! 486: initialized = YES; ! 487: ! 488: return status; ! 489: } ! 490: ! 491: ...DS2 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.