arm_linux.S for cache ops and random fixes
authornotaz <notasas@gmail.com>
Sun, 14 Sep 2008 19:41:41 +0000 (19:41 +0000)
committernotaz <notasas@gmail.com>
Sun, 14 Sep 2008 19:41:41 +0000 (19:41 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive/platform@587 be3aeb3a-fb24-0410-a615-afba39da0efa

common/arm_linux.S [new file with mode: 0644]
common/arm_linux.h [new file with mode: 0644]
common/arm_utils.h
common/arm_utils.s
gp2x/Makefile
gp2x/gp2x.c
gp2x/usbjoy.c
pandora/Makefile
pandora/asm_utils.s
pandora/emu.c
pandora/pandora.c

diff --git a/common/arm_linux.S b/common/arm_linux.S
new file mode 100644 (file)
index 0000000..8b13ebb
--- /dev/null
@@ -0,0 +1,26 @@
+@ vim:filetype=armasm
+#include <sys/syscall.h>
+
+
+.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/common/arm_linux.h b/common/arm_linux.h
new file mode 100644 (file)
index 0000000..99de912
--- /dev/null
@@ -0,0 +1 @@
+extern void cache_flush_d_inval_i(const void *start_addr, const void *end_addr);
index 902064a..12802a3 100644 (file)
@@ -10,5 +10,4 @@ void vidCpyM2_40col(void *dest, void *src);
 void vidCpyM2_32col(void *dest, void *src);\r
 void vidCpyM2_32col_nobord(void *dest, void *src);\r
 void spend_cycles(int c); // utility\r
-void flushcache(void *beginning_addr, void *end_addr, unsigned int flags);\r
 \r
index 1d14265..9d51649 100644 (file)
@@ -214,10 +214,3 @@ spend_cycles:
     bx      lr\r
 \r
 \r
-.global flushcache\r
-\r
-flushcache:\r
-    swi #0x9f0002\r
-    mov pc, lr\r
-\r
-\r
index b8bf448..1fa5c8b 100644 (file)
@@ -54,13 +54,14 @@ LD = $(CROSS)ld
 OBJCOPY = $(CROSS)objcopy\r
 \r
 # frontend\r
-OBJS += main.o menu.o gp2x.o usbjoy.o emu.o squidgehack.o cpuctrl.o asm_utils.o\r
+OBJS += main.o menu.o gp2x.o usbjoy.o emu.o squidgehack.o cpuctrl.o\r
 # 940 core control\r
 OBJS += 940ctl.o\r
 \r
 # common\r
 OBJS += platform/common/emu.o platform/common/menu.o platform/common/fonts.o platform/common/config.o \\r
-       platform/common/arm_utils.o platform/common/readpng.o platform/common/mp3_helix.o\r
+       platform/common/arm_utils.o platform/common/arm_linux.o platform/common/readpng.o \\r
+       platform/common/mp3_helix.o\r
 \r
 # Pico\r
 ifeq "$(amalgamate)" "1"\r
index 56fbf5c..0276038 100644 (file)
@@ -36,6 +36,7 @@
 #include "gp2x.h"\r
 #include "usbjoy.h"\r
 #include "../common/arm_utils.h"\r
+#include "../common/arm_linux.h"\r
 \r
 volatile unsigned short *gp2x_memregs;\r
 //static\r
@@ -162,9 +163,7 @@ void gp2x_video_wait_vsync(void)
 void gp2x_video_flush_cache(void)\r
 {\r
        // since we are using the mmu hack, we must flush the cache first\r
-       // (the params are most likely wrong, but they seem to work somehow)\r
-       //flushcache(addr, addr + 320*240*2, 0);\r
-       flushcache(gp2x_screen, (char *)gp2x_screen + 320*240*2, 0);\r
+       cache_flush_d_inval_i(gp2x_screen, (char *)gp2x_screen + 320*240*2);\r
 }\r
 \r
 \r
index 7be18d5..d92e8f6 100644 (file)
@@ -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));
index 50c34d6..ba9bbcb 100644 (file)
@@ -55,7 +55,8 @@ OBJS += pandora.o main.o emu.o asm_utils.o platform/gp2x/menu.o platform/gp2x/us
 \r
 # common\r
 OBJS += platform/common/emu.o platform/common/menu.o platform/common/fonts.o platform/common/config.o \\r
