disptest.c revision 1.4 1 1.4 takemura /* $NetBSD: disptest.c,v 1.4 2001/03/04 05:08:29 takemura Exp $ */
2 1.3 takemura
3 1.3 takemura /*-
4 1.3 takemura * Copyright (c) 1999 Shin Takemura.
5 1.3 takemura * All rights reserved.
6 1.3 takemura *
7 1.3 takemura * This software is part of the PocketBSD.
8 1.3 takemura *
9 1.3 takemura * Redistribution and use in source and binary forms, with or without
10 1.3 takemura * modification, are permitted provided that the following conditions
11 1.3 takemura * are met:
12 1.3 takemura * 1. Redistributions of source code must retain the above copyright
13 1.3 takemura * notice, this list of conditions and the following disclaimer.
14 1.3 takemura * 2. Redistributions in binary form must reproduce the above copyright
15 1.3 takemura * notice, this list of conditions and the following disclaimer in the
16 1.3 takemura * documentation and/or other materials provided with the distribution.
17 1.3 takemura * 3. All advertising materials mentioning features or use of this software
18 1.3 takemura * must display the following acknowledgement:
19 1.3 takemura * This product includes software developed by the PocketBSD project
20 1.3 takemura * and its contributors.
21 1.3 takemura * 4. Neither the name of the project nor the names of its contributors
22 1.3 takemura * may be used to endorse or promote products derived from this software
23 1.3 takemura * without specific prior written permission.
24 1.3 takemura *
25 1.3 takemura * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 1.3 takemura * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 1.3 takemura * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 1.3 takemura * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 1.3 takemura * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 1.3 takemura * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 1.3 takemura * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 1.3 takemura * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 1.3 takemura * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 1.3 takemura * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 1.3 takemura * SUCH DAMAGE.
36 1.3 takemura *
37 1.3 takemura */
38 1.3 takemura #include <pbsdboot.h>
39 1.3 takemura
40 1.3 takemura #define ARRAYSIZEOF(a) (sizeof(a)/sizeof(*(a)))
41 1.3 takemura
42 1.3 takemura static struct area {
43 1.3 takemura long start, end;
44 1.3 takemura } targets[] = {
45 1.3 takemura { 0x0a000000, 0x0b000000 },
46 1.3 takemura { 0x10000000, 0x14000000 },
47 1.3 takemura };
48 1.3 takemura int ntargets = ARRAYSIZEOF(targets);
49 1.3 takemura
50 1.3 takemura void
51 1.3 takemura flush_XX()
52 1.3 takemura {
53 1.3 takemura static volatile unsigned char tmp[1024*64];
54 1.3 takemura int i, s;
55 1.3 takemura
56 1.3 takemura for (i = 0; i < ARRAYSIZEOF(tmp); i++) {
57 1.3 takemura s += tmp[i];
58 1.3 takemura }
59 1.3 takemura }
60 1.3 takemura
61 1.3 takemura static void
62 1.3 takemura gpio_test()
63 1.3 takemura {
64 1.3 takemura #define GIUBASE 0xab000000
65 1.3 takemura #define GIUOFFSET 0x0100
66 1.3 takemura volatile unsigned short *giusell;
67 1.3 takemura volatile unsigned short *giuselh;
68 1.3 takemura volatile unsigned short *giupiodl;
69 1.3 takemura volatile unsigned short *giupiodh;
70 1.3 takemura unsigned short sell = 0;
71 1.3 takemura unsigned short selh = 0;
72 1.3 takemura unsigned short piodl = 0;
73 1.3 takemura unsigned short piodh = 0;
74 1.3 takemura int res, i;
75 1.3 takemura unsigned short regs[16];
76 1.3 takemura unsigned short prev_regs[16];
77 1.3 takemura
78 1.3 takemura unsigned char* p = (char*)VirtualAlloc(0, 1024, MEM_RESERVE,
79 1.3 takemura PAGE_NOACCESS);
80 1.3 takemura res = VirtualCopy((LPVOID)p, (LPVOID)(GIUBASE >> 8), 1024,
81 1.3 takemura PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
82 1.3 takemura if (!res) {
83 1.3 takemura win_printf(TEXT("VirtualCopy() failed."));
84 1.3 takemura }
85 1.3 takemura
86 1.3 takemura for (i = 0; i < 16; i++) {
87 1.3 takemura prev_regs[i] = ~0;
88 1.3 takemura }
89 1.3 takemura
90 1.3 takemura giusell = (unsigned short*)(p + GIUOFFSET + 0);
91 1.3 takemura giuselh = (unsigned short*)(p + GIUOFFSET + 2);
92 1.3 takemura giupiodl = (unsigned short*)(p + GIUOFFSET + 4);
93 1.3 takemura giupiodh = (unsigned short*)(p + GIUOFFSET + 6);
94 1.3 takemura
95 1.3 takemura while (1) {
96 1.3 takemura sell = *giusell;
97 1.3 takemura selh = *giuselh;
98 1.3 takemura *giusell = sell;
99 1.3 takemura *giuselh = selh;
100 1.3 takemura
101 1.3 takemura piodl = *giupiodl;
102 1.3 takemura piodh = *giupiodh;
103 1.3 takemura *giupiodl = piodl;
104 1.3 takemura *giupiodh = piodh;
105 1.3 takemura for (i = 0; i < 16; i++) {
106 1.3 takemura regs[i] = *(unsigned short*)(p + GIUOFFSET + i * 2);
107 1.3 takemura }
108 1.3 takemura for (i = 0; i < 16; i++) {
109 1.3 takemura if (i != 3 && i != 5 && regs[i] != prev_regs[i]) {
110 1.3 takemura win_printf(TEXT("IOSEL=%04x%04x "),
111 1.3 takemura regs[1], regs[0]);
112 1.3 takemura win_printf(TEXT("PIOD=%04x%04x "),
113 1.3 takemura regs[3], regs[2]);
114 1.3 takemura win_printf(TEXT("STAT=%04x%04x "),
115 1.3 takemura regs[5], regs[4]);
116 1.3 takemura win_printf(TEXT("(%04x%04x) "),
117 1.3 takemura regs[5]®s[7], regs[4]®s[6]);
118 1.3 takemura win_printf(TEXT("EN=%04x%04x "),
119 1.3 takemura regs[7], regs[6]);
120 1.3 takemura win_printf(TEXT("TYP=%04x%04x "),
121 1.3 takemura regs[9], regs[8]);
122 1.3 takemura win_printf(TEXT("ALSEL=%04x%04x "),
123 1.3 takemura regs[11], regs[10]);
124 1.3 takemura win_printf(TEXT("HTSEL=%04x%04x "),
125 1.3 takemura regs[13], regs[12]);
126 1.3 takemura win_printf(TEXT("PODAT=%04x%04x "),
127 1.3 takemura regs[15], regs[14]);
128 1.3 takemura win_printf(TEXT("\n"));
129 1.3 takemura for (i = 0; i < 16; i++) {
130 1.3 takemura prev_regs[i] = regs[i];
131 1.3 takemura }
132 1.3 takemura break;
133 1.3 takemura }
134 1.3 takemura }
135 1.3 takemura }
136 1.3 takemura }
137 1.3 takemura
138 1.4 takemura static struct regdesc {
139 1.4 takemura TCHAR *name;
140 1.4 takemura int physaddr;
141 1.4 takemura int size;
142 1.4 takemura int mask;
143 1.4 takemura //void *addr;
144 1.4 takemura unsigned long val;
145 1.4 takemura unsigned long preval;
146 1.4 takemura } test_regs[] = {
147 1.4 takemura #if 0
148 1.4 takemura /*
149 1.4 takemura * Vrc4172 GPIO and PWM
150 1.4 takemura */
151 1.4 takemura { TEXT("EXGPDATA0"), 0x15001080, 2, 0xfffd },
152 1.4 takemura { TEXT("EXGPDATA1"), 0x150010c0, 2, 0xffff },
153 1.4 takemura { TEXT("LCDDUTYEN"), 0x15003880, 2, 0xffff },
154 1.4 takemura { TEXT("LCDFREQ"), 0x15003882, 2, 0xffff },
155 1.4 takemura { TEXT("LCDDUTY"), 0x15003884, 2, 0xffff },
156 1.4 takemura #endif
157 1.4 takemura
158 1.4 takemura #if 0
159 1.4 takemura /*
160 1.4 takemura * Vr41xx GPIO
161 1.4 takemura */
162 1.4 takemura { TEXT("GIUPIODL"), 0x0b000104, 2, 0xffff },
163 1.4 takemura { TEXT("GIUPIODH"), 0x0b000106, 2, 0xffff },
164 1.4 takemura { TEXT("GIUPODATL"), 0x0b00011c, 2, 0xffff },
165 1.4 takemura { TEXT("GIUPODATH"), 0x0b00011e, 2, 0xffff },
166 1.4 takemura { TEXT("GIUUSEUPDN"), 0x0b0002e0, 2, 0xffff },
167 1.4 takemura { TEXT("GIUTERMUPDN"), 0x0b0002e2, 2, 0xffff },
168 1.4 takemura #endif
169 1.4 takemura
170 1.4 takemura /*
171 1.4 takemura * MQ200
172 1.4 takemura */
173 1.4 takemura { TEXT("PM00R"), 0x0a600000, 4, 0xffffffff },
174 1.4 takemura { TEXT("PM01R"), 0x0a600004, 4, 0xffffffff },
175 1.4 takemura { TEXT("PM02R"), 0x0a600008, 4, 0xffffffff },
176 1.4 takemura { TEXT("PM06R"), 0x0a600018, 4, 0xffffffff },
177 1.4 takemura { TEXT("PM07R"), 0x0a60001c, 4, 0xffffffff },
178 1.4 takemura
179 1.4 takemura { TEXT("CC00R"), 0x0a602000, 4, 0x0000003f },
180 1.4 takemura { TEXT("CC01R"), 0x0a602004, 4, 0x00000000 },
181 1.4 takemura
182 1.4 takemura { TEXT("MM00R"), 0x0a604000, 4, 0x00000007 },
183 1.4 takemura { TEXT("MM01R"), 0x0a604004, 4, 0xffffffff },
184 1.4 takemura { TEXT("MM02R"), 0x0a604008, 4, 0xffffffff },
185 1.4 takemura { TEXT("MM03R"), 0x0a60400c, 4, 0x00000001 },
186 1.4 takemura { TEXT("MM04R"), 0x0a604010, 4, 0x00000001 },
187 1.4 takemura
188 1.4 takemura { TEXT("IN00R"), 0x0a608000, 4, 0x0000001f },
189 1.4 takemura { TEXT("IN01R"), 0x0a608004, 4, 0x0000ffff },
190 1.4 takemura { TEXT("IN02R"), 0x0a608008, 4, 0x00000000 },
191 1.4 takemura { TEXT("IN03R"), 0x0a60800c, 4, 0x00000000 },
192 1.4 takemura
193 1.4 takemura { TEXT("GC00R"), 0x0a60a000, 4, 0xfffff9ff },
194 1.4 takemura { TEXT("GC01R"), 0x0a60a004, 4, 0x10ffffff },
195 1.4 takemura { TEXT("GC20R"), 0x0a60a080, 4, 0xffffffff },
196 1.4 takemura { TEXT("GC21R"), 0x0a60a084, 4, 0x0000007f },
197 1.4 takemura
198 1.4 takemura { TEXT("FP00R"), 0x0a60e000, 4, 0xffffffff },
199 1.4 takemura { TEXT("FP01R"), 0x0a60e004, 4, 0xffffffff },
200 1.4 takemura { TEXT("FP02R"), 0x0a60e008, 4, 0x007fffff },
201 1.4 takemura { TEXT("FP03R"), 0x0a60e00c, 4, 0x0707003f },
202 1.4 takemura { TEXT("FP04R"), 0x0a60e010, 4, 0xffff3fff },
203 1.4 takemura { TEXT("FP05R"), 0x0a60e014, 4, 0xffffffff },
204 1.4 takemura { TEXT("FP0FR"), 0x0a60e03c, 4, 0xffffffff },
205 1.4 takemura
206 1.4 takemura { TEXT("DC00R"), 0x0a614000, 4, 0xffffffff },
207 1.4 takemura { TEXT("DC01R"), 0x0a614004, 4, 0x0000003f },
208 1.4 takemura { TEXT("DC02R"), 0x0a614008, 4, 0xffffffff },
209 1.4 takemura { TEXT("DC03R"), 0x0a61400c, 4, 0xffffffff },
210 1.4 takemura
211 1.4 takemura { TEXT("PC00R"), 0x0a616000, 4, 0xffffffff },
212 1.4 takemura { TEXT("PC04R"), 0x0a616004, 4, 0xffffffff },
213 1.4 takemura { TEXT("PC08R"), 0x0a616008, 4, 0xffffffff },
214 1.4 takemura { TEXT("PC0CR"), 0x0a61600c, 4, 0xffffffff },
215 1.4 takemura { TEXT("PC10R"), 0x0a616010, 4, 0xffffffff },
216 1.4 takemura { TEXT("PC14R"), 0x0a616014, 4, 0xffffffff },
217 1.4 takemura { TEXT("PC2CR"), 0x0a61602c, 4, 0xffffffff },
218 1.4 takemura { TEXT("PC3CR"), 0x0a61603c, 4, 0xffffffff },
219 1.4 takemura { TEXT("PC40R"), 0x0a616040, 4, 0xffffffff },
220 1.4 takemura { TEXT("PC44R"), 0x0a616044, 4, 0x00000003 },
221 1.4 takemura };
222 1.4 takemura
223 1.4 takemura extern int SetKMode(int);
224 1.4 takemura static void
225 1.4 takemura regfetch(struct regdesc* desc)
226 1.4 takemura {
227 1.4 takemura SetKMode(1);
228 1.4 takemura switch (desc->size) {
229 1.4 takemura case 1:
230 1.4 takemura desc->val = *(unsigned char*)(desc->physaddr | 0xa0000000);
231 1.4 takemura break;
232 1.4 takemura case 2:
233 1.4 takemura desc->val = *(unsigned short*)(desc->physaddr | 0xa0000000);
234 1.4 takemura break;
235 1.4 takemura case 4:
236 1.4 takemura desc->val = *(unsigned long*)(desc->physaddr | 0xa0000000);
237 1.4 takemura break;
238 1.4 takemura default:
239 1.4 takemura win_printf(TEXT("Invalid size"));
240 1.4 takemura break;
241 1.4 takemura }
242 1.4 takemura SetKMode(0);
243 1.4 takemura desc->val &= desc->mask;
244 1.4 takemura }
245 1.4 takemura
246 1.4 takemura static void
247 1.4 takemura register_test()
248 1.4 takemura {
249 1.4 takemura int i;
250 1.4 takemura int nregs = sizeof(test_regs)/sizeof(*test_regs);
251 1.4 takemura
252 1.4 takemura for (i = 0; i < nregs; i++) {
253 1.4 takemura regfetch(&test_regs[i]);
254 1.4 takemura test_regs[i].preval = test_regs[i].val;
255 1.4 takemura }
256 1.4 takemura
257 1.4 takemura while (1) {
258 1.4 takemura for (i = 0; i < nregs; i++) {
259 1.4 takemura regfetch(&test_regs[i]);
260 1.4 takemura if (test_regs[i].val != test_regs[i].preval) {
261 1.4 takemura win_printf(TEXT("%20s(%08x) %08x -> %08x\n"),
262 1.4 takemura test_regs[i].name,
263 1.4 takemura test_regs[i].physaddr,
264 1.4 takemura test_regs[i].preval,
265 1.4 takemura test_regs[i].val);
266 1.4 takemura test_regs[i].preval = test_regs[i].val;
267 1.4 takemura }
268 1.4 takemura }
269 1.4 takemura Sleep(10); /* 10 msec */
270 1.4 takemura }
271 1.4 takemura }
272 1.4 takemura
273 1.4 takemura static void
274 1.4 takemura dump_memory()
275 1.4 takemura {
276 1.4 takemura HANDLE fh = INVALID_HANDLE_VALUE;
277 1.4 takemura #define UNICODE_MEMORY_CARD \
278 1.4 takemura TEXT('\\'), 0xff92, 0xff93, 0xff98, TEXT(' '), 0xff76, 0xff70, \
279 1.4 takemura 0xff84, 0xff9e
280 1.4 takemura TCHAR filename[] = { UNICODE_MEMORY_CARD, TEXT('2'), TEXT('\\'),
281 1.4 takemura TEXT('d'), TEXT('u'), TEXT('m'), TEXT('p'), 0 };
282 1.4 takemura unsigned long *addr;
283 1.4 takemura int found;
284 1.4 takemura
285 1.4 takemura win_printf(TEXT("dump to %s\n"), filename);
286 1.4 takemura fh = CreateFile(
287 1.4 takemura filename, /* file name */
288 1.4 takemura GENERIC_WRITE, /* access (read-write) mode */
289 1.4 takemura FILE_SHARE_WRITE,/* share mode */
290 1.4 takemura NULL, /* pointer to security attributes */
291 1.4 takemura CREATE_ALWAYS, /* how to create */
292 1.4 takemura FILE_ATTRIBUTE_NORMAL, /* file attributes*/
293 1.4 takemura NULL /* handle to file with attributes to */
294 1.4 takemura );
295 1.4 takemura if (fh == INVALID_HANDLE_VALUE) {
296 1.4 takemura return;
297 1.4 takemura }
298 1.4 takemura
299 1.4 takemura for (addr = (unsigned long*)0xbe000000;
300 1.4 takemura addr < (unsigned long*)0xbfffffff;
301 1.4 takemura addr += 2048) {
302 1.4 takemura char buf[2048];
303 1.4 takemura DWORD n;
304 1.4 takemura
305 1.4 takemura SetKMode(1);
306 1.4 takemura memcpy(buf, addr, 2048);
307 1.4 takemura SetKMode(0);
308 1.4 takemura if (WriteFile(fh, buf, 2048, &n, NULL) == 0 ||
309 1.4 takemura n != 2048) {
310 1.4 takemura win_printf(TEXT("dump failed\n"));
311 1.4 takemura break;
312 1.4 takemura }
313 1.4 takemura }
314 1.4 takemura
315 1.4 takemura CloseHandle(fh);
316 1.4 takemura }
317 1.4 takemura
318 1.3 takemura static void
319 1.3 takemura serial_test()
320 1.3 takemura {
321 1.3 takemura #if 1
322 1.3 takemura # define SIUADDR 0xac000000
323 1.3 takemura # define REGOFFSET 0x0
324 1.3 takemura #else
325 1.3 takemura # define SIUADDR 0xab000000
326 1.3 takemura # define REGOFFSET 0x1a0
327 1.3 takemura #endif
328 1.3 takemura #define REGSIZE 32
329 1.3 takemura int i, changed, res;
330 1.3 takemura unsigned char regs[REGSIZE], prev_regs[REGSIZE];
331 1.3 takemura unsigned char* p = (char*)VirtualAlloc(0, 1024, MEM_RESERVE,
332 1.3 takemura PAGE_NOACCESS);
333 1.3 takemura
334 1.3 takemura for (i = 0; i < ARRAYSIZEOF(prev_regs); i++) {
335 1.3 takemura prev_regs[i] = ~0;
336 1.3 takemura }
337 1.3 takemura
338 1.3 takemura res = VirtualCopy((LPVOID)p, (LPVOID)(SIUADDR >> 8), 1024,
339 1.3 takemura PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
340 1.3 takemura if (!res) {
341 1.3 takemura win_printf(TEXT("VirtualCopy() failed."));
342 1.3 takemura }
343 1.3 takemura
344 1.3 takemura while (1) {
345 1.3 takemura flush_XX();
346 1.3 takemura
347 1.3 takemura for (i = 0; i < ARRAYSIZEOF(regs); i++) {
348 1.3 takemura regs[i] = p[REGOFFSET + i];
349 1.3 takemura }
350 1.3 takemura
351 1.3 takemura changed = 0;
352 1.3 takemura for (i = 0; i < ARRAYSIZEOF(regs); i++) {
353 1.3 takemura if (regs[i] != prev_regs[i]) {
354 1.3 takemura changed++;
355 1.3 takemura }
356 1.3 takemura prev_regs[i] = regs[i];
357 1.3 takemura }
358 1.3 takemura if (changed) {
359 1.3 takemura win_printf(TEXT("SIU regs: "));
360 1.3 takemura for (i = 0; i < ARRAYSIZEOF(regs); i++) {
361 1.3 takemura win_printf(TEXT("%02x "), regs[i]);
362 1.3 takemura }
363 1.3 takemura win_printf(TEXT("\n"));
364 1.3 takemura }
365 1.3 takemura }
366 1.3 takemura
367 1.3 takemura VirtualFree(p, 0, MEM_RELEASE);
368 1.3 takemura }
369 1.3 takemura
370 1.3 takemura static long
371 1.3 takemura checksum(char* addr, int size)
372 1.3 takemura {
373 1.3 takemura long sum = 0;
374 1.3 takemura int i;
375 1.3 takemura
376 1.3 takemura for (i = 0; i < size; i++) {
377 1.3 takemura sum += *addr++ * i;
378 1.3 takemura }
379 1.3 takemura return (sum);
380 1.3 takemura }
381 1.3 takemura
382 1.3 takemura static int
383 1.3 takemura examine(char* addr, int size)
384 1.3 takemura {
385 1.3 takemura long random_data[256];
386 1.3 takemura long dijest;
387 1.3 takemura int i;
388 1.3 takemura
389 1.3 takemura for (i = 0; i < ARRAYSIZEOF(random_data); i++) {
390 1.3 takemura random_data[i] = Random();
391 1.3 takemura }
392 1.3 takemura if (sizeof(random_data) < size) {
393 1.3 takemura size = sizeof(random_data);
394 1.3 takemura }
395 1.3 takemura memcpy(addr, (char*)random_data, size);
396 1.3 takemura dijest= checksum((char*)random_data, size);
397 1.3 takemura
398 1.3 takemura return (dijest == checksum(addr, size));
399 1.3 takemura }
400 1.3 takemura
401 1.3 takemura void
402 1.3 takemura display_search()
403 1.3 takemura {
404 1.3 takemura int step = 0x10000;
405 1.3 takemura int i;
406 1.3 takemura long addr;
407 1.3 takemura
408 1.3 takemura for (i = 0; i < ntargets; i++) {
409 1.3 takemura int prevres = -1;
410 1.3 takemura for (addr = targets[i].start;
411 1.3 takemura addr < targets[i].end;
412 1.3 takemura addr += step) {
413 1.3 takemura int res;
414 1.3 takemura char* p = (char*)VirtualAlloc(0, step, MEM_RESERVE,
415 1.3 takemura PAGE_NOACCESS);
416 1.3 takemura res = VirtualCopy((LPVOID)p, (LPVOID)(addr >> 8), step,
417 1.3 takemura PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
418 1.3 takemura if (!res) {
419 1.3 takemura win_printf(TEXT("VirtualCopy() failed."));
420 1.3 takemura }
421 1.3 takemura res = examine(p, step);
422 1.3 takemura VirtualFree(p, 0, MEM_RELEASE);
423 1.3 takemura if (res != prevres && prevres != -1) {
424 1.3 takemura if (res) {
425 1.3 takemura win_printf(TEXT("0x%x "), addr);
426 1.3 takemura } else {
427 1.3 takemura win_printf(TEXT("- 0x%x\n"), addr);
428 1.3 takemura }
429 1.3 takemura } else
430 1.3 takemura if (res && prevres == -1) {
431 1.3 takemura win_printf(TEXT("0x%x "), addr);
432 1.3 takemura }
433 1.3 takemura prevres = res;
434 1.3 takemura }
435 1.3 takemura if (prevres) {
436 1.3 takemura win_printf(TEXT("\n"));
437 1.3 takemura }
438 1.3 takemura }
439 1.3 takemura }
440 1.3 takemura
441 1.3 takemura void
442 1.3 takemura display_draw()
443 1.3 takemura {
444 1.3 takemura long addr = 0x13000000;
445 1.3 takemura int size = 0x40000;
446 1.3 takemura char* p;
447 1.3 takemura int i, j, res;
448 1.3 takemura int x, y;
449 1.3 takemura
450 1.3 takemura p = (char*)VirtualAlloc(0, size, MEM_RESERVE,
451 1.3 takemura PAGE_NOACCESS);
452 1.3 takemura res = VirtualCopy((LPVOID)p, (LPVOID)(addr >> 8), size,
453 1.3 takemura PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
454 1.3 takemura if (!res) {
455 1.3 takemura win_printf(TEXT("VirtualCopy() failed."));
456 1.3 takemura }
457 1.3 takemura
458 1.3 takemura for (i = 0; i < 10000; i++) {
459 1.3 takemura p[i] = i;
460 1.3 takemura }
461 1.3 takemura for (x = 0; x < 640; x += 10) {
462 1.3 takemura for (y = 0; y < 240; y += 1) {
463 1.3 takemura p[1024 * y + x] = (char)0xff;
464 1.3 takemura }
465 1.3 takemura }
466 1.3 takemura for (y = 0; y < 240; y += 10) {
467 1.3 takemura for (x = 0; x < 640; x += 1) {
468 1.3 takemura p[1024 * y + x] = (char)0xff;
469 1.3 takemura }
470 1.3 takemura }
471 1.3 takemura for (i = 0; i < 16; i++) {
472 1.3 takemura for (j = 0; j < 16; j++) {
473 1.3 takemura for (x = i * 32; x < i * 32 + 32; x++) {
474 1.3 takemura for (y = j * 15; y < j * 15 + 15; y++) {
475 1.3 takemura p[1024 * y + x] = j * 16 + i;
476 1.3 takemura }
477 1.3 takemura }
478 1.3 takemura }
479 1.3 takemura }
480 1.3 takemura
481 1.3 takemura VirtualFree(p, 0, MEM_RELEASE);
482 1.3 takemura }
483 1.3 takemura
484 1.3 takemura #define PCIC_IDENT 0x00
485 1.3 takemura #define PCIC_REG_INDEX 0
486 1.3 takemura #define PCIC_REG_DATA 1
487 1.3 takemura #define PCIC_IDENT_EXPECTED 0x83
488 1.3 takemura
489 1.3 takemura void
490 1.3 takemura pcic_search()
491 1.3 takemura {
492 1.3 takemura long addr;
493 1.3 takemura int window_size = 0x10000;
494 1.3 takemura int i;
495 1.3 takemura
496 1.3 takemura for (addr = 0x14000000; addr < 0x18000000; addr += window_size) {
497 1.3 takemura int res;
498 1.3 takemura unsigned char* p;
499 1.3 takemura p = (char*)VirtualAlloc(0, window_size, MEM_RESERVE,
500 1.3 takemura PAGE_NOACCESS);
501 1.3 takemura res = VirtualCopy((LPVOID)p, (LPVOID)(addr >> 8), window_size,
502 1.3 takemura PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
503 1.3 takemura if (!res) {
504 1.3 takemura win_printf(TEXT("VirtualCopy() failed."));
505 1.3 takemura }
506 1.3 takemura
507 1.3 takemura for (i = 0; i < window_size; i += 2) {
508 1.3 takemura p[i + PCIC_REG_INDEX] = PCIC_IDENT;
509 1.3 takemura if (p[i + PCIC_REG_DATA] == PCIC_IDENT_EXPECTED) {
510 1.3 takemura win_printf(TEXT("pcic is found at 0x%x\n"),
511 1.3 takemura addr + i);
512 1.3 takemura }
513 1.3 takemura }
514 1.3 takemura
515 1.3 takemura VirtualFree(p, 0, MEM_RELEASE);
516 1.3 takemura }
517 1.3 takemura }
518 1.3 takemura
519 1.3 takemura void
520 1.3 takemura hardware_test()
521 1.3 takemura {
522 1.3 takemura int do_gpio_test = 0;
523 1.4 takemura int do_register_test = 0;
524 1.3 takemura int do_serial_test = 0;
525 1.3 takemura int do_display_draw = 0;
526 1.3 takemura int do_display_search = 0;
527 1.3 takemura int do_pcic_search = 0;
528 1.4 takemura int do_dump_memory = 0;
529 1.3 takemura
530 1.3 takemura if (do_gpio_test) {
531 1.3 takemura gpio_test();
532 1.3 takemura }
533 1.4 takemura if (do_register_test) {
534 1.4 takemura register_test();
535 1.4 takemura }
536 1.3 takemura if (do_serial_test) {
537 1.3 takemura serial_test();
538 1.3 takemura }
539 1.3 takemura if (do_display_draw) {
540 1.3 takemura display_draw();
541 1.3 takemura }
542 1.3 takemura if (do_display_search) {
543 1.3 takemura display_search();
544 1.3 takemura }
545 1.3 takemura if (do_pcic_search) {
546 1.3 takemura pcic_search();
547 1.4 takemura }
548 1.4 takemura if (do_dump_memory) {
549 1.4 takemura dump_memory();
550 1.3 takemura }
551 1.3 takemura }
552