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