arm_linux.S for cache ops and random fixes
[libpicofe.git] / pandora / pandora.c
index 2e69798..dd73973 100644 (file)
@@ -9,22 +9,23 @@
 #include <sys/stat.h>\r
 #include <sys/ioctl.h>\r
 #include <sys/soundcard.h>\r
+#include <linux/fb.h>\r
 #include <fcntl.h>\r
 #include <errno.h>\r
 \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;\r
+static volatile unsigned int *memregs = MAP_FAILED;\r
 //static\r
 int memdev = 0;\r
-static int sounddev = -1, mixerdev = -1, touchdev = -1;\r
+static int fbdev = -1, sounddev = -1, mixerdev = -1, touchdev = -1;\r
 static int touchcal[7] = { 6203, 0, -1501397, 0, -4200, 16132680, 65536 };\r
 \r
 //#define SCREEN_MAP_SIZE (((800*(480+11)*2)+0xfff)&~0xfff)\r
 #define SCREEN_MAP_SIZE (800*480*2)\r
-static void *screen;\r
+static void *screen = MAP_FAILED;\r
 void *gp2x_screen;\r
 \r
 \r
@@ -63,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
@@ -88,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
@@ -139,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
@@ -170,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
@@ -197,8 +195,8 @@ void gp2x_sound_volume(int l, int r)
 /* common */\r
 void gp2x_init(void)\r
 {\r
-//     struct fb_fix_screeninfo fbfix;\r
-       int fbdev;\r
+       struct fb_fix_screeninfo fbfix;\r
+       int ret;\r
 \r
        printf("entering init()\n"); fflush(stdout);\r
 \r
@@ -208,14 +206,14 @@ void gp2x_init(void)
                printf("open(\"/dev/mem\") failed with %i\n", errno);\r
                exit(1);\r
        }\r
-\r
+/*\r
        memregs = mmap(0, 0x01000000, PROT_READ|PROT_WRITE, MAP_SHARED, memdev, 0x48000000);\r
        if (memregs == MAP_FAILED)\r
        {\r
                printf("mmap(memregs) failed with %i\n", errno);\r
                exit(1);\r
        }\r
-\r
+*/\r
        fbdev = open("/dev/fb0", O_RDWR);\r
        if (fbdev == -1)\r
        {\r
@@ -223,14 +221,20 @@ void gp2x_init(void)
                exit(1);\r
        }\r
 \r
-/*\r
        ret = ioctl(fbdev, FBIOGET_FSCREENINFO, &fbfix);\r
        if (ret == -1)\r
        {\r
                printf("ioctl(fbdev) failed with %i\n", errno);\r
                exit(1);\r
        }\r
-*/\r
+\r
+       // squidge hack\r
+       if (fbfix.line_length != 800*2)\r
+       {\r
+               gp2x_screen = malloc(800*640*2);\r
+               return;\r
+       }\r
+\r
        screen = mmap(0, SCREEN_MAP_SIZE, PROT_WRITE|PROT_READ, MAP_SHARED, fbdev, 0);\r
        if (screen == MAP_FAILED)\r
        {\r
@@ -269,9 +273,12 @@ void gp2x_deinit(void)
 {\r
        //gp2x_video_changemode(15);\r
 \r
-       munmap(screen, SCREEN_MAP_SIZE);\r
-       munmap((void *)memregs, 0x10000);\r
+       if (screen != MAP_FAILED)\r
+               munmap(screen, SCREEN_MAP_SIZE);\r
+       if (memregs != MAP_FAILED)\r
+               munmap((void *)memregs, 0x10000);\r
        close(memdev);\r
+       if (fbdev >= 0)    close(fbdev);\r
        if (mixerdev >= 0) close(mixerdev);\r
        if (sounddev >= 0) close(sounddev);\r
        if (touchdev >= 0) close(touchdev);\r