Make the platform code provide the key mapping
[picodrive.git] / platform / pandora / plat.c
index 49b8da6..f82d702 100644 (file)
@@ -33,6 +33,8 @@
 \r
 #include <pico/pico_int.h>\r
 \r
+#define LAYER_MEM_SIZE (320*240*2 * 4)\r
+\r
 static struct vout_fbdev *main_fb, *layer_fb;\r
 // g_layer_* - in use, g_layer_c* - configured custom\r
 int g_layer_cx, g_layer_cy, g_layer_cw, g_layer_ch;\r
@@ -40,10 +42,8 @@ static int g_layer_x, g_layer_y;
 static int g_layer_w = 320, g_layer_h = 240;\r
 static int g_osd_fps_x, g_osd_y, doing_bg_frame;\r
 \r
-static const char pnd_script_base[] = "sudo -n /usr/pandora/scripts";\r
 static unsigned char __attribute__((aligned(4))) fb_copy[320 * 240 * 2];\r
 static void *temp_frame;\r
-unsigned char *PicoDraw2FB;\r
 const char *renderer_names[] = { NULL };\r
 const char *renderer_names32x[] = { NULL };\r
 \r
@@ -74,23 +74,59 @@ static struct in_default_bind in_evdev_defbinds[] =
        { KEY_S,        IN_BINDTYPE_PLAYER12, GBTN_B },\r
        { KEY_D,        IN_BINDTYPE_PLAYER12, GBTN_C },\r
        { KEY_ENTER,    IN_BINDTYPE_PLAYER12, GBTN_START },\r
-       { KEY_BACKSLASH, IN_BINDTYPE_EMU, PEVB_MENU },\r
+       { KEY_F,        IN_BINDTYPE_EMU, PEVB_FF },\r
+       { KEY_BACKSPACE,IN_BINDTYPE_EMU, PEVB_FF },\r
+       { KEY_BACKSLASH,IN_BINDTYPE_EMU, PEVB_MENU },\r
        { KEY_SPACE,    IN_BINDTYPE_EMU, PEVB_MENU },\r
-       /* Pandora */\r
+       { KEY_LEFTCTRL, IN_BINDTYPE_EMU, PEVB_MENU },\r
        { KEY_HOME,     IN_BINDTYPE_PLAYER12, GBTN_A },\r
        { KEY_PAGEDOWN, IN_BINDTYPE_PLAYER12, GBTN_B },\r
        { KEY_END,      IN_BINDTYPE_PLAYER12, GBTN_C },\r
        { KEY_LEFTALT,  IN_BINDTYPE_PLAYER12, GBTN_START },\r
-       { KEY_RIGHTSHIFT,IN_BINDTYPE_EMU, PEVB_STATE_SAVE },\r
-       { KEY_RIGHTCTRL, IN_BINDTYPE_EMU, PEVB_STATE_LOAD },\r
-       { KEY_LEFTCTRL,  IN_BINDTYPE_EMU, PEVB_MENU },\r
+       { KEY_1,        IN_BINDTYPE_EMU, PEVB_STATE_SAVE },\r
+       { KEY_2,        IN_BINDTYPE_EMU, PEVB_STATE_LOAD },\r
+       { KEY_3,        IN_BINDTYPE_EMU, PEVB_SSLOT_PREV },\r
+       { KEY_4,        IN_BINDTYPE_EMU, PEVB_SSLOT_NEXT },\r
+       { KEY_5,        IN_BINDTYPE_EMU, PEVB_PICO_PPREV },\r
+       { KEY_6,        IN_BINDTYPE_EMU, PEVB_PICO_PNEXT },\r
+       { KEY_7,        IN_BINDTYPE_EMU, PEVB_PICO_SWINP },\r
        { 0, 0, 0 }\r
 };\r
 \r
