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