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