+static const struct menu_keymap key_pbtn_map[] =\r
+{\r
+       { KEY_UP,       PBTN_UP },\r
+       { KEY_DOWN,     PBTN_DOWN },\r
+       { KEY_LEFT,     PBTN_LEFT },\r
+       { KEY_RIGHT,    PBTN_RIGHT },\r
+       /* Pandora */\r
+       { KEY_END,      PBTN_MOK },\r
+       { KEY_PAGEDOWN, PBTN_MBACK },\r
+       { KEY_HOME,     PBTN_MA2 },\r
+       { KEY_PAGEUP,   PBTN_MA3 },\r
+       { KEY_LEFTCTRL,   PBTN_MENU },\r
+       { KEY_RIGHTSHIFT, PBTN_L },\r
+       { KEY_RIGHTCTRL,  PBTN_R },\r
+       /* "normal" keyboards */\r
+       { KEY_ENTER,    PBTN_MOK },\r
+       { KEY_ESC,      PBTN_MBACK },\r
+       { KEY_SEMICOLON,  PBTN_MA2 },\r
+       { KEY_APOSTROPHE, PBTN_MA3 },\r
+       { KEY_BACKSLASH,  PBTN_MENU },\r
+       { KEY_LEFTBRACE,  PBTN_L },\r
+       { KEY_RIGHTBRACE, PBTN_R },\r
+};\r
+\r
+static const struct in_pdata pandora_evdev_pdata = {\r
+       .defbinds = in_evdev_defbinds,\r
+       .key_map = key_pbtn_map,\r
+       .kmap_size = sizeof(key_pbtn_map) / sizeof(key_pbtn_map[0]),\r
+};\r
+\r
 void pemu_prep_defconfig(void)\r
 {\r
        defaultConfig.EmuOpt |= EOPT_VSYNC|EOPT_16BPP;\r
-       defaultConfig.s_PicoOpt |= POPT_EN_MCD_GFX|POPT_EN_MCD_PSYNC;\r
+       defaultConfig.s_PicoOpt |= POPT_EN_MCD_GFX;\r
        defaultConfig.scaling = SCALE_2x2_3x2;\r
 }\r
 \r
@@ -105,10 +141,13 @@ static void osd_text(int x, int y, const char *text)
        int i, h;\r
 \r
        len++;\r
+       if (x + len > g_screen_width)\r
+               len = g_screen_width - x;\r
+\r
        for (h = 0; h < 8; h++) {\r
                unsigned short *p;\r
                p = (unsigned short *)g_screen_ptr + x + g_screen_width*(y + h);\r
-               for (i = len; i; i--, p++)\r
+               for (i = len; i > 0; i--, p++)\r
                        *p = (*p>>2) & 0x39e7;\r
        }\r
        emu_text_out16(x, y, text);\r
@@ -140,13 +179,6 @@ static void draw_cd_leds(void)
        }\r
 }\r
 \r
