Add RGB565 support
[pcsx_rearmed.git] / frontend / plat_pollux.c
index 012d9eb..1dafb7c 100644 (file)
 #include <linux/fb.h>
 #include <sys/mman.h>
 #include <linux/soundcard.h>
+#include <linux/input.h>
 
 #include "common/input.h"
 #include "gp2x/in_gp2x.h"
+#include "linux/in_evdev.h"
 #include "common/menu.h"
 #include "warm/warm.h"
 #include "plugin_lib.h"
@@ -50,7 +52,25 @@ static int psx_offset_x, psx_offset_y, psx_src_width, psx_src_height;
 static int fb_offset_x, fb_offset_y;
 
 static void caanoo_init(void);
+static void wiz_init(void);
+
 
+static const struct in_default_bind in_evdev_defbinds[] = {
+       { KEY_UP,       IN_BINDTYPE_PLAYER12, DKEY_UP },
+       { KEY_DOWN,     IN_BINDTYPE_PLAYER12, DKEY_DOWN },
+       { KEY_LEFT,     IN_BINDTYPE_PLAYER12, DKEY_LEFT },
+       { KEY_RIGHT,    IN_BINDTYPE_PLAYER12, DKEY_RIGHT },
+       { BTN_TOP,      IN_BINDTYPE_PLAYER12, DKEY_TRIANGLE },
+       { BTN_THUMB,    IN_BINDTYPE_PLAYER12, DKEY_CROSS },
+       { BTN_THUMB2,   IN_BINDTYPE_PLAYER12, DKEY_CIRCLE },
+       { BTN_TRIGGER,  IN_BINDTYPE_PLAYER12, DKEY_SQUARE },
+       { BTN_BASE3,    IN_BINDTYPE_PLAYER12, DKEY_START },
+       { BTN_BASE4,    IN_BINDTYPE_PLAYER12, DKEY_SELECT },
+       { BTN_TOP2,     IN_BINDTYPE_PLAYER12, DKEY_L1 },
+       { BTN_PINKIE,   IN_BINDTYPE_PLAYER12, DKEY_R1 },
+       { BTN_BASE,     IN_BINDTYPE_EMU, SACTION_ENTER_MENU },
+       { 0, 0, 0 },
+};
 
 static void *fb_flip(void)
 {
@@ -238,6 +258,7 @@ void plat_video_menu_leave(void)
 
        memset(g_menuscreen_ptr, 0, 320*240 * psx_bpp/8);
        g_menuscreen_ptr = fb_flip();
+       memset(g_menuscreen_ptr, 0, 320*240 * psx_bpp/8);
 }
 
 void *plat_prepare_screenshot(int *w, int *h, int *bpp)
@@ -419,7 +440,7 @@ void *plat_gvideo_set_mode(int *w_, int *h_, int *bpp_)
        }
        fb_offset_y = 240/2 - h / 2;
 
-       psx_offset_x = poff_w;
+       psx_offset_x = poff_w * psx_bpp/8 / 2;
        psx_offset_y = poff_h;
        psx_src_width = w;
        psx_src_height = h;
@@ -443,7 +464,7 @@ void *plat_gvideo_set_mode(int *w_, int *h_, int *bpp_)
 }
 
 /* not really used, we do raw_flip */
-void plat_gvideo_open(void)
+void plat_gvideo_open(int is_pal)
 {
 }
 
@@ -529,12 +550,6 @@ void plat_init(void)
        g_menuscreen_h = 240;
        g_menuscreen_ptr = fb_flip();
 
-       g_menubg_ptr = calloc(320*240*2, 1);
-       if (g_menubg_ptr == NULL) {
-               fprintf(stderr, "OOM\n");
-               exit(1);
-       }
-
        warm_ret = warm_init();
        have_warm = warm_ret == 0;
        warm_change_cb_upper(WCB_B_BIT, 1);
@@ -593,13 +608,14 @@ void plat_init(void)
        else {
                printf("detected Wiz\n");
                gp2x_dev_id = GP2X_DEV_WIZ;
-               in_gp2x_init();
        }
 
        in_tsbutton_init();
