Browse Source

arm_linux.S for cache ops and random fixes

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@587 be3aeb3a-fb24-0410-a615-afba39da0efa
notaz 15 years ago
parent
commit
16b0afd029

+ 26 - 0
platform/common/arm_linux.S

@@ -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
+

+ 1 - 0
platform/common/arm_linux.h

@@ -0,0 +1 @@
+extern void cache_flush_d_inval_i(const void *start_addr, const void *end_addr);

+ 0 - 1
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);
 

+ 0 - 7
platform/common/arm_utils.s

@@ -214,10 +214,3 @@ spend_cycles:
     bx      lr
 
 
-.global flushcache
-
-flushcache:
-    swi #0x9f0002
-    mov pc, lr
-
-

+ 3 - 2
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"

+ 1 - 1
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

+ 2 - 3
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);
 }
 
 

+ 7 - 2
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));

+ 2 - 1
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"

+ 0 - 8
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:

+ 4 - 3
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++;

+ 5 - 8
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)