-static int emuscan(unsigned int num)\r
-{\r
-       DrawLineDest = (unsigned short *)g_screen_ptr + num * g_screen_width;\r
-\r
-       return 0;\r
-}\r
-\r
 void pemu_finalize_frame(const char *fps, const char *notice)\r
 {\r
        if (notice && notice[0])\r
@@ -160,6 +192,7 @@ void pemu_finalize_frame(const char *fps, const char *notice)
 void plat_video_flip(void)\r
 {\r
        g_screen_ptr = vout_fbdev_flip(layer_fb);\r
+       PicoDrawSetOutBuf(g_screen_ptr, g_screen_width * 2);\r
 \r
        // XXX: drain OS event queue here, maybe we'll actually use it someday..\r
        xenv_update(NULL, NULL, NULL, NULL);\r
@@ -238,6 +271,8 @@ static int pnd_setup_layer_(int fd, int enabled, int x, int y, int w, int h)
 {\r
        struct omapfb_plane_info pi;\r
        struct omapfb_mem_info mi;\r
+       int is_enabled;\r
+       int retval = 0;\r
        int ret;\r
 \r
        ret = ioctl(fd, OMAPFB_QUERY_PLANE, &pi);\r
@@ -253,18 +288,27 @@ static int pnd_setup_layer_(int fd, int enabled, int x, int y, int w, int h)
        }\r
 \r
        /* must disable when changing stuff */\r
-       if (pi.enabled) {\r
+       is_enabled = pi.enabled;\r
+       if (is_enabled) {\r
                pi.enabled = 0;\r
                ret = ioctl(fd, OMAPFB_SETUP_PLANE, &pi);\r
                if (ret != 0)\r
                        perror("SETUP_PLANE");\r
+               else\r
+                       is_enabled = 0;\r
        }\r
 \r
-       mi.size = 320*240*2*4;\r
-       ret = ioctl(fd, OMAPFB_SETUP_MEM, &mi);\r
-       if (ret != 0) {\r
-               perror("SETUP_MEM");\r
-               return -1;\r
+       if (mi.size < LAYER_MEM_SIZE) {\r
+               unsigned int size_old = mi.size;\r
+\r
+               mi.size = LAYER_MEM_SIZE;\r
+               ret = ioctl(fd, OMAPFB_SETUP_MEM, &mi);\r
+               if (ret != 0) {\r
+                       perror("SETUP_MEM");\r
+                       fprintf(stderr, "(requested %u, had %u)\n",\r
+                               mi.size, size_old);\r
+                       return -1;\r
+               }\r
        }\r
 \r
        pi.pos_x = x;\r
@@ -274,12 +318,17 @@ static int pnd_setup_layer_(int fd, int enabled, int x, int y, int w, int h)
        pi.enabled = enabled;\r
 \r
        ret = ioctl(fd, OMAPFB_SETUP_PLANE, &pi);\r
-       if (ret != 0) {\r
+       if (ret == 0) {\r
+               is_enabled = pi.enabled;\r
+       }\r
+       else {\r
                perror("SETUP_PLANE");\r
-               return -1;\r
+               retval = -1;\r
        }\r
 \r
-       return 0;\r
+       plat_target_switch_layer(1, is_enabled);\r
+\r
+       return retval;\r
 }\r
 \r
 int pnd_setup_layer(int enabled, int x, int y, int w, int h)\r
@@ -307,9 +356,6 @@ void emu_video_mode_change(int start_line, int line_count, int is_32cols)
        if (doing_bg_frame)\r
                return;\r
 \r
-       PicoDrawSetOutFormat(PDF_RGB555, 1);\r
-       PicoDrawSetCallbacks(emuscan, NULL);\r
-\r
        if (is_32cols) {\r
                fb_w = 256;\r
                fb_left = fb_right = 32;\r
@@ -358,8 +404,10 @@ void emu_video_mode_change(int start_line, int line_count, int is_32cols)
 \r
        pnd_setup_layer(1, g_layer_x, g_layer_y, g_layer_w, g_layer_h);\r
        vout_fbdev_clear(layer_fb);\r
-       vout_fbdev_resize(layer_fb, fb_w, fb_h, 16, fb_left, fb_right, fb_top, fb_bottom, 3);\r
+       vout_fbdev_resize(layer_fb, fb_w, fb_h, 16, fb_left, fb_right, fb_top, fb_bottom, 4);\r
        plat_video_flip();\r
+\r
+       PicoDrawSetOutFormat(PDF_RGB555, 0);\r
 }\r
 \r
 void plat_video_loop_prepare(void)\r
@@ -374,6 +422,8 @@ void plat_video_loop_prepare(void)
 void pemu_loop_prep(void)\r
 {\r
        // dirty buffers better go now than during gameplay\r
+       fflush(stdout);\r
+       fflush(stderr);\r
        sync();\r
        sleep(0);\r
 }\r
@@ -455,7 +505,7 @@ void plat_init(void)
        g_menuscreen_ptr = vout_fbdev_flip(main_fb);\r
 \r
        w = 320; h = 240;\r
-       layer_fb = vout_fbdev_init(layer_fb_name, &w, &h, 16, 3);\r
+       layer_fb = vout_fbdev_init(layer_fb_name, &w, &h, 16, 4);\r
        if (layer_fb == NULL) {\r
                fprintf(stderr, "couldn't init fb: %s\n", layer_fb_name);\r
                goto fail0;\r
@@ -474,11 +524,13 @@ void plat_init(void)
        }\r
        g_menubg_ptr = temp_frame;\r
        g_menubg_src_ptr = temp_frame;\r
-       PicoDraw2FB = temp_frame;\r
 \r
        pnd_menu_init();\r
 \r
-       in_evdev_init(in_evdev_defbinds);\r
+       // default ROM path\r
+       strcpy(rom_fname_loaded, "/media");\r
+\r
+       in_evdev_init(&pandora_evdev_pdata);\r
        in_probe();\r
        plat_target_setup_input();\r
 \r