From 16b0afd0294a8acde173e2973f9a35eafe0bd185 Mon Sep 17 00:00:00 2001 From: notaz Date: Sun, 14 Sep 2008 19:41:41 +0000 Subject: [PATCH] arm_linux.S for cache ops and random fixes git-svn-id: file:///home/notaz/opt/svn/PicoDrive@587 be3aeb3a-fb24-0410-a615-afba39da0efa --- platform/common/arm_linux.S | 26 ++++++++++++++++++++++++++ platform/common/arm_linux.h | 1 + platform/common/arm_utils.h | 1 - platform/common/arm_utils.s | 7 ------- platform/gp2x/Makefile | 5 +++-- platform/gp2x/code940/940shared.h | 2 +- platform/gp2x/gp2x.c | 5 ++--- platform/gp2x/usbjoy.c | 9 +++++++-- platform/pandora/Makefile | 3 ++- platform/pandora/asm_utils.s | 8 -------- platform/pandora/emu.c | 7 ++++--- platform/pandora/pandora.c | 13 +++++-------- 12 files changed, 51 insertions(+), 36 deletions(-) create mode 100644 platform/common/arm_linux.S create mode 100644 platform/common/arm_linux.h diff --git a/platform/common/arm_linux.S b/platform/common/arm_linux.S new file mode 100644 index 00000000..8b13ebbc --- /dev/null +++ b/platform/common/arm_linux.S @@ -0,0 +1,26 @@ +@ vim:filetype=armasm +#include + + +.global cache_flush_d_inval_i @ const void *start_addr, const void *end_addr + +cache_flush_d_inval_i: + mov r2, #0 +#ifdef __ARM_EABI__ + /* EABI version */ + str r7, [sp, #-4]! + mov r7, #(__ARM_NR_cacheflush & 0xff) +#if (__ARM_NR_cacheflush & 0x00ff00) + orr r7, r7, #(__ARM_NR_cacheflush & 0x00ff00) +#endif +#if (__ARM_NR_cacheflush & 0xff0000) + orr r7, r7, #(__ARM_NR_cacheflush & 0xff0000) +#endif + swi 0 + ldr r7, [sp], #4 +#else + /* OABI */ + swi __ARM_NR_cacheflush +#endif + bx lr + diff --git a/platform/common/arm_linux.h b/platform/common/arm_linux.h new file mode 100644 index 00000000..99de912e --- /dev/null +++ b/platform/common/arm_linux.h @@ -0,0 +1 @@ +extern void cache_flush_d_inval_i(const void *start_addr, const void *end_addr); diff --git a/platform/common/arm_utils.h b/platform/common/arm_utils.h index 902064a5..12802a35 100644 --- a/platform/common/arm_utils.h +++ b/platform/common/arm_utils.h @@ -10,5 +10,4 @@ void vidCpyM2_40col(void *dest, void *src); void vidCpyM2_32col(void *dest, void *src); void vidCpyM2_32col_nobord(void *dest, void *src); void spend_cycles(int c); // utility -void flushcache(void *beginning_addr, void *end_addr, unsigned int flags); diff --git a/platform/common/arm_utils.s b/platform/common/arm_utils.s index 1d14265c..9d516493 100644 --- a/platform/common/arm_utils.s +++ b/platform/common/arm_utils.s @@ -214,10 +214,3 @@ spend_cycles: bx lr -.global flushcache - -flushcache: - swi #0x9f0002 - mov pc, lr - - diff --git a/platform/gp2x/Makefile b/platform/gp2x/Makefile index b8bf4482..1fa5c8be 100644 --- a/platform/gp2x/Makefile +++ b/platform/gp2x/Makefile @@ -54,13 +54,14 @@ LD = $(CROSS)ld OBJCOPY = $(CROSS)objcopy # frontend -OBJS += main.o menu.o gp2x.o usbjoy.o emu.o squidgehack.o cpuctrl.o asm_utils.o +OBJS += main.o menu.o gp2x.o usbjoy.o emu.o squidgehack.o cpuctrl.o # 940 core control OBJS += 940ctl.o # common OBJS += platform/common/emu.o platform/common/menu.o platform/common/fonts.o platform/common/config.o \ - platform/common/arm_utils.o platform/common/readpng.o platform/common/mp3_helix.o + platform/common/arm_utils.o platform/common/arm_linux.o platform/common/readpng.o \ + platform/common/mp3_helix.o # Pico ifeq "$(amalgamate)" "1" diff --git a/platform/gp2x/code940/940shared.h b/platform/gp2x/code940/940shared.h index 7f348e2d..57972600 100644 --- a/platform/gp2x/code940/940shared.h +++ b/platform/gp2x/code940/940shared.h @@ -1,4 +1,4 @@ -#include "../../../Pico/sound/ym2612.h" +#include "../../../pico/sound/ym2612.h" #include "../../common/helix/pub/mp3dec.h" // max 16 jobs, lower num means higher prio diff --git a/platform/gp2x/gp2x.c b/platform/gp2x/gp2x.c index 56fbf5cd..0276038b 100644 --- a/platform/gp2x/gp2x.c +++ b/platform/gp2x/gp2x.c @@ -36,6 +36,7 @@ #include "gp2x.h" #include "usbjoy.h" #include "../common/arm_utils.h" +#include "../common/arm_linux.h" volatile unsigned short *gp2x_memregs; //static @@ -162,9 +163,7 @@ void gp2x_video_wait_vsync(void) void gp2x_video_flush_cache(void) { // since we are using the mmu hack, we must flush the cache first - // (the params are most likely wrong, but they seem to work somehow) - //flushcache(addr, addr + 320*240*2, 0); - flushcache(gp2x_screen, (char *)gp2x_screen + 320*240*2, 0); + cache_flush_d_inval_i(gp2x_screen, (char *)gp2x_screen + 320*240*2); } diff --git a/platform/gp2x/usbjoy.c b/platform/gp2x/usbjoy.c index 7be18d59..d92e8f66 100644 --- a/platform/gp2x/usbjoy.c +++ b/platform/gp2x/usbjoy.c @@ -57,8 +57,8 @@ struct usbjoy *joy_open(int joynumber) char path [128]; struct usbjoy * joy = NULL; struct js_event event; +#ifdef __GP2X__ static char insmod_done = 0; - // notaz: on my system I get unresolved input_* symbols, so have to 'insmod input' too // also we should insmod only once, not on every joy_open() call. if (!insmod_done) { @@ -66,13 +66,18 @@ struct usbjoy *joy_open(int joynumber) system ("insmod joydev"); // Loads joydev module insmod_done = 1; } +#endif if (joynumber == 0) { } else if (joynumber > 0) { sprintf (path, "/dev/input/js%d", joynumber-1); fd = open(path, O_RDONLY, 0); - if (fd > 0) { + if (fd == -1) { + sprintf (path, "/dev/js%d", joynumber-1); + fd = open(path, O_RDONLY, 0); + } + if (fd != -1) { joy = (struct usbjoy *) malloc(sizeof(*joy)); if (joy == NULL) { close(fd); return NULL; } memset(joy, 0, sizeof(*joy)); diff --git a/platform/pandora/Makefile b/platform/pandora/Makefile index 50c34d69..ba9bbcb0 100644 --- a/platform/pandora/Makefile +++ b/platform/pandora/Makefile @@ -55,7 +55,8 @@ OBJS += pandora.o main.o emu.o asm_utils.o platform/gp2x/menu.o platform/gp2x/us # common OBJS += platform/common/emu.o platform/common/menu.o platform/common/fonts.o platform/common/config.o \ - platform/common/arm_utils.o platform/common/mp3_helix.o # platform/common/readpng.o + platform/common/arm_utils.o platform/common/mp3_helix.o platform/common/arm_linux.o + # platform/common/readpng.o # Pico ifeq "$(amalgamate)" "1" diff --git a/platform/pandora/asm_utils.s b/platform/pandora/asm_utils.s index 7d57c54e..a117d2d8 100644 --- a/platform/pandora/asm_utils.s +++ b/platform/pandora/asm_utils.s @@ -1,14 +1,6 @@ @ vim:filetype=armasm -.global cache_flush_d_inval_i - -cache_flush_d_inval_i: - mov r2, #0x0 @ must be 0 ??? - swi 0x9f0002 - bx lr - - .global clut_line @ void *dest, void *src, unsigned short *pal, int pixels_mask clut_line: diff --git a/platform/pandora/emu.c b/platform/pandora/emu.c index 1d0b33bc..a749836b 100644 --- a/platform/pandora/emu.c +++ b/platform/pandora/emu.c @@ -139,7 +139,7 @@ void emu_prepareDefaultConfig(void) defaultConfig.EmuOpt = 0x8f | 0x00600; // | <- confirm_save, cd_leds defaultConfig.s_PicoOpt = 0x0f | POPT_EXT_FM|POPT_EN_MCD_PCM|POPT_EN_MCD_CDDA|POPT_EN_SVP_DRC; defaultConfig.s_PicoOpt |= POPT_ACC_SPRITES|POPT_EN_MCD_GFX; - defaultConfig.s_PicoOpt &= ~POPT_EN_SVP_DRC; // crashes :( +// defaultConfig.s_PicoOpt &= ~POPT_EN_SVP_DRC; // crashes :( defaultConfig.EmuOpt &= ~8; // no save gzip defaultConfig.s_PsndRate = 44100; defaultConfig.s_PicoRegion = 0; @@ -1001,7 +1001,8 @@ void emu_Loop(void) if (currentConfig.Frameskip < 0 && tval.tv_usec - lim_time >= 300000) // slowdown detection reset_timing = 1; -/* else if (PsndOut != NULL || currentConfig.Frameskip < 0) +#if 1 + else if (PsndOut != NULL || currentConfig.Frameskip < 0) { // sleep or vsync if we are still too fast // usleep sleeps for ~20ms minimum, so it is not a solution here @@ -1017,7 +1018,7 @@ void emu_Loop(void) } } } -*/ +#endif blit(fpsbuff, notice); pframes_done++; pframes_shown++; diff --git a/platform/pandora/pandora.c b/platform/pandora/pandora.c index 9c4fc5c4..dd739739 100644 --- a/platform/pandora/pandora.c +++ b/platform/pandora/pandora.c @@ -15,7 +15,7 @@ #include "../gp2x/gp2x.h" #include "../gp2x/usbjoy.h" -#include "../common/arm_utils.h" +#include "../common/arm_linux.h" static volatile unsigned int *memregs = MAP_FAILED; //static @@ -64,13 +64,11 @@ void gp2x_video_wait_vsync(void) { } - void gp2x_video_flush_cache(void) { -// flushcache(gp2x_screen, (char *)gp2x_screen + 320*240*2, 0); +// cache_flush_d_inval_i(gp2x_screen, (char *)gp2x_screen + 320*240*2, 0); } - void gp2x_memcpy_buffers(int buffers, void *data, int offset, int len) { } @@ -89,6 +87,7 @@ void gp2x_memset_all_buffers(int offset, int byte, int len) void gp2x_pd_clone_buffer2(void) { + memset(gp2x_screen, 0, 800*480*2); } @@ -140,11 +139,10 @@ int gp2x_touchpad_read(int *x, int *y) } -//static int s_oldrate = 0, s_oldbits = 0, s_oldstereo = 0; +static int s_oldrate = 0, s_oldbits = 0, s_oldstereo = 0; void gp2x_start_sound(int rate, int bits, int stereo) { -#if 0 int frag = 0, bsize, buffers; // if no settings change, we don't need to do anything @@ -171,13 +169,12 @@ void gp2x_start_sound(int rate, int bits, int stereo) rate, bits, stereo?"stereo":"mono", frag>>16, 1<<(frag&0xffff)); s_oldrate = rate; s_oldbits = bits; s_oldstereo = stereo; -#endif } void gp2x_sound_write(void *buff, int len) { -// write(sounddev, buff, len); + write(sounddev, buff, len); } void gp2x_sound_sync(void) -- 2.39.5