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