update license in source code itself
[libpicofe.git] / gp2x / soc.c
CommitLineData
f89d8471 1/*
2 * (C) GraÅžvydas "notaz" Ignotas, 2009-2010
3 *
4 * This work is licensed under the terms of any of these licenses
5 * (at your option):
6 * - GNU GPL, version 2 or later.
7 * - GNU LGPL, version 2.1 or later.
8 * - MAME license.
9 * See the COPYING file in the top-level directory.
10 */
11
d572cbad 12#include <stdio.h>
13#include <string.h>
14#include <sys/types.h>
15#include <sys/stat.h>
16#include <fcntl.h>
17#include <sys/mman.h>
18#include <unistd.h>
19
20#include "soc.h"
fa8d1331 21
22void (*gp2x_video_flip)(void);
23void (*gp2x_video_flip2)(void);
24void (*gp2x_video_changemode_ll)(int bpp);
25void (*gp2x_video_setpalette)(int *pal, int len);
26void (*gp2x_video_RGB_setscaling)(int ln_offs, int W, int H);
27void (*gp2x_video_wait_vsync)(void);
28
29void (*gp2x_set_cpuclk)(unsigned int mhz);
30
31void (*set_lcd_custom_rate)(int is_pal);
32void (*unset_lcd_custom_rate)(void);
33void (*set_lcd_gamma)(int g100, int A_SNs_curve);
34
35void (*set_ram_timings)(void);
36void (*unset_ram_timings)(void);
053bef76 37int (*gp2x_read_battery)(void);
fa8d1331 38
b5bfb864 39unsigned int (*gp2x_get_ticks_ms)(void);
40unsigned int (*gp2x_get_ticks_us)(void);
41
d572cbad 42
d572cbad 43gp2x_soc_t soc_detect(void)
44{
45 volatile unsigned short *memregs;
46 volatile unsigned int *memregl;
1eb704b6 47 static gp2x_soc_t ret = -2;
d572cbad 48 int pollux_chipname[0x30/4 + 1];
49 char *pollux_chipname_c = (char *)pollux_chipname;
d572cbad 50 int memdev;
51 int i;
52
b6072c17 53 if ((int)ret != -2)
fa5e045b 54 /* already detected */
55 return ret;
56
d572cbad 57 memdev = open("/dev/mem", O_RDONLY);
58 if (memdev == -1)
59 {
60 perror("open(/dev/mem)");
1eb704b6 61 ret = -1;
d572cbad 62 return -1;
63 }
64
65 memregs = mmap(0, 0x20000, PROT_READ, MAP_SHARED, memdev, 0xc0000000);
66 if (memregs == MAP_FAILED)
67 {
68 perror("mmap(memregs)");
69 close(memdev);
1eb704b6 70 ret = -1;
d572cbad 71 return -1;
72 }
73 memregl = (volatile void *)memregs;
74
75 if (memregs[0x1836>>1] == 0x2330)
76 {
77 printf("looks like this is MMSP2\n");
78 ret = SOCID_MMSP2;
79 goto out;
80 }
81
82 /* perform word reads. Byte reads might also work,
83 * but we don't want to play with that. */
84 for (i = 0; i < 0x30; i += 4)
85 {
86 pollux_chipname[i >> 2] = memregl[(0x1f810 + i) >> 2];
87 }
88 pollux_chipname_c[0x30] = 0;
89
90 for (i = 0; i < 0x30; i++)
91 {
92 unsigned char c = pollux_chipname_c[i];
93 if (c < 0x20 || c > 0x7f)
94 goto not_pollux_like;
95 }
96
97 printf("found pollux-like id: \"%s\"\n", pollux_chipname_c);
98
99 if (strncmp(pollux_chipname_c, "MAGICEYES-LEAPFROG-LF1000", 25) ||
100 strncmp(pollux_chipname_c, "MAGICEYES-POLLUX", 16))
101 {
102 ret = SOCID_POLLUX;
103 goto out;
104 }
105
106not_pollux_like:
107out:
108 munmap((void *)memregs, 0x20000);
109 close(memdev);
d572cbad 110 return ret;
111}
112