-       in_probe();
+       in_evdev_init(in_evdev_defbinds);
        if (gp2x_dev_id == GP2X_DEV_CAANOO)
                caanoo_init();
+       else
+               wiz_init();
 
        mixerdev = open("/dev/mixer", O_RDWR);
        if (mixerdev == -1)
@@ -637,26 +653,23 @@ void plat_finish(void)
        close(memdev);
 }
 
-/* Caanoo stuff, perhaps move later */
-#include <linux/input.h>
+/* WIZ RAM lack workaround */
+void *memtab_mmap(void *addr, size_t size)
+{
+       void *ret;
 
-struct in_default_bind in_evdev_defbinds[] = {
-       { KEY_UP,       IN_BINDTYPE_PLAYER12, DKEY_UP },
-       { KEY_DOWN,     IN_BINDTYPE_PLAYER12, DKEY_DOWN },
-       { KEY_LEFT,     IN_BINDTYPE_PLAYER12, DKEY_LEFT },
-       { KEY_RIGHT,    IN_BINDTYPE_PLAYER12, DKEY_RIGHT },
-       { BTN_TOP,      IN_BINDTYPE_PLAYER12, DKEY_TRIANGLE },
-       { BTN_THUMB,    IN_BINDTYPE_PLAYER12, DKEY_CROSS },
-       { BTN_THUMB2,   IN_BINDTYPE_PLAYER12, DKEY_CIRCLE },
-       { BTN_TRIGGER,  IN_BINDTYPE_PLAYER12, DKEY_SQUARE },
-       { BTN_BASE3,    IN_BINDTYPE_PLAYER12, DKEY_START },
-       { BTN_BASE4,    IN_BINDTYPE_PLAYER12, DKEY_SELECT },
-       { BTN_TOP2,     IN_BINDTYPE_PLAYER12, DKEY_L1 },
-       { BTN_PINKIE,   IN_BINDTYPE_PLAYER12, DKEY_R1 },
-       { BTN_BASE,     IN_BINDTYPE_EMU, SACTION_ENTER_MENU },
-       { 0, 0, 0 },
-};
+       if (gp2x_dev_id != GP2X_DEV_WIZ)
+               return mmap(addr, size, PROT_READ | PROT_WRITE,
+                       MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
 
+       ret = mmap(addr, size, PROT_READ | PROT_WRITE,
+               MAP_SHARED | MAP_FIXED, memdev, 0x03000000);
+       if (ret != MAP_FAILED)
+               warm_change_cb_range(WCB_C_BIT | WCB_B_BIT, 1, ret, size);
+       return ret;
+}
+
+/* Caanoo stuff, perhaps move later */
 static const char * const caanoo_keys[KEY_MAX + 1] = {
        [0 ... KEY_MAX] = NULL,
        [KEY_UP]        = "Up",
@@ -782,8 +795,15 @@ void plat_trigger_vibrate(int is_strong)
        ioctl(hapticdev, HAPTIC_PLAY_PATTERN, &haptic_seq[!!is_strong]);
 }
 
+static void caanoo_init(void)
+{
+       in_probe();
+       in_set_config(in_name_to_id("evdev:pollux-analog"), IN_CFG_KEY_NAMES,
+                     caanoo_keys, sizeof(caanoo_keys));
+}
+
 /* Wiz stuff */
-struct in_default_bind in_gp2x_defbinds[] =
+static const struct in_default_bind in_gp2x_defbinds[] =
 {
        /* MXYZ SACB RLDU */
        { GP2X_BTN_UP,          IN_BINDTYPE_PLAYER12, DKEY_UP },
@@ -830,8 +850,8 @@ void plat_step_volume(int is_up)
 // unused dummy for in_gp2x
 volatile unsigned short *gp2x_memregs;
 
-static void caanoo_init(void)
+static void wiz_init(void)
 {
-       in_set_config(in_name_to_id("evdev:pollux-analog"), IN_CFG_KEY_NAMES,
-                     caanoo_keys, sizeof(caanoo_keys));
+       in_gp2x_init(in_gp2x_defbinds);
+       in_probe();
 }