-       platform/common/arm_utils.o platform/common/mp3_helix.o # platform/common/readpng.o\r
+       platform/common/arm_utils.o platform/common/mp3_helix.o platform/common/arm_linux.o\r
+       # platform/common/readpng.o\r
 \r
 # Pico\r
 ifeq "$(amalgamate)" "1"\r
index 7d57c54..a117d2d 100644 (file)
@@ -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:
index 1d0b33b..a749836 100644 (file)
@@ -139,7 +139,7 @@ void emu_prepareDefaultConfig(void)
        defaultConfig.EmuOpt    = 0x8f | 0x00600; // | <- confirm_save, cd_leds\r
        defaultConfig.s_PicoOpt  = 0x0f | POPT_EXT_FM|POPT_EN_MCD_PCM|POPT_EN_MCD_CDDA|POPT_EN_SVP_DRC;\r
        defaultConfig.s_PicoOpt |= POPT_ACC_SPRITES|POPT_EN_MCD_GFX;\r
-       defaultConfig.s_PicoOpt &= ~POPT_EN_SVP_DRC; // crashes :(\r
+//     defaultConfig.s_PicoOpt &= ~POPT_EN_SVP_DRC; // crashes :(\r
        defaultConfig.EmuOpt    &= ~8; // no save gzip\r
        defaultConfig.s_PsndRate = 44100;\r
        defaultConfig.s_PicoRegion = 0;\r
@@ -1001,7 +1001,8 @@ void emu_Loop(void)
 \r
                if (currentConfig.Frameskip < 0 && tval.tv_usec - lim_time >= 300000) // slowdown detection\r
                        reset_timing = 1;\r
-/*             else if (PsndOut != NULL || currentConfig.Frameskip < 0)\r
+#if 1\r
+               else if (PsndOut != NULL || currentConfig.Frameskip < 0)\r
                {\r
                        // sleep or vsync if we are still too fast\r
                        // usleep sleeps for ~20ms minimum, so it is not a solution here\r
@@ -1017,7 +1018,7 @@ void emu_Loop(void)
                                }\r
                        }\r
                }\r
-*/\r
+#endif\r
                blit(fpsbuff, notice);\r
 \r
                pframes_done++; pframes_shown++;\r
index 9c4fc5c..dd73973 100644 (file)
@@ -15,7 +15,7 @@
 \r
 #include "../gp2x/gp2x.h"\r
 #include "../gp2x/usbjoy.h"\r
-#include "../common/arm_utils.h"\r
+#include "../common/arm_linux.h"\r
 \r
 static volatile unsigned int *memregs = MAP_FAILED;\r
 //static\r
@@ -64,13 +64,11 @@ void gp2x_video_wait_vsync(void)
 {\r
 }\r
 \r
-\r
 void gp2x_video_flush_cache(void)\r
 {\r
-//     flushcache(gp2x_screen, (char *)gp2x_screen + 320*240*2, 0);\r
+//     cache_flush_d_inval_i(gp2x_screen, (char *)gp2x_screen + 320*240*2, 0);\r
 }\r
 \r
-\r
 void gp2x_memcpy_buffers(int buffers, void *data, int offset, int len)\r
 {\r
 }\r
@@ -89,6 +87,7 @@ void gp2x_memset_all_buffers(int offset, int byte, int len)
 \r
 void gp2x_pd_clone_buffer2(void)\r
 {\r
+       memset(gp2x_screen, 0, 800*480*2);\r
 }\r
 \r
 \r
@@ -140,11 +139,10 @@ int gp2x_touchpad_read(int *x, int *y)
 }\r
 \r
 \r
-//static int s_oldrate = 0, s_oldbits = 0, s_oldstereo = 0;\r
+static int s_oldrate = 0, s_oldbits = 0, s_oldstereo = 0;\r
 \r
 void gp2x_start_sound(int rate, int bits, int stereo)\r
 {\r
-#if 0\r
        int frag = 0, bsize, buffers;\r
 \r
        // if no settings change, we don't need to do anything\r
@@ -171,13 +169,12 @@ void gp2x_start_sound(int rate, int bits, int stereo)
                rate, bits, stereo?"stereo":"mono", frag>>16, 1<<(frag&0xffff));\r
 \r
        s_oldrate = rate; s_oldbits = bits; s_oldstereo = stereo;\r
-#endif\r
 }\r
 \r
 \r
 void gp2x_sound_write(void *buff, int len)\r
 {\r
-//     write(sounddev, buff, len);\r
+       write(sounddev, buff, len);\r
 }\r
 \r
 void gp2x_sound_sync(void)\r