X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=ginge.git;a=blobdiff_plain;f=loader%2Fhost_wiz.c;fp=loader%2Fhost_wiz.c;h=dccd8416618ca1a6cace84a5dce65c4d2beac3e4;hp=0000000000000000000000000000000000000000;hb=4d0451847a77d420284c7fb0f50b1f167c1118ee;hpb=ed233fce977d411ce024631668f1488d0d078d19 diff --git a/loader/host_wiz.c b/loader/host_wiz.c new file mode 100644 index 0000000..dccd841 --- /dev/null +++ b/loader/host_wiz.c @@ -0,0 +1,83 @@ +// vim:shiftwidth=2:expandtab +#include +#include +#include +#include +#include + +#include "header.h" +#include "../common/warm.h" +#include "realfuncs.h" + +static int gpiodev = -1; +extern int memdev; // leasing from wiz_video + +int host_init(void) +{ + gpiodev = open("/dev/GPIO", O_RDONLY); + if (gpiodev < 0) + perror(PFX "couldn't open /dev/GPIO"); + + return 0; +} + +int host_read_btns(void) +{ + int r, value = 0; + + r = read(gpiodev, &value, 4); + if (value & 0x02) + value |= 0x05; + if (value & 0x08) + value |= 0x14; + if (value & 0x20) + value |= 0x50; + if (value & 0x80) + value |= 0x41; + + return value; +} + +void *host_mmap_upper(void) +{ + void *ret; + int r; + + // Wiz GP2X + // 03460000-03ffffff 00ba0000 + // 02aa0000-02dfffff 03100000-0345ffff 00360000 + // 03000000-030fffff 00100000 + // 03000000-03ffffff 02000000-02ffffff 01000000 + ret = mmap((void *)0x82000000, 0x1000000, PROT_READ|PROT_WRITE|PROT_EXEC, + MAP_SHARED|MAP_FIXED, memdev, 0x3000000); + if (ret != (void *)0x82000000) + goto fail; + + ret = mmap((void *)0x83000000, 0x100000, PROT_READ|PROT_WRITE|PROT_EXEC, + MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0); + if (ret != (void *)0x83000000) + goto fail; + + ret = mmap((void *)0x83100000, 0x360000, PROT_READ|PROT_WRITE|PROT_EXEC, + MAP_SHARED|MAP_FIXED, memdev, 0x2aa0000); + if (ret != (void *)0x83100000) + goto fail; + + ret = mmap((void *)0x83460000, 0xba0000, PROT_READ|PROT_WRITE|PROT_EXEC, + MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0); + if (ret != (void *)0x83460000) + goto fail; + + r = warm_change_cb_range(WCB_B_BIT|WCB_C_BIT, 1, (void *)0x82000000, 0x1000000); + r |= warm_change_cb_range(WCB_B_BIT|WCB_C_BIT, 1, (void *)0x83100000, 0x360000); + if (r != 0) + err("could not make upper mem cacheable.\n"); + + return (void *)0x82000000; + +fail: + err("mmap %p: ", ret); + perror(NULL); + exit(1); +} +