Home | History | Annotate | Line # | Download | only in pbsdboot
      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]&regs[7], regs[4]&regs[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