add forgotten dist changes
[ginge.git] / loader / host_wiz.c
CommitLineData
4d045184 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>
ad439e71 7#include <linux/input.h>
8
9#include "../common/warm/warm.h"
10
11extern int memdev, probably_caanoo; // leasing from wiz_video
12
13#define BTN_JOY BTN_JOYSTICK
14
15struct 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
4d045184 35static int gpiodev = -1;
4d045184 36
37int 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
46int 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}
ad439e71 62#endif
4d045184 63
64void *host_mmap_upper(void)
65{
66 void *ret;
67 int r;
68
ad439e71 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
4d045184 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
107fail:
108 err("mmap %p: ", ret);
109 perror(NULL);
110 exit(1);
111}
112
ad439e71 113static 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}