1/* 2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23 24/* 25 cc -o ADBtest ADBTest.c -framework IOKit -Wall 26 */ 27#include <ctype.h> 28#include <stdlib.h> 29#include <stdio.h> 30 31#include <mach/mach_port.h> 32#include <mach/mach_interface.h> 33#include <mach/mach_init.h> 34 35//#include <IOKit/IOLib.h> 36 37#include <IOKit/adb/IOADBLib.h> 38 39#define DUT 0x01 40#define DUTprime 0x0f 41 42int 43main(int argc, char **argv) 44{ 45 mach_port_t master_device_port; 46 io_connect_t fb; 47 kern_return_t kr; 48 IOReturn err; 49 unsigned char buffer[8]; 50 unsigned long length; 51 unsigned char bufferA[2]; 52 unsigned long lengthA; 53 unsigned char bufferB[2]; 54 unsigned long lengthB; 55 int i; 56 57 kr = IOMasterPort(bootstrap_port,&master_device_port); 58 if ( kr == kIOReturnSuccess ) { 59 fb = IOPMFindADBController(master_device_port); 60 if ( fb != NULL ) { 61 printf("ADB Controller contacted\n"); // claim tests 62 err = IOPMClaimADBDevice (fb, 0 ); // bad address 63 if ( err != (0xe0000000 + 706 ) ) { 64 printf("claim bad address test failure (0), %08x, %d\n",err, (err & 0xfff)); 65 } 66 err = IOPMClaimADBDevice (fb, 16 ); // bad address 67 if ( err != (0xe0000000 + 706 ) ) { 68 printf("claim bad address test failure (16), %08x, %d\n",err, (err & 0xfff)); 69 } 70 err = IOPMClaimADBDevice (fb, 4 ); // doesn't exist // ** 71 if ( err != (0xe0000000 + 704 ) ) { 72 printf("claim non-existant device test failure (4), %08x, %d\n",err, (err & 0xfff)); 73 } 74 err = IOPMClaimADBDevice (fb, 3 ); // already claimed by kernel // ** 75 if ( err != (0xe0000000 + 709 ) ) { 76 printf("claim owned device test failure (3), %08x, %d\n",err, (err & 0xfff)); 77 } 78 err = IOPMClaimADBDevice (fb, DUT ); // should work 79 if ( err != 0 ) { 80 printf("claim test failure (%d), %08x, %d\n",DUT,err, (err & 0xfff)); 81 } 82 err = IOPMClaimADBDevice (fb, DUT ); // already claimed by user 83 if ( err != (0xe0000000 + 709 ) ) { 84 printf("claim test failure (%d), %08x, %d\n",DUT,err, (err & 0xfff)); 85 } 86 87 err = IOPMReleaseADBDevice (fb, 0 ); // bad address // release tests 88 if ( err != (0xe0000000 + 706 ) ) { 89 printf("release bad address test failure (0), %08x, %d\n",err, (err & 0xfff)); 90 } 91 err = IOPMReleaseADBDevice (fb, 16 ); // bad address 92 if ( err != (0xe0000000 + 706 ) ) { 93 printf("release bad address test failure (16), %08x, %d\n",err, (err & 0xfff)); 94 } 95 err = IOPMReleaseADBDevice (fb, DUT ); // should work 96 if ( err != 0 ) { 97 printf("release test failure (%d), %08x, %d\n",DUT,err, (err & 0xfff)); 98 } 99 err = IOPMReleaseADBDevice (fb, DUT ); // should not work 100 if ( err != (0xe0000000 + 706 ) ) { 101 printf("release unowned test failure (%d), %08x, %d\n",DUT,err, (err & 0xfff)); 102 } 103 // read tests 104 err = IOPMReadADBDevice (fb, 0, 0, buffer, &length ); // bad address 105 if ( err != (0xe0000000 + 706 ) ) { 106 printf("read bad address test failure (0), %08x, %d\n",err, (err & 0xfff)); 107 } 108 err = IOPMReadADBDevice (fb, 16, 0, buffer, &length ); // bad address 109 if ( err != (0xe0000000 + 706 ) ) { 110 printf("read bad address test failure (16), %08x, %d\n",err, (err & 0xfff)); 111 } 112 err = IOPMReadADBDevice (fb, 2, 4, buffer, &length ); // bad register 113 if ( err != (0xe0000000 + 706 ) ) { 114 printf("read bad register test failure (4), %08x, %d\n",err, (err & 0xfff)); 115 } 116 err = IOPMReadADBDevice (fb, DUT, 3, buffer, &length ); // un owned 117 if ( err != (0xe0000000 + 706 ) ) { 118 printf("read unowned test failure (%d), %08x, %d\n",DUT,err, (err & 0xfff)); 119 } 120 err = IOPMClaimADBDevice (fb, DUT ); // should work 121 if ( err != 0 ) { 122 printf("claim failure (%d), %08x, %d\n",DUT,err, (err & 0xfff)); 123 } 124 length = 0; 125 err = IOPMReadADBDevice (fb, DUT, 0, buffer, &length ); // register 0 126 if ( err != 0 ) { 127 printf("read test failure (%d,0), %08x, %d\n",DUT,err, (err & 0xfff)); 128 } 129 else { 130 printf("device %d register 0: length %d,",DUT,length); 131 for ( i = 0; i < length; i++ ) { 132 printf(" %02x",buffer[i]); 133 } 134 printf("\n"); 135 } 136 length = 0; 137 err = IOPMReadADBDevice (fb, DUT, 1, buffer, &length ); // register 1 138 if ( err != 0 ) { 139 printf("read test failure (%d,1), %08x, %d\n",DUT,err, (err & 0xfff)); 140 } 141 else { 142 printf("device %d register 1: length %d,",DUT,length); 143 for ( i = 0; i < length; i++ ) { 144 printf(" %02x",buffer[i]); 145 } 146 printf("\n"); 147 } 148 length = 0; 149 err = IOPMReadADBDevice (fb, DUT, 2, buffer, &length ); // register 2 150 if ( err != 0 ) { 151 printf("read test failure (%d,2), %08x, %d\n",DUT,err, (err & 0xfff)); 152 } 153 else { 154 printf("device %d register 2: length %d,",DUT,length); 155 for ( i = 0; i < length; i++ ) { 156 printf(" %02x",buffer[i]); 157 } 158 printf("\n"); 159 } 160 length = 0; 161 err = IOPMReadADBDevice (fb, DUT, 3, buffer, &length ); // register 3 162 if ( err != 0 ) { 163 printf("read test failure (%d,3), %08x, %d\n",DUT,err, (err & 0xfff)); 164 } 165 else { 166 printf("device %d register 3: length %d,",DUT,length); 167 for ( i = 0; i < length; i++ ) { 168 printf(" %02x",buffer[i]); 169 } 170 printf("\n"); 171 } 172 // write tests 173 err = IOPMWriteADBDevice (fb, 0, 0, buffer, length ); // bad address 174 if ( err != (0xe0000000 + 706 ) ) { 175 printf("write bad address test failure (0), %08x, %d\n",err, (err & 0xfff)); 176 } 177 err = IOPMWriteADBDevice (fb, 16, 0, buffer, length ); // bad address 178 if ( err != (0xe0000000 + 706 ) ) { 179 printf("write bad address test failure (16), %08x, %d\n",err, (err & 0xfff)); 180 } 181 err = IOPMWriteADBDevice (fb, 2, 4, buffer, length ); // bad register 182 if ( err != (0xe0000000 + 706 ) ) { 183 printf("write bad register test failure (4), %08x, %d\n",err, (err & 0xfff)); 184 } 185 err = IOPMWriteADBDevice (fb, 3, 3, buffer, length ); // un owned 186 if ( err != (0xe0000000 + 706 ) ) { 187 printf("write unowned test failure (3), %08x, %d\n",err, (err & 0xfff)); 188 } 189#ifdef q8q 190// to do the following write test, the two lines marked ** above should be commented, and 191// IOADBController::claimDevice must be altered to not check for device existance or kernel ownership 192 bufferA[0] = DUTprime; 193 bufferA[1] = 0xfe; 194 lengthA = 2; 195 err = IOPMWriteADBDevice (fb, DUT, 3, bufferA, lengthA ); // try to move the device 196 if ( err != 0 ) { // to address F 197 printf("write test failure (%d,3), %08x, %d\n",DUT,err, (err & 0xfff)); 198 } 199 err = IOPMClaimADBDevice (fb, DUTprime ); // should work 200 if ( err != 0 ) { 201 printf("claim failure (%d), %08x, %d\n",DUTprime,err, (err & 0xfff)); 202 } 203 lengthB = 0; 204 err = IOPMReadADBDevice (fb, DUTprime, 3, bufferB, &lengthB ); // verify it 205 if ( err != 0 ) { 206 printf("read failure (%d,3), %08x, %d\n",DUTprime,err, (err & 0xfff)); 207 } 208 else { 209 if ( (buffer[1] != bufferB[1]) || (length != lengthB) ) { 210 printf("write verify failure (%d,3), register 3: length %d, %02x %02x\n",DUT,lengthB,bufferB[0],bufferB[1]); 211 } 212 } 213 bufferA[0] = DUT; 214 err = IOPMWriteADBDevice (fb, DUTprime, 3, bufferA, lengthA ); // move it back 215 if ( err != 0 ) { 216 printf("write failure (%d,3), %08x, %d\n",DUTprime,err, (err & 0xfff)); 217 } 218 lengthB = 0; 219 err = IOPMReadADBDevice (fb, DUT, 3, bufferB, &lengthB ); // verify it 220 if ( err != 0 ) { 221 printf("read failure (%d,3), %08x, %d\n",DUT,err, (err & 0xfff)); 222 } 223 else { 224 if ( (buffer[1] != bufferB[1]) || (length != lengthB) ) { 225 printf("restore verify failure (%d,3), register 3: length %d, %02x %02x\n",DUT,lengthB,bufferB[0],bufferB[1]); 226 } 227 } 228 err = IOPMReleaseADBDevice (fb, DUTprime ); // should work 229 if ( err != 0 ) { 230 printf("release failure (%d), %08x, %d\n",DUTprime,err, (err & 0xfff)); 231 } 232#endif 233 err = IOPMReleaseADBDevice (fb, DUT ); // should work 234 if ( err != 0 ) { 235 printf("release failure (%d), %08x, %d\n",DUT,err, (err & 0xfff)); 236 } 237 printf("done\n"); 238 return 1; 239 } 240 } 241 printf("That didn't work for some reason\n"); 242 return 0; 243} 244 245