disptest.c revision 1.6 1 1.6 cegger /* $NetBSD: disptest.c,v 1.6 2009/03/18 10:22:29 cegger 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.5 takemura extern BOOL SetKMode(BOOL);
41 1.3 takemura #define ARRAYSIZEOF(a) (sizeof(a)/sizeof(*(a)))
42 1.3 takemura
43 1.3 takemura static struct area {
44 1.3 takemura long start, end;
45 1.3 takemura } targets[] = {
46 1.3 takemura { 0x0a000000, 0x0b000000 },
47 1.3 takemura { 0x10000000, 0x14000000 },
48 1.3 takemura };
49 1.3 takemura int ntargets = ARRAYSIZEOF(targets);
50 1.3 takemura
51 1.3 takemura void
52 1.6 cegger flush_XX(void)
53 1.3 takemura {
54 1.3 takemura static volatile unsigned char tmp[1024*64];
55 1.3 takemura int i, s;
56 1.3 takemura
57 1.3 takemura for (i = 0; i < ARRAYSIZEOF(tmp); i++) {
58 1.3 takemura s += tmp[i];
59 1.3 takemura }
60 1.3 takemura }
61 1.3 takemura
62 1.3 takemura static void
63 1.6 cegger gpio_test(void)
64 1.3 takemura {
65 1.3 takemura #define GIUBASE 0xab000000
66 1.3 takemura #define GIUOFFSET 0x0100
67 1.3 takemura volatile unsigned short *giusell;
68 1.3 takemura volatile unsigned short *giuselh;
69 1.3 takemura volatile unsigned short *giupiodl;
70 1.3 takemura volatile unsigned short *giupiodh;
71 1.3 takemura unsigned short sell = 0;
72 1.3 takemura unsigned short selh = 0;
73 1.3 takemura unsigned short piodl = 0;
74 1.3 takemura unsigned short piodh = 0;
75 1.3 takemura int res, i;
76 1.3 takemura unsigned short regs[16];
77 1.3 takemura unsigned short prev_regs[16];
78 1.3 takemura
79 1.3 takemura unsigned char* p = (char*)VirtualAlloc(0, 1024, MEM_RESERVE,
80 1.3 takemura PAGE_NOACCESS);
81 1.3 takemura res = VirtualCopy((LPVOID)p, (LPVOID)(GIUBASE >> 8), 1024,
82 1.3 takemura PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
83 1.3 takemura if (!res) {
84 1.3 takemura win_printf(TEXT("VirtualCopy() failed."));
85 1.3 takemura }
86 1.3 takemura
87 1.3 takemura for (i = 0; i < 16; i++) {
88 1.3 takemura prev_regs[i] = ~0;
89 1.3 takemura }
90 1.3 takemura
91 1.3 takemura giusell = (unsigned short*)(p + GIUOFFSET + 0);
92 1.3 takemura giuselh = (unsigned short*)(p + GIUOFFSET + 2);
93 1.3 takemura giupiodl = (unsigned short*)(p + GIUOFFSET + 4);
94 1.3 takemura giupiodh = (unsigned short*)(p + GIUOFFSET + 6);
95 1.3 takemura
96 1.3 takemura while (1) {
97 1.3 takemura sell = *giusell;
98 1.3 takemura selh = *giuselh;
99 1.3 takemura *giusell = sell;
100 1.3 takemura *giuselh = selh;
101 1.3 takemura
102 1.3 takemura piodl = *giupiodl;
103 1.3 takemura piodh = *giupiodh;
104 1.3 takemura *giupiodl = piodl;
105 1.3 takemura *giupiodh = piodh;
106 1.3 takemura for (i = 0; i < 16; i++) {
107 1.3 takemura regs[i] = *(unsigned short*)(p + GIUOFFSET + i * 2);
108 1.3 takemura }
109 1.3 takemura for (i = 0; i < 16; i++) {
110 1.3 takemura if (i != 3 && i != 5 && regs[i] != prev_regs[i]) {
111 1.3 takemura win_printf(TEXT("IOSEL=%04x%04x "),
112 1.3 takemura regs[1], regs[0]);
113 1.3 takemura win_printf(TEXT("PIOD=%04x%04x "),
114 1.3 takemura regs[3], regs[2]);
115 1.3 takemura win_printf(TEXT("STAT=%04x%04x "),
116 1.3 takemura regs[5], regs[4]);
117 1.3 takemura win_printf(TEXT("(%04x%04x) "),
118 1.3 takemura regs[5]®s[7], regs[4]®s[6]);
119 1.3 takemura win_printf(TEXT("EN=%04x%04x "),
120 1.3 takemura regs[7], regs[6]);
121 1.3 takemura win_printf(TEXT("TYP=%04x%04x "),
122 1.3 takemura regs[9], regs[8]);
123 1.3 takemura win_printf(TEXT("ALSEL=%04x%04x "),
124 1.3 takemura regs[11], regs[10]);
125 1.3 takemura win_printf(TEXT("HTSEL=%04x%04x "),
126 1.3 takemura regs[13], regs[12]);
127 1.3 takemura win_printf(TEXT("PODAT=%04x%04x "),
128 1.3 takemura regs[15], regs[14]);
129 1.3 takemura win_printf(TEXT("\n"));
130 1.3 takemura for (i = 0; i < 16; i++) {
131 1.3 takemura prev_regs[i] = regs[i];
132 1.3 takemura }
133 1.3 takemura break;
134 1.3 takemura }
135 1.3 takemura }
136 1.3 takemura }
137 1.3 takemura }
138 1.3 takemura
139 1.4 takemura static struct regdesc {
140 1.4 takemura TCHAR *name;
141 1.4 takemura int physaddr;
142 1.4 takemura int size;
143 1.4 takemura int mask;
144 1.4 takemura //void *addr;
145 1.4 takemura unsigned long val;
146 1.4 takemura unsigned long preval;
147 1.4 takemura } test_regs[] = {
148 1.4 takemura #if 0
149 1.4 takemura /*
150 1.4 takemura * Vrc4172 GPIO and PWM
151 1.4 takemura */
152 1.4 takemura { TEXT("EXGPDATA0"), 0x15001080, 2, 0xfffd },
153 1.4 takemura { TEXT("EXGPDATA1"), 0x150010c0, 2, 0xffff },
154 1.4 takemura { TEXT("LCDDUTYEN"), 0x15003880, 2, 0xffff },
155 1.4 takemura { TEXT("LCDFREQ"), 0x15003882, 2, 0xffff },
156 1.4 takemura { TEXT("LCDDUTY"), 0x15003884, 2, 0xffff },
157 1.4 takemura #endif
158 1.4 takemura
159 1.4 takemura #if 0
160 1.4 takemura /*
161 1.4 takemura * Vr41xx GPIO
162 1.4 takemura */
163 1.4 takemura { TEXT("GIUPIODL"), 0x0b000104, 2, 0xffff },
164 1.4 takemura { TEXT("GIUPIODH"), 0x0b000106, 2, 0xffff },
165 1.4 takemura { TEXT("GIUPODATL"), 0x0b00011c, 2, 0xffff },
166 1.4 takemura { TEXT("GIUPODATH"), 0x0b00011e, 2, 0xffff },
167 1.4 takemura { TEXT("GIUUSEUPDN"), 0x0b0002e0, 2, 0xffff },
168 1.4 takemura { TEXT("GIUTERMUPDN"), 0x0b0002e2, 2, 0xffff },
169 1.4 takemura #endif
170 1.4 takemura
171 1.4 takemura /*
172 1.4 takemura * MQ200
173 1.4 takemura */
174 1.4 takemura { TEXT("PM00R"), 0x0a600000, 4, 0xffffffff },
175 1.4 takemura { TEXT("PM01R"), 0x0a600004, 4, 0xffffffff },
176 1.4 takemura { TEXT("PM02R"), 0x0a600008, 4, 0xffffffff },
177 1.4 takemura { TEXT("PM06R"), 0x0a600018, 4, 0xffffffff },
178 1.4 takemura { TEXT("PM07R"), 0x0a60001c, 4, 0xffffffff },
179 1.4 takemura
180 1.4 takemura { TEXT("CC00R"), 0x0a602000, 4, 0x0000003f },
181 1.4 takemura { TEXT("CC01R"), 0x0a602004, 4, 0x00000000 },
182 1.4 takemura
183 1.4 takemura { TEXT("MM00R"), 0x0a604000, 4, 0x00000007 },
184 1.4 takemura { TEXT("MM01R"), 0x0a604004, 4, 0xffffffff },
185 1.4 takemura { TEXT("MM02R"), 0x0a604008, 4, 0xffffffff },
186 1.4 takemura { TEXT("MM03R"), 0x0a60400c, 4, 0x00000001 },
187 1.4 takemura { TEXT("MM04R"), 0x0a604010, 4, 0x00000001 },
188 1.4 takemura
189 1.4 takemura { TEXT("IN00R"), 0x0a608000, 4, 0x0000001f },
190 1.4 takemura { TEXT("IN01R"), 0x0a608004, 4, 0x0000ffff },
191 1.4 takemura { TEXT("IN02R"), 0x0a608008, 4, 0x00000000 },
192 1.4 takemura { TEXT("IN03R"), 0x0a60800c, 4, 0x00000000 },
193 1.4 takemura
194 1.4 takemura { TEXT("GC00R"), 0x0a60a000, 4, 0xfffff9ff },
195 1.4 takemura { TEXT("GC01R"), 0x0a60a004, 4, 0x10ffffff },
196 1.4 takemura { TEXT("GC20R"), 0x0a60a080, 4, 0xffffffff },
197 1.4 takemura { TEXT("GC21R"), 0x0a60a084, 4, 0x0000007f },
198 1.4 takemura
199 1.4 takemura { TEXT("FP00R"), 0x0a60e000, 4, 0xffffffff },
200 1.4 takemura { TEXT("FP01R"), 0x0a60e004, 4, 0xffffffff },
201 1.4 takemura { TEXT("FP02R"), 0x0a60e008, 4, 0x007fffff },
202 1.4 takemura { TEXT("FP03R"), 0x0a60e00c, 4, 0x0707003f },
203 1.4 takemura { TEXT("FP04R"), 0x0a60e010, 4, 0xffff3fff },
204 1.4 takemura { TEXT("FP05R"), 0x0a60e014, 4, 0xffffffff },
205 1.4 takemura { TEXT("FP0FR"), 0x0a60e03c, 4, 0xffffffff },
206 1.4 takemura
207 1.4 takemura { TEXT("DC00R"), 0x0a614000, 4, 0xffffffff },
208 1.4 takemura { TEXT("DC01R"), 0x0a614004, 4, 0x0000003f },
209 1.4 takemura { TEXT("DC02R"), 0x0a614008, 4, 0xffffffff },
210 1.4 takemura { TEXT("DC03R"), 0x0a61400c, 4, 0xffffffff },
211 1.4 takemura
212 1.4 takemura { TEXT("PC00R"), 0x0a616000, 4, 0xffffffff },
213 1.4 takemura { TEXT("PC04R"), 0x0a616004, 4, 0xffffffff },
214 1.4 takemura { TEXT("PC08R"), 0x0a616008, 4, 0xffffffff },
215 1.4 takemura { TEXT("PC0CR"), 0x0a61600c, 4, 0xffffffff },
216 1.4 takemura { TEXT("PC10R"), 0x0a616010, 4, 0xffffffff },
217 1.4 takemura { TEXT("PC14R"), 0x0a616014, 4, 0xffffffff },
218 1.4 takemura { TEXT("PC2CR"), 0x0a61602c, 4, 0xffffffff },
219 1.4 takemura { TEXT("PC3CR"), 0x0a61603c, 4, 0xffffffff },
220 1.4 takemura { TEXT("PC40R"), 0x0a616040, 4, 0xffffffff },
221 1.4 takemura { TEXT("PC44R"), 0x0a616044, 4, 0x00000003 },
222 1.4 takemura };
223 1.4 takemura
224 1.4 takemura extern int SetKMode(int);
225 1.4 takemura static void
226 1.4 takemura regfetch(struct regdesc* desc)
227 1.4 takemura {
228 1.4 takemura SetKMode(1);
229 1.4 takemura switch (desc->size) {
230 1.4 takemura case 1:
231 1.4 takemura desc->val = *(unsigned char*)(desc->physaddr | 0xa0000000);
232 1.4 takemura break;
233 1.4 takemura case 2:
234 1.4 takemura desc->val = *(unsigned short*)(desc->physaddr | 0xa0000000);
235 1.4 takemura break;
236 1.4 takemura case 4:
237 1.4 takemura desc->val = *(unsigned long*)(desc->physaddr | 0xa0000000);
238 1.4 takemura break;
239 1.4 takemura default:
240 1.4 takemura win_printf(TEXT("Invalid size"));
241 1.4 takemura break;
242 1.4 takemura }
243 1.4 takemura SetKMode(0);
244 1.4 takemura desc->val &= desc->mask;
245 1.4 takemura }
246 1.4 takemura
247 1.4 takemura static void
248 1.6 cegger register_test(void)
249 1.4 takemura {
250 1.4 takemura int i;
251 1.4 takemura int nregs = sizeof(test_regs)/sizeof(*test_regs);
252 1.4 takemura
253 1.4 takemura for (i = 0; i < nregs; i++) {
254 1.4 takemura regfetch(&test_regs[i]);
255 1.4 takemura test_regs[i].preval = test_regs[i].val;
256 1.4 takemura }
257 1.4 takemura
258 1.4 takemura while (1) {
259 1.4 takemura for (i = 0; i < nregs; i++) {
260 1.4 takemura regfetch(&test_regs[i]);
261 1.4 takemura if (test_regs[i].val != test_regs[i].preval) {
262 1.4 takemura win_printf(TEXT("%20s(%08x) %08x -> %08x\n"),
263 1.4 takemura test_regs[i].name,
264 1.4 takemura test_regs[i].physaddr,
265 1.4 takemura test_regs[i].preval,
266 1.4 takemura test_regs[i].val);
267 1.4 takemura test_regs[i].preval = test_regs[i].val;
268 1.4 takemura }
269 1.4 takemura }
270 1.4 takemura Sleep(10); /* 10 msec */
271 1.4 takemura }
272 1.4 takemura }
273 1.4 takemura
274 1.4 takemura static void
275 1.6 cegger dump_memory(void)
276 1.4 takemura {
277 1.4 takemura HANDLE fh = INVALID_HANDLE_VALUE;
278 1.4 takemura #define UNICODE_MEMORY_CARD \
279 1.4 takemura TEXT('\\'), 0xff92, 0xff93, 0xff98, TEXT(' '), 0xff76, 0xff70, \
280 1.4 takemura 0xff84, 0xff9e
281 1.4 takemura TCHAR filename[] = { UNICODE_MEMORY_CARD, TEXT('2'), TEXT('\\'),
282 1.4 takemura TEXT('d'), TEXT('u'), TEXT('m'), TEXT('p'), 0 };
283 1.4 takemura unsigned long *addr;
284 1.4 takemura int found;
285 1.4 takemura
286 1.4 takemura win_printf(TEXT("dump to %s\n"), filename);
287 1.4 takemura fh = CreateFile(
288 1.4 takemura filename, /* file name */
289 1.4 takemura GENERIC_WRITE, /* access (read-write) mode */
290 1.4 takemura FILE_SHARE_WRITE,/* share mode */
291 1.4 takemura NULL, /* pointer to security attributes */
292 1.4 takemura CREATE_ALWAYS, /* how to create */
293 1.4 takemura FILE_ATTRIBUTE_NORMAL, /* file attributes*/
294 1.4 takemura NULL /* handle to file with attributes to */
295 1.4 takemura );
296 1.4 takemura if (fh == INVALID_HANDLE_VALUE) {
297 1.4 takemura return;
298 1.4 takemura }
299 1.4 takemura
300 1.4 takemura for (addr = (unsigned long*)0xbe000000;
301 1.4 takemura addr < (unsigned long*)0xbfffffff;
302 1.4 takemura addr += 2048) {
303 1.4 takemura char buf[2048];
304 1.4 takemura DWORD n;
305 1.4 takemura
306 1.4 takemura SetKMode(1);
307 1.4 takemura memcpy(buf, addr, 2048);
308 1.4 takemura SetKMode(0);
309 1.4 takemura if (WriteFile(fh, buf, 2048, &n, NULL) == 0 ||
310 1.4 takemura n != 2048) {
311 1.4 takemura win_printf(TEXT("dump failed\n"));
312 1.4 takemura break;
313 1.4 takemura }
314 1.4 takemura }
315 1.4 takemura
316 1.4 takemura CloseHandle(fh);
317 1.4 takemura }
318 1.4 takemura
319 1.3 takemura static void
320 1.6 cegger serial_test(void)
321 1.3 takemura {
322 1.3 takemura #if 1
323 1.3 takemura # define SIUADDR 0xac000000
324 1.3 takemura # define REGOFFSET 0x0
325 1.3 takemura #else
326 1.3 takemura # define SIUADDR 0xab000000
327 1.3 takemura # define REGOFFSET 0x1a0
328 1.3 takemura #endif
329 1.3 takemura #define REGSIZE 32
330 1.3 takemura int i, changed, res;
331 1.3 takemura unsigned char regs[REGSIZE], prev_regs[REGSIZE];
332 1.3 takemura unsigned char* p = (char*)VirtualAlloc(0, 1024, MEM_RESERVE,
333 1.3 takemura PAGE_NOACCESS);
334 1.3 takemura
335 1.3 takemura for (i = 0; i < ARRAYSIZEOF(prev_regs); i++) {
336 1.3 takemura prev_regs[i] = ~0;
337 1.3 takemura }
338 1.3 takemura
339 1.3 takemura res = VirtualCopy((LPVOID)p, (LPVOID)(SIUADDR >> 8), 1024,
340 1.3 takemura PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
341 1.3 takemura if (!res) {
342 1.3 takemura win_printf(TEXT("VirtualCopy() failed."));
343 1.3 takemura }
344 1.3 takemura
345 1.3 takemura while (1) {
346 1.3 takemura flush_XX();
347 1.3 takemura
348 1.3 takemura for (i = 0; i < ARRAYSIZEOF(regs); i++) {
349 1.3 takemura regs[i] = p[REGOFFSET + i];
350 1.3 takemura }
351 1.3 takemura
352 1.3 takemura changed = 0;
353 1.3 takemura for (i = 0; i < ARRAYSIZEOF(regs); i++) {
354 1.3 takemura if (regs[i] != prev_regs[i]) {
355 1.3 takemura changed++;
356 1.3 takemura }
357 1.3 takemura prev_regs[i] = regs[i];
358 1.3 takemura }
359 1.3 takemura if (changed) {
360 1.3 takemura win_printf(TEXT("SIU regs: "));
361 1.3 takemura for (i = 0; i < ARRAYSIZEOF(regs); i++) {
362 1.3 takemura win_printf(TEXT("%02x "), regs[i]);
363 1.3 takemura }
364 1.3 takemura win_printf(TEXT("\n"));
365 1.3 takemura }
366 1.3 takemura }
367 1.3 takemura
368 1.3 takemura VirtualFree(p, 0, MEM_RELEASE);
369 1.3 takemura }
370 1.3 takemura
371 1.3 takemura static long
372 1.3 takemura checksum(char* addr, int size)
373 1.3 takemura {
374 1.3 takemura long sum = 0;
375 1.3 takemura int i;
376 1.3 takemura
377 1.3 takemura for (i = 0; i < size; i++) {
378 1.3 takemura sum += *addr++ * i;
379 1.3 takemura }
380 1.3 takemura return (sum);
381 1.3 takemura }
382 1.3 takemura
383 1.3 takemura static int
384 1.3 takemura examine(char* addr, int size)
385 1.3 takemura {
386 1.3 takemura long random_data[256];
387 1.3 takemura long dijest;
388 1.3 takemura int i;
389 1.3 takemura
390 1.3 takemura for (i = 0; i < ARRAYSIZEOF(random_data); i++) {
391 1.3 takemura random_data[i] = Random();
392 1.3 takemura }
393 1.3 takemura if (sizeof(random_data) < size) {
394 1.3 takemura size = sizeof(random_data);
395 1.3 takemura }
396 1.3 takemura memcpy(addr, (char*)random_data, size);
397 1.3 takemura dijest= checksum((char*)random_data, size);
398 1.3 takemura
399 1.3 takemura return (dijest == checksum(addr, size));
400 1.3 takemura }
401 1.3 takemura
402 1.3 takemura void
403 1.6 cegger display_search(void)
404 1.3 takemura {
405 1.3 takemura int step = 0x10000;
406 1.3 takemura int i;
407 1.3 takemura long addr;
408 1.3 takemura
409 1.3 takemura for (i = 0; i < ntargets; i++) {
410 1.3 takemura int prevres = -1;
411 1.3 takemura for (addr = targets[i].start;
412 1.3 takemura addr < targets[i].end;
413 1.3 takemura addr += step) {
414 1.3 takemura int res;
415 1.5 takemura #if 0
416 1.3 takemura char* p = (char*)VirtualAlloc(0, step, MEM_RESERVE,
417 1.3 takemura PAGE_NOACCESS);
418 1.3 takemura res = VirtualCopy((LPVOID)p, (LPVOID)(addr >> 8), step,
419 1.3 takemura PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
420 1.3 takemura if (!res) {
421 1.3 takemura win_printf(TEXT("VirtualCopy() failed."));
422 1.3 takemura }
423 1.3 takemura res = examine(p, step);
424 1.3 takemura VirtualFree(p, 0, MEM_RELEASE);
425 1.5 takemura #else
426 1.5 takemura SetKMode(1);
427 1.5 takemura res = examine((char*)((int)addr | 0xa0000000), step);
428 1.5 takemura SetKMode(0);
429 1.5 takemura #endif
430 1.3 takemura if (res != prevres && prevres != -1) {
431 1.3 takemura if (res) {
432 1.3 takemura win_printf(TEXT("0x%x "), addr);
433 1.3 takemura } else {
434 1.3 takemura win_printf(TEXT("- 0x%x\n"), addr);
435 1.3 takemura }
436 1.3 takemura } else
437 1.3 takemura if (res && prevres == -1) {
438 1.3 takemura win_printf(TEXT("0x%x "), addr);
439 1.3 takemura }
440 1.3 takemura prevres = res;
441 1.3 takemura }
442 1.3 takemura if (prevres) {
443 1.3 takemura win_printf(TEXT("\n"));
444 1.3 takemura }
445 1.3 takemura }
446 1.3 takemura }
447 1.3 takemura
448 1.3 takemura void
449 1.6 cegger display_draw(void)
450 1.3 takemura {
451 1.3 takemura long addr = 0x13000000;
452 1.5 takemura int size = 0x80000;
453 1.3 takemura char* p;
454 1.3 takemura int i, j, res;
455 1.3 takemura int x, y;
456 1.5 takemura int stride = 1280;
457 1.3 takemura
458 1.3 takemura p = (char*)VirtualAlloc(0, size, MEM_RESERVE,
459 1.3 takemura PAGE_NOACCESS);
460 1.3 takemura res = VirtualCopy((LPVOID)p, (LPVOID)(addr >> 8), size,
461 1.3 takemura PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
462 1.3 takemura if (!res) {
463 1.3 takemura win_printf(TEXT("VirtualCopy() failed."));
464 1.3 takemura }
465 1.3 takemura
466 1.3 takemura for (i = 0; i < 10000; i++) {
467 1.3 takemura p[i] = i;
468 1.3 takemura }
469 1.3 takemura for (x = 0; x < 640; x += 10) {
470 1.3 takemura for (y = 0; y < 240; y += 1) {
471 1.5 takemura p[stride * y + x] = (char)0xff;
472 1.3 takemura }
473 1.3 takemura }
474 1.3 takemura for (y = 0; y < 240; y += 10) {
475 1.3 takemura for (x = 0; x < 640; x += 1) {
476 1.5 takemura p[stride * y + x] = (char)0xff;
477 1.3 takemura }
478 1.3 takemura }
479 1.3 takemura for (i = 0; i < 16; i++) {
480 1.3 takemura for (j = 0; j < 16; j++) {
481 1.3 takemura for (x = i * 32; x < i * 32 + 32; x++) {
482 1.3 takemura for (y = j * 15; y < j * 15 + 15; y++) {
483 1.5 takemura p[stride * y + x] = j * 16 + i;
484 1.3 takemura }
485 1.3 takemura }
486 1.3 takemura }
487 1.3 takemura }
488 1.3 takemura
489 1.3 takemura VirtualFree(p, 0, MEM_RELEASE);
490 1.3 takemura }
491 1.3 takemura
492 1.3 takemura #define PCIC_IDENT 0x00
493 1.3 takemura #define PCIC_REG_INDEX 0
494 1.3 takemura #define PCIC_REG_DATA 1
495 1.3 takemura #define PCIC_IDENT_EXPECTED 0x83
496 1.3 takemura
497 1.3 takemura void
498 1.6 cegger pcic_search(void)
499 1.3 takemura {
500 1.3 takemura long addr;
501 1.3 takemura int window_size = 0x10000;
502 1.3 takemura int i;
503 1.3 takemura
504 1.3 takemura for (addr = 0x14000000; addr < 0x18000000; addr += window_size) {
505 1.3 takemura int res;
506 1.3 takemura unsigned char* p;
507 1.3 takemura p = (char*)VirtualAlloc(0, window_size, MEM_RESERVE,
508 1.3 takemura PAGE_NOACCESS);
509 1.3 takemura res = VirtualCopy((LPVOID)p, (LPVOID)(addr >> 8), window_size,
510 1.3 takemura PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
511 1.3 takemura if (!res) {
512 1.3 takemura win_printf(TEXT("VirtualCopy() failed."));
513 1.3 takemura }
514 1.3 takemura
515 1.3 takemura for (i = 0; i < window_size; i += 2) {
516 1.3 takemura p[i + PCIC_REG_INDEX] = PCIC_IDENT;
517 1.3 takemura if (p[i + PCIC_REG_DATA] == PCIC_IDENT_EXPECTED) {
518 1.3 takemura win_printf(TEXT("pcic is found at 0x%x\n"),
519 1.3 takemura addr + i);
520 1.3 takemura }
521 1.3 takemura }
522 1.3 takemura
523 1.3 takemura VirtualFree(p, 0, MEM_RELEASE);
524 1.3 takemura }
525 1.3 takemura }
526 1.3 takemura
527 1.5 takemura #define VRPCIU_CONFA (*(u_int32_t*)0xaf000c18)
528 1.5 takemura #define VRPCIU_CONFD (*(u_int32_t*)0xaf000c14)
529 1.5 takemura
530 1.5 takemura void
531 1.6 cegger pci_dump(void)
532 1.5 takemura {
533 1.5 takemura int mode, i;
534 1.5 takemura BOOL SetKMode(BOOL);
535 1.5 takemura int bus, dev;
536 1.5 takemura u_int32_t addr, val;
537 1.5 takemura u_int32_t addrs[] = {
538 1.5 takemura 0x00000800,
539 1.5 takemura 0x00001000,
540 1.5 takemura 0x00002000,
541 1.5 takemura 0x00004000,
542 1.5 takemura 0x00008000,
543 1.5 takemura 0x00010000,
544 1.5 takemura 0x00020000,
545 1.5 takemura 0x00040000,
546 1.5 takemura 0x00080000,
547 1.5 takemura 0x00100000,
548 1.5 takemura 0x00200000,
549 1.5 takemura 0x00400000,
550 1.5 takemura 0x00800000,
551 1.5 takemura 0x01000000,
552 1.5 takemura 0x02000000,
553 1.5 takemura 0x04000000,
554 1.5 takemura 0x08000000,
555 1.5 takemura 0x10000000,
556 1.5 takemura 0x20000000,
557 1.5 takemura 0x40000000,
558 1.5 takemura 0x80000000,
559 1.5 takemura };
560 1.5 takemura
561 1.5 takemura #if 0 /* You can find Vrc4173 BCU at 0xb6010000 on Sigmarion II */
562 1.5 takemura win_printf(TEXT("Vrc4173 CMUCLKMSK: %04X\n"),
563 1.5 takemura *(u_int16_t*)0xb6010040);
564 1.5 takemura win_printf(TEXT("Vrc4173 CMUSRST: %04X\n"),
565 1.5 takemura *(u_int16_t*)0xb6010042);
566 1.5 takemura
567 1.5 takemura /* enable CARDU clock */
568 1.5 takemura *(u_int16_t*)0xb6010042 = 0x0006; /* enable CARD1RST and CARD2RST */
569 1.5 takemura *(u_int16_t*)0xb6010040 = *(u_int16_t*)0xb6010040 | 0x00c0;
570 1.5 takemura *(u_int16_t*)0xb6010042 = 0x0000; /* disable CARD1RST and CARD2RST */
571 1.5 takemura
572 1.5 takemura win_printf(TEXT("Vrc4173 CMUCLKMSK: %04X\n"),
573 1.5 takemura *(u_int16_t*)0xb6010040);
574 1.5 takemura win_printf(TEXT("Vrc4173 CMUSRST: %04X\n"),
575 1.5 takemura *(u_int16_t*)0xb6010042);
576 1.5 takemura #endif
577 1.5 takemura
578 1.5 takemura for (i = 0; i < sizeof(addrs)/sizeof(*addrs); i++) {
579 1.5 takemura VRPCIU_CONFA = addrs[i];
580 1.5 takemura val = VRPCIU_CONFD;
581 1.5 takemura win_printf(TEXT("%2d: %08X %04X %04X\n"),
582 1.5 takemura i, addrs[i], val & 0xffff, (val >> 16) & 0xffff);
583 1.5 takemura }
584 1.5 takemura
585 1.5 takemura mode = SetKMode(1);
586 1.5 takemura SetKMode(mode);
587 1.5 takemura }
588 1.5 takemura
589 1.3 takemura void
590 1.6 cegger hardware_test(void)
591 1.3 takemura {
592 1.3 takemura int do_gpio_test = 0;
593 1.4 takemura int do_register_test = 0;
594 1.3 takemura int do_serial_test = 0;
595 1.3 takemura int do_display_draw = 0;
596 1.3 takemura int do_display_search = 0;
597 1.3 takemura int do_pcic_search = 0;
598 1.4 takemura int do_dump_memory = 0;
599 1.5 takemura int do_pci_dump = 0;
600 1.3 takemura
601 1.3 takemura if (do_gpio_test) {
602 1.3 takemura gpio_test();
603 1.3 takemura }
604 1.4 takemura if (do_register_test) {
605 1.4 takemura register_test();
606 1.4 takemura }
607 1.3 takemura if (do_serial_test) {
608 1.3 takemura serial_test();
609 1.3 takemura }
610 1.3 takemura if (do_display_draw) {
611 1.3 takemura display_draw();
612 1.3 takemura }
613 1.3 takemura if (do_display_search) {
614 1.3 takemura display_search();
615 1.3 takemura }
616 1.3 takemura if (do_pcic_search) {
617 1.3 takemura pcic_search();
618 1.4 takemura }
619 1.4 takemura if (do_dump_memory) {
620 1.4 takemura dump_memory();
621 1.5 takemura }
622 1.5 takemura if (do_pci_dump) {
623 1.5 takemura pci_dump();
624 1.3 takemura }
625 1.3 takemura }
626