|
|
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: * adbevent - FAKE_HARDWARE event dispatch test ! 26: */ ! 27: ! 28: #define FAKE_HARDWARE 1 ! 29: ! 30: #import <adb/adbDriver.h> ! 31: #import <driverkit/generalFuncs.h> ! 32: #import <driverkit/debugging.h> ! 33: #import <driverkit/KernDevUxpr.h> ! 34: #import <libc.h> ! 35: #import <driverkit/IOtsval.h> ! 36: ! 37: static struct tsval tsvalLast = {0,0}; ! 38: ! 39: /* ! 40: * prototypes for private functions. ! 41: */ ! 42: static void usage(char **argv); ! 43: static void resetThread(id driverid); ! 44: static void commandThread(id driverid); ! 45: ! 46: /* ! 47: * Dumb little object which will be a client of AdbDriver. ! 48: */ ! 49: @interface adbClient : Object <adbDriverClient> ! 50: { ! 51: id _driver; ! 52: } ! 53: ! 54: - setDriver : driver; ! 55: @end ! 56: ! 57: @implementation adbClient ! 58: ! 59: /* ! 60: * These standard methods run from the driver's I/O thread. ! 61: */ ! 62: ! 63: /* ! 64: * Called when driver detects one new ADB event. ! 65: */ ! 66: - (void)dispatchAdbEvent : (adbEvent *)event ! 67: { ! 68: unsigned reg; ! 69: int regnum; ! 70: unsigned long long regval_l; ! 71: unsigned regval; ! 72: ! 73: printf("%u:%u delta = %u\n", ! 74: event->timeStamp.high_val, event->timeStamp.low_val, ! 75: ts_diff(&event->timeStamp, &tsvalLast)); ! 76: tsvalLast = event->timeStamp; ! 77: printf(" address %d\n", ! 78: event->deviceAddress); ! 79: for(regnum=0; regnum<=3; regnum++) { ! 80: reg = *((unsigned *)(&event->regs[regnum].data.stand.byte[0])); ! 81: regval_l = adbDeviceRegisterData(&event->regs[regnum]); ! 82: if(regval_l > ULONG_MAX) { ! 83: printf("***length exceeded; using ULONG_MAX\n"); ! 84: regval = ULONG_MAX; ! 85: } ! 86: else ! 87: regval = regval_l; ! 88: printf(" register %d: length %d data 0x%x\n", ! 89: regnum, event->regs[regnum].length, regval); ! 90: } ! 91: [_driver freeAdbEvent:event]; ! 92: } ! 93: ! 94: /* ! 95: * Called on ADB bus reset. ! 96: */ ! 97: - (void)adbBusWasReset ! 98: { ! 99: printf("adbClient: reset detected\n"); ! 100: ! 101: /* ! 102: * Re-register; the driver thinks the world has changed. ! 103: */ ! 104: [_driver attachAddress: FAKE_HARDWARE_START_ADDRESS client:self]; ! 105: } ! 106: ! 107: - setDriver : driver ! 108: { ! 109: _driver = driver; ! 110: return self; ! 111: } ! 112: ! 113: @end ! 114: ! 115: extern int verbose; ! 116: int reset_interval = 0; ! 117: int command_interval = 0; ! 118: ! 119: int main(int argc, char **argv) ! 120: { ! 121: int arg; ! 122: id driverId; ! 123: id clientId; ! 124: ! 125: if(argc < 2) ! 126: usage(argv); ! 127: for(arg=1; arg<argc; arg++) { ! 128: switch(argv[arg][0]) { ! 129: case 'v': ! 130: verbose++; ! 131: break; ! 132: case 'r': ! 133: reset_interval = atoi(&argv[arg][2]); ! 134: break; ! 135: case 'c': ! 136: command_interval = atoi(&argv[arg][2]); ! 137: break; ! 138: default: ! 139: usage(argv); ! 140: } ! 141: } ! 142: ! 143: IOInitGeneralFuncs(); ! 144: IOInitDDM(1000, "adbXpr"); ! 145: IOSetDDMMask(XPR_IODEVICE_INDEX, XPR_LIBIO | XPR_ADB); ! 146: ! 147: /* ! 148: * Instantiate and init a client and the driver. ! 149: */ ! 150: clientId = [adbClient new]; ! 151: driverId = [adbDriver probe:0 deviceMaster:PORT_NULL]; ! 152: [clientId setDriver:driverId]; ! 153: [driverId attachAddress: FAKE_HARDWARE_START_ADDRESS client:clientId]; ! 154: if(reset_interval) ! 155: IOForkThread((IOThreadFunc)resetThread, driverId); ! 156: if(command_interval) ! 157: IOForkThread((IOThreadFunc)commandThread, driverId); ! 158: while(1) { ! 159: IOSleep(10); ! 160: } ! 161: } ! 162: ! 163: static void resetThread(id driverId) ! 164: { ! 165: while(1) { ! 166: IOSleep(reset_interval * 1000); ! 167: [driverId resetAdb]; ! 168: } ! 169: } ! 170: ! 171: static void commandThread(id driverId) ! 172: { ! 173: adbUserCommand cmd; ! 174: IOReturn rtn; ! 175: ! 176: while(1) { ! 177: IOSleep(command_interval * 1000); ! 178: cmd.command = TALK_REGISTER(3, FAKE_HARDWARE_START_ADDRESS); ! 179: cmd.reg.length = 0; ! 180: rtn = [driverId sendUserCommand:&cmd]; ! 181: if(rtn) { ! 182: printf("sendUserCommand returned %s\n", ! 183: [driverId stringFromReturn:rtn]); ! 184: } ! 185: else { ! 186: printf("Talk Register 3: data = 0x%x\n", ! 187: cmd.reg.data.reg3.sh.data); ! 188: } ! 189: } ! 190: } ! 191: ! 192: static void usage(char **argv) ! 193: { ! 194: printf("usage: %s [options]\n", argv[0]); ! 195: printf("Options (must specify at least one):\n"); ! 196: printf("\tv verbose mode\n"); ! 197: printf("\tr=reset_interval (in seconds; default is no reset)\n"); ! 198: printf("\tc=command_interval (in seconds; default is no command\n"); ! 199: exit(1); ! 200: } ! 201:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.