From 31f944ea8ceee82ec8b1451aa86b8d4a9d07367e Mon Sep 17 00:00:00 2001 From: notaz Date: Fri, 4 Oct 2013 03:18:59 +0300 Subject: [PATCH] gp2x: various fixes, prepare for release --- platform/gp2x/Makefile | 18 +++++++- platform/gp2x/PicoDrive.ini | 6 +++ platform/gp2x/PicoDrive_s.png | Bin 0 -> 3384 bytes platform/gp2x/PicoDrive_t.png | Bin 0 -> 27669 bytes platform/gp2x/emu.c | 39 +++-------------- platform/gp2x/plat.c | 9 ++-- platform/gp2x/plat.h | 4 +- platform/gp2x/vid_mmsp2.c | 5 +-- platform/gp2x/vid_pollux.c | 76 +++++++++++----------------------- platform/libpicofe | 2 +- 10 files changed, 61 insertions(+), 98 deletions(-) create mode 100644 platform/gp2x/PicoDrive.ini create mode 100644 platform/gp2x/PicoDrive_s.png create mode 100644 platform/gp2x/PicoDrive_t.png diff --git a/platform/gp2x/Makefile b/platform/gp2x/Makefile index a3786c7..9d90ecc 100644 --- a/platform/gp2x/Makefile +++ b/platform/gp2x/Makefile @@ -1,10 +1,24 @@ +# release packaging makefile + +VER := $(shell head -n 1 ../common/version.h | \ + sed 's/.*"\(.*\)\.\(.*\)".*/\1\2/g') +BUILD := $(shell git describe HEAD | grep -- - | \ + sed -e 's/.*\-\(.*\)\-.*/\1/') +ifneq "$(BUILD)" "" +VER := $(VER)_$(BUILD) +endif + +all: rel + +../../tools/textfilter: + make -C ../../tools/ + readme.txt: ../../tools/textfilter ../base_readme.txt ../../tools/textfilter ../base_readme.txt $@ GP2X -VER ?= $(shell head -n 1 version.h | sed 's/.*"\(.*\)\.\(.*\)".*/\1\2/g') CODE940 = code940/pico940_v3.bin -rel: PicoDrive PicoDrive.gpe $(CODE940) readme.txt ../game_def.cfg \ +rel: ../../PicoDrive PicoDrive.gpe $(CODE940) readme.txt ../game_def.cfg \ PicoDrive.png PicoDrive_s.png PicoDrive_t.png \ warm_2.4.25.o warm_2.4.26-open2x.o warm_2.6.24.ko \ ../../pico/carthw.cfg diff --git a/platform/gp2x/PicoDrive.ini b/platform/gp2x/PicoDrive.ini new file mode 100644 index 0000000..06b816f --- /dev/null +++ b/platform/gp2x/PicoDrive.ini @@ -0,0 +1,6 @@ +[info] +name="PicoDrive" +path="/PicoDrive/PicoDrive.gpe" +icon="/PicoDrive/PicoDrive_s.png" +title="/PicoDrive/PicoDrive_t.png" +group="GAMES" diff --git a/platform/gp2x/PicoDrive_s.png b/platform/gp2x/PicoDrive_s.png new file mode 100644 index 0000000000000000000000000000000000000000..f596616582e0aa54590d695ab23691dbfb13a4cc GIT binary patch literal 3384 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] = (((bpp+1)/8)<<9)|0xAB; /*8/15/16/24bpp...*/ memregs[0x290C>>1] = 320*((bpp+1)/8); /*line width in bytes*/ } @@ -163,7 +162,7 @@ void vid_mmsp2_init(void) void vid_mmsp2_finish(void) { gp2x_video_RGB_setscaling_(0, 320, 240); - gp2x_video_changemode_ll_(16); + gp2x_video_changemode_ll_(16, 0); memregs[0x290E>>1] = gp2x_screenaddr_old[0]; memregs[0x2910>>1] = gp2x_screenaddr_old[1]; diff --git a/platform/gp2x/vid_pollux.c b/platform/gp2x/vid_pollux.c index 308eb00..b0b28da 100644 --- a/platform/gp2x/vid_pollux.c +++ b/platform/gp2x/vid_pollux.c @@ -34,31 +34,21 @@ #include "../common/arm_utils.h" #include "plat.h" -#define fb_buf_count 4 -static unsigned int fb_paddr[fb_buf_count]; +#define FB_BUF_COUNT 4 +#define FB_MEM_SIZE (320*240*2 * FB_BUF_COUNT) + +static unsigned int fb_paddr[FB_BUF_COUNT]; static int fb_work_buf; static int fbdev = -1; -static unsigned short memtimex_old[2]; -static int last_pal_setting = 0; - - -/* misc */ -static void pollux_set_fromenv(const char *env_var) -{ - const char *set_string; - set_string = getenv(env_var); - if (set_string) - pollux_set(memregs, set_string); - else - printf("env var %s not defined.\n", env_var); -} /* video stuff */ static void pollux_video_flip(int buf_count) { - memregl[0x406C>>2] = fb_paddr[fb_work_buf]; + memregl[0x406C>>2] = memregl[0x446C>>2] = fb_paddr[fb_work_buf]; memregl[0x4058>>2] |= 0x10; + memregl[0x4458>>2] |= 0x10; + fb_work_buf++; if (fb_work_buf >= buf_count) fb_work_buf = 0; @@ -67,7 +57,7 @@ static void pollux_video_flip(int buf_count) static void gp2x_video_flip_(void) { - pollux_video_flip(fb_buf_count); + pollux_video_flip(FB_BUF_COUNT); } /* doulblebuffered flip */ @@ -76,7 +66,7 @@ static void gp2x_video_flip2_(void) pollux_video_flip(2); } -static void gp2x_video_changemode_ll_(int bpp) +static void gp2x_video_changemode_ll_(int bpp, int is_pal) { static int prev_bpp = 0; int code = 0, bytes = 2; @@ -100,8 +90,9 @@ static void gp2x_video_changemode_ll_(int bpp) memregl[0x4000>>2] |= 1 << 3; /* the above ioctl resets LCD timings, so set them here */ - snprintf(buff, sizeof(buff), "POLLUX_LCD_TIMINGS_%s", last_pal_setting ? "PAL" : "NTSC"); - pollux_set_fromenv(buff); + snprintf(buff, sizeof(buff), "POLLUX_LCD_TIMINGS_%s", + is_pal ? "PAL" : "NTSC"); + pollux_set_fromenv(memregs, buff); switch (abs(bpp)) { @@ -121,12 +112,18 @@ static void gp2x_video_changemode_ll_(int bpp) return; } - memregl[0x405c>>2] = bytes; - memregl[0x4060>>2] = bytes * (bpp < 0 ? 240 : 320); + // program both MLCs so that TV-out works + memregl[0x405c>>2] = memregl[0x445c>>2] = bytes; + memregl[0x4060>>2] = memregl[0x4460>>2] = + bytes * (bpp < 0 ? 240 : 320); r = memregl[0x4058>>2]; r = (r & 0xffff) | (code << 16) | 0x10; memregl[0x4058>>2] = r; + + r = memregl[0x4458>>2]; + r = (r & 0xffff) | (code << 16) | 0x10; + memregl[0x4458>>2] = r; } static void gp2x_video_setpalette_(int *pal, int len) @@ -153,26 +150,6 @@ static void gp2x_video_wait_vsync_(void) memregl[0x308c>>2] |= 1 << 10; } -/* RAM timings */ -static void set_ram_timings_(void) -{ - pollux_set_fromenv("POLLUX_RAM_TIMINGS"); -} - -static void unset_ram_timings_(void) -{ - int i; - - memregs[0x14802>>1] = memtimex_old[0]; - memregs[0x14804>>1] = memtimex_old[1] | 0x8000; - - for (i = 0; i < 0x100000; i++) - if (!(memregs[0x14804>>1] & 0x8000)) - break; - - printf("RAM timings reset to startup values.\n"); -} - void vid_pollux_init(void) { struct fb_fix_screeninfo fbfix; @@ -193,17 +170,17 @@ void vid_pollux_init(void) printf("framebuffer: \"%s\" @ %08lx\n", fbfix.id, fbfix.smem_start); fb_paddr[0] = fbfix.smem_start; - gp2x_screens[0] = mmap(0, 320*240*2*fb_buf_count, PROT_READ|PROT_WRITE, + gp2x_screens[0] = mmap(0, FB_MEM_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, memdev, fb_paddr[0]); if (gp2x_screens[0] == MAP_FAILED) { perror("mmap(gp2x_screens) failed"); exit(1); } - memset(gp2x_screens[0], 0, 320*240*2*fb_buf_count); + memset(gp2x_screens[0], 0, FB_MEM_SIZE); printf(" %p -> %08x\n", gp2x_screens[0], fb_paddr[0]); - for (i = 1; i < fb_buf_count; i++) + for (i = 1; i < FB_BUF_COUNT; i++) { fb_paddr[i] = fb_paddr[i-1] + 320*240*2; gp2x_screens[i] = (char *)gp2x_screens[i-1] + 320*240*2; @@ -212,8 +189,6 @@ void vid_pollux_init(void) fb_work_buf = 0; g_screen_ptr = gp2x_screens[0]; - set_ram_timings_(); - gp2x_video_flip = gp2x_video_flip_; gp2x_video_flip2 = gp2x_video_flip2_; gp2x_video_changemode_ll = gp2x_video_changemode_ll_; @@ -224,9 +199,8 @@ void vid_pollux_init(void) void vid_pollux_finish(void) { - munmap(gp2x_screens[0], 320*240*2 * fb_buf_count); + memset(gp2x_screens[0], 0, FB_MEM_SIZE); + munmap(gp2x_screens[0], FB_MEM_SIZE); close(fbdev); fbdev = -1; - - unset_ram_timings_(); } diff --git a/platform/libpicofe b/platform/libpicofe index 1bc471e..3901448 160000 --- a/platform/libpicofe +++ b/platform/libpicofe @@ -1 +1 @@ -Subproject commit 1bc471ebf1c85cf78f1862f5596a76f051e7112d +Subproject commit 39014486f9e50110d23dece007ce4c0ed90d15b1 -- 2.39.2