further prep for Wiz port. Cleanups, rm cpuctrl mmuhack; add warm
[libpicofe.git] / gp2x / soc.c
CommitLineData
d572cbad 1#include <stdio.h>
2#include <string.h>
3#include <sys/types.h>
4#include <sys/stat.h>
5#include <fcntl.h>
6#include <sys/mman.h>
7#include <unistd.h>
8
9#include "soc.h"
10#include "../common/emu.h"
11
d572cbad 12gp2x_soc_t soc_detect(void)
13{
14 volatile unsigned short *memregs;
15 volatile unsigned int *memregl;
fa5e045b 16 static gp2x_soc_t ret = -1;
d572cbad 17 int pollux_chipname[0x30/4 + 1];
18 char *pollux_chipname_c = (char *)pollux_chipname;
d572cbad 19 int memdev;
20 int i;
21
fa5e045b 22 if (ret != -1)
23 /* already detected */
24 return ret;
25
d572cbad 26 memdev = open("/dev/mem", O_RDONLY);
27 if (memdev == -1)
28 {
29 perror("open(/dev/mem)");
30 return -1;
31 }
32
33 memregs = mmap(0, 0x20000, PROT_READ, MAP_SHARED, memdev, 0xc0000000);
34 if (memregs == MAP_FAILED)
35 {
36 perror("mmap(memregs)");
37 close(memdev);
38 return -1;
39 }
40 memregl = (volatile void *)memregs;
41
42 if (memregs[0x1836>>1] == 0x2330)
43 {
44 printf("looks like this is MMSP2\n");
45 ret = SOCID_MMSP2;
46 goto out;
47 }
48
49 /* perform word reads. Byte reads might also work,
50 * but we don't want to play with that. */
51 for (i = 0; i < 0x30; i += 4)
52 {
53 pollux_chipname[i >> 2] = memregl[(0x1f810 + i) >> 2];
54 }
55 pollux_chipname_c[0x30] = 0;
56
57 for (i = 0; i < 0x30; i++)
58 {
59 unsigned char c = pollux_chipname_c[i];
60 if (c < 0x20 || c > 0x7f)
61 goto not_pollux_like;
62 }
63
64 printf("found pollux-like id: \"%s\"\n", pollux_chipname_c);
65
66 if (strncmp(pollux_chipname_c, "MAGICEYES-LEAPFROG-LF1000", 25) ||
67 strncmp(pollux_chipname_c, "MAGICEYES-POLLUX", 16))
68 {
69 ret = SOCID_POLLUX;
70 goto out;
71 }
72
73not_pollux_like:
74out:
75 munmap((void *)memregs, 0x20000);
76 close(memdev);
d572cbad 77 return ret;
78}
79