59b5dec76138d74506d3a9ec1162c227d20090b5
[ginge.git] / loader / host_wiz.c
1 // vim:shiftwidth=2:expandtab
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #include <unistd.h>
6 #include <sys/mman.h>
7 #include <linux/input.h>
8
9 #include "../common/warm/warm.h"
10
11 extern int memdev, probably_caanoo; // leasing from wiz_video
12
13 #define BTN_JOY BTN_JOYSTICK
14
15 struct in_default_bind in_evdev_defbinds[] = {
16   { KEY_UP,       IN_BINDTYPE_PLAYER12, GP2X_UP },
17   { KEY_DOWN,     IN_BINDTYPE_PLAYER12, GP2X_DOWN },
18   { KEY_LEFT,     IN_BINDTYPE_PLAYER12, GP2X_LEFT },
19   { KEY_RIGHT,    IN_BINDTYPE_PLAYER12, GP2X_RIGHT },
20   { BTN_JOY + 0,  IN_BINDTYPE_PLAYER12, GP2X_A },
21   { BTN_JOY + 1,  IN_BINDTYPE_PLAYER12, GP2X_X },
22   { BTN_JOY + 2,  IN_BINDTYPE_PLAYER12, GP2X_B },
23   { BTN_JOY + 3,  IN_BINDTYPE_PLAYER12, GP2X_Y },
24   { BTN_JOY + 4,  IN_BINDTYPE_PLAYER12, GP2X_L },
25   { BTN_JOY + 5,  IN_BINDTYPE_PLAYER12, GP2X_R },
26   { BTN_JOY + 8,  IN_BINDTYPE_PLAYER12, GP2X_START },
27   { BTN_JOY + 9,  IN_BINDTYPE_PLAYER12, GP2X_SELECT },
28   { BTN_JOY + 10, IN_BINDTYPE_PLAYER12, GP2X_PUSH },
29   { BTN_JOY + 6,  IN_BINDTYPE_EMU, 0 },
30   { 0, 0, 0 }
31 };
32
33 // todo: rm when generic code works on Wiz
34 #if 0
35 static int gpiodev = -1;
36
37 int host_init(void)
38 {
39   gpiodev = open("/dev/GPIO", O_RDONLY);
40   if (gpiodev < 0)
41     perror(PFX "couldn't open /dev/GPIO");
42
43   return 0;
44 }
45
46 int host_read_btns(void)
47 {
48   int r, value = 0;
49
50   r = read(gpiodev, &value, 4);
51   if (value & 0x02)
52     value |= 0x05;
53   if (value & 0x08)
54     value |= 0x14;
55   if (value & 0x20)
56     value |= 0x50;
57   if (value & 0x80)
58     value |= 0x41;
59
60   return value;
61 }
62 #endif
63
64 void *host_mmap_upper(void)
65 {
66   void *ret;
67   int r;
68
69   // make sure this never happens on Caanoo
70   if (probably_caanoo) {
71     err("Wiz mmap code called on Caanoo?");
72     return MAP_FAILED;
73   }
74
75   // Wiz                GP2X
76   // <linux mem>        03460000-03ffffff  00ba0000
77   // 02aa0000-02dfffff  03100000-0345ffff  00360000
78   // <linux mem>        03000000-030fffff  00100000
79   // 03000000-03ffffff  02000000-02ffffff  01000000
80   ret = mmap((void *)0x82000000, 0x1000000, PROT_READ|PROT_WRITE|PROT_EXEC,
81              MAP_SHARED|MAP_FIXED, memdev, 0x3000000);
82   if (ret != (void *)0x82000000)
83     goto fail;
84
85   ret = mmap((void *)0x83000000, 0x100000, PROT_READ|PROT_WRITE|PROT_EXEC,
86              MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
87   if (ret != (void *)0x83000000)
88     goto fail;
89
90   ret = mmap((void *)0x83100000, 0x360000, PROT_READ|PROT_WRITE|PROT_EXEC,
91              MAP_SHARED|MAP_FIXED, memdev, 0x2aa0000);
92   if (ret != (void *)0x83100000)
93     goto fail;
94
95   ret = mmap((void *)0x83460000, 0xba0000, PROT_READ|PROT_WRITE|PROT_EXEC,
96              MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
97   if (ret != (void *)0x83460000)
98     goto fail;
99
100   r  = warm_change_cb_range(WCB_B_BIT|WCB_C_BIT, 1, (void *)0x82000000, 0x1000000);
101   r |= warm_change_cb_range(WCB_B_BIT|WCB_C_BIT, 1, (void *)0x83100000, 0x360000);
102   if (r != 0)
103     err("could not make upper mem cacheable.\n");
104
105   return (void *)0x82000000;
106
107 fail:
108   err("mmap %p: ", ret);
109   perror(NULL);
110   exit(1);
111 }
112
113 static void host_actions(int actions[IN_BINDTYPE_COUNT])
114 {
115   if (probably_caanoo && (actions[IN_BINDTYPE_EMU] & 1)) {
116     // 'home key as Fn' handling
117     int act = actions[IN_BINDTYPE_PLAYER12];
118     if (act & (1 << GP2X_START)) {
119       act &= ~(1 << GP2X_START);
120       act |=   1 << GP2X_VOL_UP;
121     }
122     if (act & (1 << GP2X_SELECT)) {
123       act &= ~(1 << GP2X_SELECT);
124       act |=   1 << GP2X_VOL_DOWN;
125     }
126     if (act & (1 << GP2X_Y))
127       host_forced_exit();
128     actions[IN_BINDTYPE_PLAYER12] = act;
129   }
130 }