wiz port. Lots of refactoring, some bugfixes
[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
8 #include "header.h"
9 #include "../common/warm.h"
10 #include "realfuncs.h"
11
12 static int gpiodev = -1;
13 extern int memdev; // leasing from wiz_video
14
15 int host_init(void)
16 {
17   gpiodev = open("/dev/GPIO", O_RDONLY);
18   if (gpiodev < 0)
19     perror(PFX "couldn't open /dev/GPIO");
20
21   return 0;
22 }
23
24 int host_read_btns(void)
25 {
26   int r, value = 0;
27
28   r = read(gpiodev, &value, 4);
29   if (value & 0x02)
30     value |= 0x05;
31   if (value & 0x08)
32     value |= 0x14;
33   if (value & 0x20)
34     value |= 0x50;
35   if (value & 0x80)
36     value |= 0x41;
37
38   return value;
39 }
40
41 void *host_mmap_upper(void)
42 {
43   void *ret;
44   int r;
45
46   // Wiz                GP2X
47   // <linux mem>        03460000-03ffffff  00ba0000
48   // 02aa0000-02dfffff  03100000-0345ffff  00360000
49   // <linux mem>        03000000-030fffff  00100000
50   // 03000000-03ffffff  02000000-02ffffff  01000000
51   ret = mmap((void *)0x82000000, 0x1000000, PROT_READ|PROT_WRITE|PROT_EXEC,
52              MAP_SHARED|MAP_FIXED, memdev, 0x3000000);
53   if (ret != (void *)0x82000000)
54     goto fail;
55
56   ret = mmap((void *)0x83000000, 0x100000, PROT_READ|PROT_WRITE|PROT_EXEC,
57              MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
58   if (ret != (void *)0x83000000)
59     goto fail;
60
61   ret = mmap((void *)0x83100000, 0x360000, PROT_READ|PROT_WRITE|PROT_EXEC,
62              MAP_SHARED|MAP_FIXED, memdev, 0x2aa0000);
63   if (ret != (void *)0x83100000)
64     goto fail;
65
66   ret = mmap((void *)0x83460000, 0xba0000, PROT_READ|PROT_WRITE|PROT_EXEC,
67              MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
68   if (ret != (void *)0x83460000)
69     goto fail;
70
71   r  = warm_change_cb_range(WCB_B_BIT|WCB_C_BIT, 1, (void *)0x82000000, 0x1000000);
72   r |= warm_change_cb_range(WCB_B_BIT|WCB_C_BIT, 1, (void *)0x83100000, 0x360000);
73   if (r != 0)
74     err("could not make upper mem cacheable.\n");
75
76   return (void *)0x82000000;
77
78 fail:
79   err("mmap %p: ", ret);
80   perror(NULL);
81   exit(1);
82 }
83