further prep for Wiz port. Cleanups, rm cpuctrl mmuhack; add warm
authornotaz <notasas@gmail.com>
Wed, 15 Jul 2009 22:08:09 +0000 (22:08 +0000)
committernotaz <notasas@gmail.com>
Wed, 15 Jul 2009 22:08:09 +0000 (22:08 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@704 be3aeb3a-fb24-0410-a615-afba39da0efa

24 files changed:
platform/common/emu.h
platform/common/menu.c
platform/gp2x/940ctl.c
platform/gp2x/940ctl.h
platform/gp2x/Makefile
platform/gp2x/cpuctrl.c [deleted file]
platform/gp2x/cpuctrl.gpl.txt [deleted file]
platform/gp2x/cpuctrl.h [deleted file]
platform/gp2x/emu.c
platform/gp2x/main.c
platform/gp2x/mmuhack.c [deleted file]
platform/gp2x/mmuhack.o [deleted file]
platform/gp2x/mmuhack.txt [deleted file]
platform/gp2x/plat.c
platform/gp2x/plat_gp2x.h [moved from platform/gp2x/gp2x.h with 79% similarity]
platform/gp2x/soc.c
platform/gp2x/soc.h
platform/gp2x/soc_mmsp2.c
platform/gp2x/squidgehack.c [deleted file]
platform/gp2x/squidgehack.h [deleted file]
platform/gp2x/warm.c [new file with mode: 0644]
platform/gp2x/warm.h [new file with mode: 0644]
platform/linux/940ctl_ym2612.c
platform/linux/gp2x.c

index 412022d..2c8de5c 100644 (file)
@@ -24,12 +24,15 @@ extern int g_screen_height;
 #define EOPT_SHOW_FPS     (1<<1)
 #define EOPT_EN_SOUND     (1<<2)
 #define EOPT_GZIP_SAVES   (1<<3)
+#define EOPT_MMUHACK      (1<<4)
 #define EOPT_NO_AUTOSVCFG (1<<5)
+#define EOPT_RAM_TIMINGS  (1<<8)
+#define EOPT_PSYNC        (1<<13)
 
 typedef struct _currentConfig_t {
        // char lastRomFile[512];
        int EmuOpt;             // LSb->MSb: use_sram, show_fps, enable_sound, gzip_saves,
-                                       // squidgehack, no_save_cfg_on_exit, <unused>, 16_bit_mode
+                                       // mmuhack, no_save_cfg_on_exit, <unused>, 16_bit_mode
                                        // craigix_ram, confirm_save, show_cd_leds, confirm_load
                                        // A_SNs_gamma, perfect_vsync, giz_scanlines, giz_dblbuff
                                        // vsync_mode, show_clock, no_frame_limitter
index 0b49234..d7d93b3 100644 (file)
@@ -1415,15 +1415,6 @@ static int menu_loop_cd_options(menu_id id, int keys)
 \r
 // ------------ adv options menu ------------\r
 \r
-// TODO FIXME fix if and mv\r
-static const char *mgn_aopt_sqhack(menu_id id, int *offs)\r
-{\r
-       *offs = -10;\r
-       sprintf(static_buff, "%s, %s", 111 ? "  active" : "inactive",\r
-               (currentConfig.EmuOpt & 0x10) ? "ON" : "OFF");\r
-       return static_buff;\r
-}\r
-\r
 static menu_entry e_menu_adv_options[] =\r
 {\r
        mee_onoff     ("SRAM/BRAM saves",          MA_OPT_SRAM_STATES,    currentConfig.EmuOpt, EOPT_USE_SRAM),\r
@@ -1434,9 +1425,8 @@ static menu_entry e_menu_adv_options[] =
        mee_onoff     ("Emulate SN76496 (PSG)",    MA_OPT2_ENABLE_SN76496,PicoOpt, POPT_EN_PSG),\r
        mee_onoff     ("gzip savestates",          MA_OPT2_GZIP_STATES,   currentConfig.EmuOpt, EOPT_GZIP_SAVES),\r
        mee_onoff     ("Don't save last used ROM", MA_OPT2_NO_LAST_ROM,   currentConfig.EmuOpt, EOPT_NO_AUTOSVCFG),\r
-       mee_label     ("- needs restart -"),\r
-       mee_onoff     ("craigix's RAM timings",    MA_OPT2_RAMTIMINGS,    currentConfig.EmuOpt, 0x0100),\r
-       mee_onoff_cust("Squidgehack",              MA_OPT2_SQUIDGEHACK,   currentConfig.EmuOpt, 0x0010, mgn_aopt_sqhack),\r
+       mee_onoff     ("RAM overclock",            MA_OPT2_RAMTIMINGS,    currentConfig.EmuOpt, EOPT_RAM_TIMINGS),\r
+       mee_onoff     ("MMU hack",                 MA_OPT2_SQUIDGEHACK,   currentConfig.EmuOpt, EOPT_MMUHACK),\r
        mee_onoff     ("SVP dynarec",              MA_OPT2_SVP_DYNAREC,   PicoOpt, POPT_EN_SVP_DRC),\r
        mee_onoff     ("Disable idle loop patching",MA_OPT2_NO_IDLE_LOOPS,PicoOpt, POPT_DIS_IDLE_DET),\r
        mee_end,\r
index 083036e..4624822 100644 (file)
@@ -243,7 +243,7 @@ static void internal_reset(void)
 \r
 \r
 /* this must be called after mmu hack, the allocated regions must not get cached */\r
-void sharedmem_init(void)\r
+void sharedmem940_init(void)\r
 {\r
        if (shared_mem != NULL) return;\r
 \r
@@ -266,7 +266,7 @@ void sharedmem_init(void)
 }\r
 \r
 \r
-void sharedmem_deinit(void)\r
+void sharedmem940_finish(void)\r
 {\r
        munmap(shared_mem, 0x210000);\r
        munmap(mp3_mem, MP3_SIZE_MAX);\r
index f845819..5b789da 100644 (file)
@@ -1,5 +1,5 @@
-void sharedmem_init(void);\r
-void sharedmem_deinit(void);\r
+void sharedmem940_init(void);\r
+void sharedmem940_finish(void);\r
 \r
 void YM2612Init_940(int baseclock, int rate);\r
 void YM2612ResetChip_940(void);\r
index b5ca333..01dbaf4 100644 (file)
@@ -32,7 +32,8 @@ use_cyclone = 1
 endif\r
 \r
 DEFINC = -I../.. -I. -DARM -D__GP2X__ -DIN_GP2X # -DBENCHMARK\r
-COPT_COMMON = -static -Wall -Winline\r
+COPT_COMMON = -Wall -Winline\r
+COPT_COMMON += -static\r
 ifeq ($(DEBUG),)\r
 COPT_COMMON += -O3 -ftracer -fstrength-reduce -fomit-frame-pointer -fstrict-aliasing -ffast-math\r
 else\r
@@ -54,8 +55,7 @@ LD = $(CROSS)ld
 OBJCOPY = $(CROSS)objcopy\r
 \r
 # frontend\r
-# TODO: rm cpuctrl\r
-OBJS += main.o soc.o soc_mmsp2.o soc_pollux.o emu.o in_gp2x.o plat.o squidgehack.o cpuctrl.o\r
+OBJS += main.o soc.o soc_mmsp2.o soc_pollux.o emu.o in_gp2x.o plat.o warm.o\r
 # 940 core control\r
 OBJS += 940ctl.o\r
 \r
diff --git a/platform/gp2x/cpuctrl.c b/platform/gp2x/cpuctrl.c
deleted file mode 100644 (file)
index b5b4736..0000000
+++ /dev/null
@@ -1,300 +0,0 @@
-/*  cpuctrl for GP2X
-    Copyright (C) 2005  Hermes/PS2Reality
-       the gamma-routine was provided by theoddbot
-       parts (c) Rlyehs Work & (C) 2006 god_at_hell
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-*/
-
-
-#include <stdio.h>
-#include <math.h>
-#include "cpuctrl.h"
-
-
-/* system registers */
-static struct
-{
-       unsigned short SYSCLKENREG,SYSCSETREG,UPLLVSETREG,FPLLVSETREG,
-               DUALINT920,DUALINT940,DUALCTRL940,MEMTIMEX0,MEMTIMEX1,DISPCSETREG,
-               DPC_HS_WIDTH,DPC_HS_STR,DPC_HS_END,DPC_VS_END,DPC_DE;
-}
-system_reg;
-
-static volatile unsigned short *MEM_REG;
-
-#define SYS_CLK_FREQ 7372800
-
-// Fout = (m * Fin) / (p * 2^s)
-// m = MDIV+8, p = PDIV+2, s = SDIV
-
-// m = (Fout * p * 2^s) / Fin
-
-void cpuctrl_init(void)
-{
-       extern volatile unsigned short *gp2x_memregs; /* from minimal library rlyeh */
-       MEM_REG=&gp2x_memregs[0];
-       system_reg.DISPCSETREG=MEM_REG[0x924>>1];
-       system_reg.UPLLVSETREG=MEM_REG[0x916>>1];
-       system_reg.FPLLVSETREG=MEM_REG[0x912>>1];
-       system_reg.SYSCSETREG=MEM_REG[0x91c>>1];
-       system_reg.SYSCLKENREG=MEM_REG[0x904>>1];
-       system_reg.DUALINT920=MEM_REG[0x3B40>>1];
-       system_reg.DUALINT940=MEM_REG[0x3B42>>1];
-       system_reg.DUALCTRL940=MEM_REG[0x3B48>>1];
-       system_reg.MEMTIMEX0=MEM_REG[0x3802>>1];
-       system_reg.MEMTIMEX1=MEM_REG[0x3804>>1];
-       system_reg.DPC_HS_WIDTH=MEM_REG[0x281A>>1];
-       system_reg.DPC_HS_STR=MEM_REG[0x281C>>1];
-       system_reg.DPC_HS_END=MEM_REG[0x281E>>1];
-       system_reg.DPC_VS_END=MEM_REG[0x2822>>1];
-       system_reg.DPC_DE=MEM_REG[0x2826>>1];
-}
-
-
-void cpuctrl_deinit(void)
-{
-       MEM_REG[0x910>>1]=system_reg.FPLLVSETREG;
-       MEM_REG[0x91c>>1]=system_reg.SYSCSETREG;
-       MEM_REG[0x3B40>>1]=system_reg.DUALINT920;
-       MEM_REG[0x3B42>>1]=system_reg.DUALINT940;
-       MEM_REG[0x3B48>>1]=system_reg.DUALCTRL940;
-       MEM_REG[0x904>>1]=system_reg.SYSCLKENREG;
-       MEM_REG[0x3802>>1]=system_reg.MEMTIMEX0;
-       MEM_REG[0x3804>>1]=system_reg.MEMTIMEX1 /*| 0x9000*/;
-       unset_LCD_custom_rate();
-}
-
-
-void set_display_clock_div(unsigned div)
-{
-       div=((div & 63) | 64)<<8;
-       MEM_REG[0x924>>1]=(MEM_REG[0x924>>1] & ~(255<<8)) | div;
-}
-
-
-void set_FCLK(unsigned MHZ)
-{
-       unsigned v;
-       unsigned mdiv,pdiv=3,scale=0;
-       MHZ*=1000000;
-       mdiv=(MHZ*pdiv)/SYS_CLK_FREQ;
-       mdiv=((mdiv-8)<<8) & 0xff00;
-       pdiv=((pdiv-2)<<2) & 0xfc;
-       scale&=3;
-       v=mdiv | pdiv | scale;
-       MEM_REG[0x910>>1]=v;
-}
-
-
-void set_920_Div(unsigned short div)
-{
-       unsigned short v;
-       v = MEM_REG[0x91c>>1] & (~0x3);
-       MEM_REG[0x91c>>1] = (div & 0x7) | v;
-}
-
-
-void set_DCLK_Div( unsigned short div )
-{
-       unsigned short v;
-       v = (unsigned short)( MEM_REG[0x91c>>1] & (~(0x7 << 6)) );
-       MEM_REG[0x91c>>1] = ((div & 0x7) << 6) | v;
-}
-
-/*
-void Disable_940(void)
-{
-       MEM_REG[0x3B42>>1];
-       MEM_REG[0x3B42>>1]=0;
-       MEM_REG[0x3B46>>1]=0xffff;
-       MEM_REG[0x3B48>>1]|= (1 << 7);
-       MEM_REG[0x904>>1]&=0xfffe;
-}
-*/
-
-
-typedef struct
-{
-       unsigned short reg, valmask, val;
-}
-reg_setting;
-
-// ~59.998, couldn't figure closer values
-static reg_setting rate_almost60[] =
-{
-       { 0x0914, 0xffff, (212<<8)|(2<<2)|1 },  /* UPLLSETVREG */
-       { 0x0924, 0xff00, (2<<14)|(36<<8) },    /* DISPCSETREG */
-       { 0x281A, 0x00ff, 1 },                  /* .HSWID(T2) */
-       { 0x281C, 0x00ff, 0 },                  /* .HSSTR(T8) */
-       { 0x281E, 0x00ff, 2 },                  /* .HSEND(T7) */
-       { 0x2822, 0x01ff, 12 },                 /* .VSEND (T9) */
-       { 0x2826, 0x0ff0, 34<<4 },              /* .DESTR(T3) */
-       { 0, 0, 0 }
-};
-
-// perfect 50Hz?
-static reg_setting rate_50[] =
-{
-       { 0x0914, 0xffff, (39<<8)|(0<<2)|2 },   /* UPLLSETVREG */
-       { 0x0924, 0xff00, (2<<14)|(7<<8) },     /* DISPCSETREG */
-       { 0x281A, 0x00ff, 31 },                 /* .HSWID(T2) */
-       { 0x281C, 0x00ff, 16 },                 /* .HSSTR(T8) */
-       { 0x281E, 0x00ff, 15 },                 /* .HSEND(T7) */
-       { 0x2822, 0x01ff, 15 },                 /* .VSEND (T9) */
-       { 0x2826, 0x0ff0, 37<<4 },              /* .DESTR(T3) */
-       { 0, 0, 0 }
-};
-
-// 16639/2 ~120.20
-static reg_setting rate_120_20[] =
-{
-       { 0x0914, 0xffff, (96<<8)|(0<<2)|2 },   /* UPLLSETVREG */
-       { 0x0924, 0xff00, (2<<14)|(7<<8) },     /* DISPCSETREG */
-       { 0x281A, 0x00ff, 19 },                 /* .HSWID(T2) */
-       { 0x281C, 0x00ff, 7 },                  /* .HSSTR(T8) */
-       { 0x281E, 0x00ff, 7 },                  /* .HSEND(T7) */
-       { 0x2822, 0x01ff, 12 },                 /* .VSEND (T9) */
-       { 0x2826, 0x0ff0, 37<<4 },              /* .DESTR(T3) */
-       { 0, 0, 0 }
-};
-
-// 19997/2 ~100.02
-static reg_setting rate_100_02[] =
-{
-       { 0x0914, 0xffff, (98<<8)|(0<<2)|2 },   /* UPLLSETVREG */
-       { 0x0924, 0xff00, (2<<14)|(8<<8) },     /* DISPCSETREG */
-       { 0x281A, 0x00ff, 26 },                 /* .HSWID(T2) */
-       { 0x281C, 0x00ff, 6 },                  /* .HSSTR(T8) */
-       { 0x281E, 0x00ff, 6 },                  /* .HSEND(T7) */
-       { 0x2822, 0x01ff, 31 },                 /* .VSEND (T9) */
-       { 0x2826, 0x0ff0, 37<<4 },              /* .DESTR(T3) */
-       { 0, 0, 0 }
-};
-
-// 120.00 97/0/2/7|25/ 7/ 7/11/37
-static reg_setting rate_120[] =
-{
-       { 0x0914, 0xffff, (97<<8)|(0<<2)|2 },   /* UPLLSETVREG */
-       { 0x0924, 0xff00, (2<<14)|(7<<8) },     /* DISPCSETREG */
-       { 0x281A, 0x00ff, 25 },                 /* .HSWID(T2) */
-       { 0x281C, 0x00ff, 7 },                  /* .HSSTR(T8) */
-       { 0x281E, 0x00ff, 7 },                  /* .HSEND(T7) */
-       { 0x2822, 0x01ff, 11 },                 /* .VSEND (T9) */
-       { 0x2826, 0x0ff0, 37<<4 },              /* .DESTR(T3) */
-       { 0, 0, 0 }
-};
-
-// 100.00 96/0/2/7|29/25/53/15/37
-static reg_setting rate_100[] =
-{
-       { 0x0914, 0xffff, (96<<8)|(0<<2)|2 },   /* UPLLSETVREG */
-       { 0x0924, 0xff00, (2<<14)|(7<<8) },     /* DISPCSETREG */
-       { 0x281A, 0x00ff, 29 },                 /* .HSWID(T2) */
-       { 0x281C, 0x00ff, 25 },                 /* .HSSTR(T8) */
-       { 0x281E, 0x00ff, 53 },                 /* .HSEND(T7) */
-       { 0x2822, 0x01ff, 15 },                 /* .VSEND (T9) */
-       { 0x2826, 0x0ff0, 37<<4 },              /* .DESTR(T3) */
-       { 0, 0, 0 }
-};
-
-
-
-static reg_setting *possible_rates[] = { rate_almost60, rate_50, rate_120_20, rate_100_02, rate_120, rate_100 };
-
-void set_LCD_custom_rate(lcd_rate_t rate)
-{
-       reg_setting *set;
-
-       if (MEM_REG[0x2800>>1] & 0x100) // tv-out
-       {
-               return;
-       }
-
-       printf("setting custom LCD refresh, mode=%i... ", rate); fflush(stdout);
-       for (set = possible_rates[rate]; set->reg; set++)
-       {
-               unsigned short val = MEM_REG[set->reg >> 1];
-               val &= ~set->valmask;
-               val |= set->val;
-               MEM_REG[set->reg >> 1] = val;
-       }
-       printf("done.\n");
-}
-
-void unset_LCD_custom_rate(void)
-{
-       printf("reset to prev LCD refresh.\n");
-       MEM_REG[0x914>>1]=system_reg.UPLLVSETREG;
-       MEM_REG[0x924>>1]=system_reg.DISPCSETREG;
-       MEM_REG[0x281A>>1]=system_reg.DPC_HS_WIDTH;
-       MEM_REG[0x281C>>1]=system_reg.DPC_HS_STR;
-       MEM_REG[0x281E>>1]=system_reg.DPC_HS_END;
-       MEM_REG[0x2822>>1]=system_reg.DPC_VS_END;
-       MEM_REG[0x2826>>1]=system_reg.DPC_DE;
-}
-
-void set_RAM_Timings(int tRC, int tRAS, int tWR, int tMRD, int tRFC, int tRP, int tRCD)
-{
-       tRC -= 1; tRAS -= 1; tWR -= 1; tMRD -= 1; tRFC -= 1; tRP -= 1; tRCD -= 1; // ???
-       MEM_REG[0x3802>>1] = ((tMRD & 0xF) << 12) | ((tRFC & 0xF) << 8) | ((tRP & 0xF) << 4) | (tRCD & 0xF);
-       MEM_REG[0x3804>>1] = /*0x9000 |*/ ((tRC & 0xF) << 8) | ((tRAS & 0xF) << 4) | (tWR & 0xF);
-}
-
-
-void set_gamma(int g100, int A_SNs_curve)
-{
-       float gamma = (float) g100 / 100;
-       int i;
-       gamma = 1/gamma;
-
-       //enable gamma
-       MEM_REG[0x2880>>1]&=~(1<<12);
-
-       MEM_REG[0x295C>>1]=0;
-       for(i=0; i<256; i++)
-       {
-               unsigned char g;
-               unsigned short s;
-               const unsigned short grey50=143, grey75=177, grey25=97;
-               float blah;
-
-               if (A_SNs_curve)
-               {
-                       // The next formula is all about gaussian interpolation
-                       blah = ((  -128 * exp(-powf((float) i/64.0f + 2.0f , 2.0f))) +
-                               (   -64 * exp(-powf((float) i/64.0f + 1.0f , 2.0f))) +
-                               (grey25 * exp(-powf((float) i/64.0f - 1.0f , 2.0f))) +
-                               (grey50 * exp(-powf((float) i/64.0f - 2.0f , 2.0f))) +
-                               (grey75 * exp(-powf((float) i/64.0f - 3.0f , 2.0f))) +
-                               (   256 * exp(-powf((float) i/64.0f - 4.0f , 2.0f))) +
-                               (   320 * exp(-powf((float) i/64.0f - 5.0f , 2.0f))) +
-                               (   384 * exp(-powf((float) i/64.0f - 6.0f , 2.0f)))) / (1.772637f);
-                       blah += 0.5f;
-               }
-               else
-               {
-                       blah = i;
-               }
-
-               g = (unsigned char)(255.0*pow(blah/255.0,gamma));
-               //printf("%d : %d\n", i, g);
-               s = (g<<8) | g;
-               MEM_REG[0x295E>>1]= s;
-               MEM_REG[0x295E>>1]= g;
-       }
-}
-
diff --git a/platform/gp2x/cpuctrl.gpl.txt b/platform/gp2x/cpuctrl.gpl.txt
deleted file mode 100644 (file)
index 3912109..0000000
+++ /dev/null
@@ -1,340 +0,0 @@
-                   GNU GENERAL PUBLIC LICENSE
-                      Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                           Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-\f
-                   GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-\f
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-\f
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-\f
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                           NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                    END OF TERMS AND CONDITIONS
-\f
-           How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/platform/gp2x/cpuctrl.h b/platform/gp2x/cpuctrl.h
deleted file mode 100644 (file)
index b9b2328..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef __CPUCTRL_H__
-#define __CPUCTRL_H__
-
-extern void cpuctrl_init(void); /* call this at first */
-extern void save_system_regs(void); /* save some registers */
-extern void cpuctrl_deinit(void);
-extern void set_display_clock_div(unsigned div);
-extern void set_FCLK(unsigned MHZ); /* adjust the clock frequency (in Mhz units) */
-extern void set_920_Div(unsigned short div); /* 0 to 7 divider (freq=FCLK/(1+div)) */
-extern void set_DCLK_Div(unsigned short div); /* 0 to 7 divider (freq=FCLK/(1+div)) */
-//extern void Disable_940(void); /* 940t down */
-
-extern void set_RAM_Timings(int tRC, int tRAS, int tWR, int tMRD, int tRFC, int tRP, int tRCD);
-extern void set_gamma(int g100, int A_SNs_curve);
-
-typedef enum
-{
-       LCDR_60 = 0,    /* ~59.998Hz, has interlacing problems, kills USB host */
-       LCDR_50,        /* 50Hz, has interlacing problems, kills USB host */
-       LCDR_120_20,    /* ~60.10*2Hz, used by FCE Ultra */
-       LCDR_100_02,    /* ~50.01*2Hz, used by FCE Ultra */
-       LCDR_120,       /* 120Hz */
-       LCDR_100,       /* 100Hz */
-} lcd_rate_t;
-
-extern void set_LCD_custom_rate(lcd_rate_t rate);
-extern void unset_LCD_custom_rate(void);
-
-#endif
index 585c1d5..592c360 100644 (file)
@@ -15,7 +15,7 @@
 #include <stdarg.h>\r
 \r
 #include "emu.h"\r
-#include "gp2x.h"\r
+#include "plat_gp2x.h"\r
 #include "soc.h"\r
 #include "../common/menu.h"\r
 #include "../common/arm_utils.h"\r
@@ -24,7 +24,6 @@
 #include "../common/config.h"\r
 #include "../common/input.h"\r
 #include "../linux/sndout_oss.h"\r
-#include "cpuctrl.h"\r
 #include "version.h"\r
 \r
 #include <pico/pico_int.h>\r
@@ -129,7 +128,7 @@ void emu_Deinit(void)
 \r
        // restore gamma\r
        if (gp2x_old_gamma != 100)\r
-               set_gamma(100, 0);\r
+               set_lcd_gamma(100, 0);\r
 }\r
 \r
 void emu_prepareDefaultConfig(void)\r
@@ -142,7 +141,7 @@ void emu_prepareDefaultConfig(void)
        defaultConfig.s_PicoAutoRgnOrder = 0x184; // US, EU, JP\r
        defaultConfig.s_PicoCDBuffers = 0;\r
        defaultConfig.Frameskip = -1; // auto\r
-       defaultConfig.CPUclock = 200;\r
+       defaultConfig.CPUclock = -1;\r
        defaultConfig.volume = 50;\r
        defaultConfig.gamma = 100;\r
        defaultConfig.scaling = 0;\r
@@ -762,7 +761,7 @@ static void tga_dump(void)
 \r
 void emu_Loop(void)\r
 {\r
-       static int gp2x_old_clock = 200, EmuOpt_old = 0;\r
+       static int gp2x_old_clock = -1, EmuOpt_old = 0;\r
        char fpsbuff[24]; // fps count c string\r
        struct timeval tval; // timing\r
        int pframes_done, pframes_shown, pthissec; // "period" frames, used for sync\r
@@ -772,25 +771,41 @@ void emu_Loop(void)
 \r
        printf("entered emu_Loop()\n");\r
 \r
+       if ((EmuOpt_old ^ currentConfig.EmuOpt) & EOPT_RAM_TIMINGS) {\r
+               if (currentConfig.EmuOpt & EOPT_RAM_TIMINGS)\r
+                       /* craigix: --cas 2 --trc 6 --tras 4 --twr 1 --tmrd 1 --trfc 1 --trp 2 --trcd 2 */\r
+                       set_ram_timings(2, 6, 4, 1, 1, 1, 2, 2);\r
+               else\r
+                       unset_ram_timings();\r
+       }\r
+\r
+       if (gp2x_old_clock < 0)\r
+               gp2x_old_clock = default_cpu_clock;\r
+       if (currentConfig.CPUclock < 0)\r
+               currentConfig.CPUclock = default_cpu_clock;\r
        if (gp2x_old_clock != currentConfig.CPUclock) {\r
                printf("changing clock to %i...", currentConfig.CPUclock); fflush(stdout);\r
-               set_FCLK(currentConfig.CPUclock);\r
+               gp2x_set_cpuclk(currentConfig.CPUclock);\r
                gp2x_old_clock = currentConfig.CPUclock;\r
                printf(" done\n");\r
        }\r
 \r
        if (gp2x_old_gamma != currentConfig.gamma || (EmuOpt_old&0x1000) != (currentConfig.EmuOpt&0x1000)) {\r
-               set_gamma(currentConfig.gamma, !!(currentConfig.EmuOpt&0x1000));\r
+               set_lcd_gamma(currentConfig.gamma, !!(currentConfig.EmuOpt&0x1000));\r
                gp2x_old_gamma = currentConfig.gamma;\r
                printf("updated gamma to %i, A_SN's curve: %i\n", currentConfig.gamma, !!(currentConfig.EmuOpt&0x1000));\r
        }\r
 \r
-       if ((EmuOpt_old&0x2000) != (currentConfig.EmuOpt&0x2000)) {\r
-               if (currentConfig.EmuOpt&0x2000)\r
-                    set_LCD_custom_rate(Pico.m.pal ? LCDR_100 : LCDR_120);\r
-               else unset_LCD_custom_rate();\r
+       if ((EmuOpt_old ^ currentConfig.EmuOpt) & EOPT_PSYNC) {\r
+               if (currentConfig.EmuOpt & EOPT_PSYNC)\r
+                       set_lcd_custom_rate(Pico.m.pal);\r
+               else\r
+                       unset_lcd_custom_rate();\r
        }\r
 \r
+       if ((EmuOpt_old ^ currentConfig.EmuOpt) & EOPT_MMUHACK)\r
+               gp2x_make_fb_bufferable(currentConfig.EmuOpt & EOPT_MMUHACK);\r
+\r
        EmuOpt_old = currentConfig.EmuOpt;\r
        fpsbuff[0] = 0;\r
 \r
index 2eed35b..7ceeec3 100644 (file)
@@ -1,4 +1,4 @@
-// (c) Copyright 2006 notaz, All rights reserved.\r
+// (c) Copyright 2006-2009 notaz, All rights reserved.\r
 // Free for non-commercial use.\r
 \r
 // For commercial use, separate licencing terms must be obtained.\r
@@ -6,9 +6,7 @@
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <string.h>\r
-#include <unistd.h>\r
 #include <strings.h>\r
-#include <linux/limits.h>\r
 \r
 #include "../common/menu.h"\r
 #include "../common/emu.h"\r
 #include "../common/input.h"\r
 #include "../common/plat.h"\r
 #include "emu.h"\r
-#include "940ctl.h"\r
 #include "version.h"\r
 \r
-#include "squidgehack.h"\r
-#include "cpuctrl.h"\r
-\r
 \r
 extern char *PicoConfigFile;\r
 static int load_state_slot = -1;\r
-int mmuhack_status = 0;\r
 char **g_argv;\r
 \r
 void parse_cmd_line(int argc, char *argv[])\r
@@ -83,19 +76,6 @@ int main(int argc, char *argv[])
        in_probe();\r
        in_debug_dump();\r
 \r
-       if (currentConfig.EmuOpt&0x10) {\r
-               int ret = mmuhack();\r
-               printf("squidge hack code finished and returned %i\n", ret); fflush(stdout);\r
-               mmuhack_status = ret;\r
-       }\r
-       cpuctrl_init();\r
-       if (currentConfig.EmuOpt&0x100) {\r
-               printf("setting RAM timings.. "); fflush(stdout);\r
-               // craigix: --trc 6 --tras 4 --twr 1 --tmrd 1 --trfc 1 --trp 2 --trcd 2\r
-               set_RAM_Timings(6, 4, 1, 1, 1, 2, 2);\r
-               printf("done.\n"); fflush(stdout);\r
-       }\r
-       sharedmem_init();\r
        emu_Init();\r
        menu_init();\r
 \r
@@ -151,11 +131,7 @@ int main(int argc, char *argv[])
        endloop:\r
 \r
        emu_Deinit();\r
-       sharedmem_deinit();\r
-       cpuctrl_deinit();\r
        plat_finish();\r
-       if (mmuhack_status)\r
-               mmuunhack();\r
 \r
        return 0;\r
 }\r
diff --git a/platform/gp2x/mmuhack.c b/platform/gp2x/mmuhack.c
deleted file mode 100644 (file)
index c0c2189..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-#include <linux/config.h>\r
-#include <linux/module.h>\r
-#include <linux/kernel.h>\r
-#include <linux/init.h>\r
-#include <linux/miscdevice.h>\r
-#include <asm/memory.h>\r
-\r
-#define MMUHACK_MINOR 225\r
-#define DEVICE_NAME "mmuhack"\r
-\r
-#if __GNUC__ == 3\r
-#include <linux/version.h>\r
-static const char __module_kernel_version_gcc3[] __attribute__((__used__)) __attribute__((section(".modinfo"))) =\r
-"kernel_version=" UTS_RELEASE;\r
-#endif\r
-\r
-static ssize_t mmuhack_open(struct inode *inode, struct file *filp)\r
-{\r
-    unsigned int *pgtable;\r
-       unsigned int *cpt;\r
-    int i, j;\r
-       int ttb;\r
-       int ret = -EFAULT;\r
-\r
-       // get the pointer to the translation table base...\r
-       asm volatile(\r
-               "stmdb sp!, {r0}\n\t"\r
-               "mrc p15, 0, r0, c2, c0, 0\n\t"\r
-               "mov %0, r0\n\t"\r
-               "ldmia sp!, {r0}\n\t": "=r"(ttb)\r
-       );\r
-\r
-       pgtable = __va(ttb);\r
-\r
-    for (i = 0; i < 4096; i ++) if ( (pgtable[i] & 3) == 1 ) {\r
-               cpt = __va(pgtable[i] & 0xfffffc00);\r
-\r
-               for (j = 0; j < 256; j ++) {/*\r
-                       if ( (cpt[j] & 0xfe00000f) == 0x02000002 ) {\r
-                               // set C and B bits in upper 32MB memory area...\r
-                               printk("Set C&B bits %08x\n",cpt[j]);\r
-                               cpt[j] |= 0xFFC;\r
-                               ret = 0;\r
-                       }\r
-                                          */\r
-                       if (((cpt[j] & 0xff000000) == 0x02000000) && ((cpt[j] & 12)==0) )\r
-                       {\r
-                               //printk("Set C&B bits %08x\n",cpt[j]);\r
-                               cpt[j] |= 0xFFC;\r
-                       }\r
-                       //if ((a>=0x31 && a<=0x36) && ((cpt[i] & 12)==0))\r
-                       if (((cpt[j] & 0xff000000) == 0x03000000) && ((cpt[j] & 12)==0))\r
-                       {\r
-                               //printk("Set C&B bits %08x\n",cpt[j]);\r
-                               //printf("SDL   c and b bits not set, overwriting\n");\r
-                               cpt[j] |= 0xFFC;\r
-                       }\r
-               }\r
-    }\r
-\r
-       // drain the write buffer and flush the tlb caches...\r
-       asm volatile(\r
-               "stmdb sp!, {r0}\n\t"\r
-               "mov    r0, #0\n\t"\r
-               "mcr    15, 0, r0, cr7, cr10, 4\n\t"\r
-               "mcr    15, 0, r0, cr8, cr7, 0\n\t"\r
-               "ldmia sp!, {r0}\n\t"\r
-       );\r
-\r
-       if (ret == 0)\r
-               printk("MMU hack applied.\n");\r
-\r
-       return 0;\r
-}\r
-\r
-static struct file_operations mmuhack_fops = {\r
-    owner:      THIS_MODULE,\r
-    open:       mmuhack_open,\r
-};\r
-\r
-\r
-static struct miscdevice mmuhack = {\r
-    MMUHACK_MINOR, DEVICE_NAME, &mmuhack_fops\r
-};\r
-\r
-static int __init mmuhack_init(void)\r
-{\r
-       misc_register(&mmuhack);\r
-/*\r
-       printk("MMSP2 MMU Hack module.\n");\r
-*/\r
-    return 0;\r
-}\r
-\r
-static void __exit mmuhack_exit(void)\r
-{\r
-    misc_deregister(&mmuhack);\r
-/*\r
-       printk(KERN_ALERT "MMU Hack module removed.\n");\r
-*/\r
-}\r
-\r
-module_init(mmuhack_init);\r
-module_exit(mmuhack_exit);\r
diff --git a/platform/gp2x/mmuhack.o b/platform/gp2x/mmuhack.o
deleted file mode 100644 (file)
index 475f4a5..0000000
Binary files a/platform/gp2x/mmuhack.o and /dev/null differ
diff --git a/platform/gp2x/mmuhack.txt b/platform/gp2x/mmuhack.txt
deleted file mode 100644 (file)
index 207e09c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-Squidge's MMU Hack modularized.
-Original code by Squidge.
-Module by Annonymous?
-Slightly modified by me to suit my need.
index 0160634..4ae956c 100644 (file)
@@ -3,8 +3,9 @@
 #include <string.h>
 #include <stdarg.h>
 
-#include "gp2x.h"
+#include "plat_gp2x.h"
 #include "soc.h"
+#include "warm.h"
 #include "../common/plat.h"
 #include "../common/readpng.h"
 #include "../common/menu.h"
@@ -12,6 +13,7 @@
 #include "../linux/sndout_oss.h"
 
 /* GP2X local */
+int default_cpu_clock;
 void *gp2x_screens[4];
 
 void gp2x_video_changemode(int bpp)
@@ -44,6 +46,22 @@ void gp2x_memset_all_buffers(int offset, int byte, int len)
        memset((char *)gp2x_screens[3] + offset, byte, len);
 }
 
+void gp2x_make_fb_bufferable(int yes)
+{
+       int ret = 0;
+       
+       yes = yes ? 1 : 0;
+       ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[0], 320*240*2);
+       ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[1], 320*240*2);
+       ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[2], 320*240*2);
+       ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[3], 320*240*2);
+
+       if (ret)
+               fprintf(stderr, "could not make fb buferable.\n");
+       else
+               printf("made fb buferable.\n");
+}
+
 /* common */
 char cpu_clk_name[16] = "GP2X CPU clocks";
 
@@ -92,16 +110,20 @@ void plat_init(void)
        {
        case SOCID_MMSP2:
                mmsp2_init();
+               default_cpu_clock = 200;
                break;
        case SOCID_POLLUX:
                pollux_init();
                strcpy(cpu_clk_name, "Wiz CPU clock");
+               default_cpu_clock = 533;
                break;
        default:
                fprintf(stderr, "could not recognize SoC, bailing out.\n");
                exit(1);
        }
 
+       warm_init();
+
        gp2x_memset_all_buffers(0, 0, 320*240*2);
 
        // snd
@@ -110,7 +132,12 @@ void plat_init(void)
 
 void plat_finish(void)
 {
-       switch (gp2x_soc)
+       gp2x_soc_t soc;
+
+       warm_finish();
+
+       soc = soc_detect();
+       switch (soc)
        {
        case SOCID_MMSP2:
                mmsp2_finish();
similarity index 79%
rename from platform/gp2x/gp2x.h
rename to platform/gp2x/plat_gp2x.h
index 3f6dadd..5a59452 100644 (file)
@@ -1,12 +1,15 @@
-#ifndef __GP2X_H__\r
-#define __GP2X_H__\r
-\r
-/* video */\r
-void gp2x_video_changemode(int bpp);\r
-void gp2x_memcpy_all_buffers(void *data, int offset, int len);\r
-void gp2x_memset_all_buffers(int offset, int byte, int len);\r
-\r
-/* input */\r
-int gp2x_touchpad_read(int *x, int *y);\r
-\r
-#endif\r
+#ifndef __GP2X_H__
+#define __GP2X_H__
+
+extern int default_cpu_clock;
+
+/* video */
+void gp2x_video_changemode(int bpp);
+void gp2x_memcpy_all_buffers(void *data, int offset, int len);
+void gp2x_memset_all_buffers(int offset, int byte, int len);
+void gp2x_make_fb_bufferable(int yes);
+
+/* input */
+int gp2x_touchpad_read(int *x, int *y);
+
+#endif
index d34077d..68b2c89 100644 (file)
@@ -9,18 +9,20 @@
 #include "soc.h"
 #include "../common/emu.h"
 
-gp2x_soc_t gp2x_soc = -1;
-
 gp2x_soc_t soc_detect(void)
 {
        volatile unsigned short *memregs;
        volatile unsigned int *memregl;
+       static gp2x_soc_t ret = -1;
        int pollux_chipname[0x30/4 + 1];
        char *pollux_chipname_c = (char *)pollux_chipname;
-       gp2x_soc_t ret = -1;
        int memdev;
        int i;
 
+       if (ret != -1)
+               /* already detected */
+               return ret;
+
        memdev = open("/dev/mem", O_RDONLY);
        if (memdev == -1)
        {
@@ -72,7 +74,6 @@ not_pollux_like:
 out:
        munmap((void *)memregs, 0x20000);
        close(memdev);
-       gp2x_soc = ret;
        return ret;     
 }
 
index c47db17..7f84e97 100644 (file)
@@ -3,8 +3,6 @@ typedef enum {
        SOCID_POLLUX,
 } gp2x_soc_t;
 
-extern gp2x_soc_t gp2x_soc;
-
 gp2x_soc_t soc_detect(void);
 
 void mmsp2_init(void);
@@ -13,9 +11,20 @@ void mmsp2_finish(void);
 void pollux_init(void);
 void pollux_finish(void);
 
+/* SoC specific functions */
 void gp2x_video_flip(void);
 void gp2x_video_flip2(void);
 void gp2x_video_changemode_ll(int bpp);
 void gp2x_video_setpalette(int *pal, int len);
 void gp2x_video_RGB_setscaling(int ln_offs, int W, int H);
 void gp2x_video_wait_vsync(void);
+
+void gp2x_set_cpuclk(unsigned int mhz);
+
+void set_lcd_custom_rate(int is_pal);
+void unset_lcd_custom_rate(void);
+void set_lcd_gamma(int g100, int A_SNs_curve);
+
+void set_ram_timings(int tCAS, int tRC, int tRAS, int tWR, int tMRD, int tRFC, int tRP, int tRCD);
+void unset_ram_timings(void);
+
index 86e3ac8..32399d7 100644 (file)
@@ -1,6 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <math.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -9,9 +10,10 @@
 
 #include "soc.h"
 #include "soc_mmsp2.h"
-#include "gp2x.h"
+#include "plat_gp2x.h"
 #include "../common/emu.h"
 #include "../common/arm_utils.h"
+#include "940ctl.h"
 
 volatile unsigned short *gp2x_memregs;
 volatile unsigned long  *gp2x_memregl;
@@ -136,6 +138,208 @@ void reset940(int yes, int bank)
        gp2x_memregs[0x3B48>>1] = ((yes&1) << 7) | (bank & 0x03);
 }
 
+/*
+ * CPU clock
+ * Fout = (m * Fin) / (p * 2^s)
+ * m = MDIV+8, p = PDIV+2, s = SDIV
+ *
+ * m = (Fout * p * 2^s) / Fin
+ */
+
+#define SYS_CLK_FREQ 7372800
+
+void gp2x_set_cpuclk(unsigned int mhz)
+{
+       unsigned int mdiv, pdiv, sdiv = 0;
+       unsigned int v;
+       int i;
+
+       pdiv = 3;
+       mdiv = (mhz * pdiv * 1000000) / SYS_CLK_FREQ;
+       if (mdiv & ~0xff) {
+               fprintf(stderr, "invalid cpuclk MHz: %u\n", mhz);
+               return;
+       }
+       v = ((mdiv-8)<<8) | ((pdiv-2)<<2) | sdiv;
+       gp2x_memregs[0x910>>1] = v;
+
+       for (i = 0; i < 10000; i++)
+               if (!(gp2x_memregs[0x902>>1] & 1))
+                       break;
+}
+
+/* RAM timings */
+static unsigned short memtimex[2];
+
+#define TIMING_CHECK(t, adj, mask) \
+       t += adj; \
+       if (t & ~mask) \
+               goto bad
+
+void set_ram_timings(int tCAS, int tRC, int tRAS, int tWR, int tMRD, int tRFC, int tRP, int tRCD)
+{
+       int i;
+       TIMING_CHECK(tCAS, -2, 0x1);
+       TIMING_CHECK(tRC,  -1, 0xf);
+       TIMING_CHECK(tRAS, -1, 0xf);
+       TIMING_CHECK(tWR,  -1, 0xf);
+       TIMING_CHECK(tMRD, -1, 0xf);
+       TIMING_CHECK(tRFC, -1, 0xf);
+       TIMING_CHECK(tRP,  -1, 0xf);
+       TIMING_CHECK(tRCD, -1, 0xf);
+
+       /* get spend_cycles() into cache */
+       spend_cycles(1);
+
+       gp2x_memregs[0x3802>>1] = ((tMRD & 0xF) << 12) | ((tRFC & 0xF) << 8) | ((tRP & 0xF) << 4) | (tRCD & 0xF);
+       gp2x_memregs[0x3804>>1] = 0x8000 | ((tCAS & 1) << 12) | ((tRC & 0xF) << 8) | ((tRAS & 0xF) << 4) | (tWR & 0xF);
+
+       /* be sure we don't access the mem while it's being reprogrammed */
+       spend_cycles(128*1024);
+       for (i = 0; i < 8*1024; i++)
+               if (!(gp2x_memregs[0x3804>>1] & 0x8000))
+                       break;
+
+       printf("RAM timings set.\n");
+       return;
+bad:
+       fprintf(stderr, "RAM timings invalid.\n");
+}
+
+void unset_ram_timings(void)
+{
+       gp2x_memregs[0x3802>>1] = memtimex[0];
+       gp2x_memregs[0x3804>>1] = memtimex[1] | 0x8000;
+       printf("RAM timings reset to startup values.\n");
+}
+
+/* LCD refresh */
+typedef struct
+{
+       unsigned short reg, valmask, val;
+}
+reg_setting;
+
+/* 120.00 97/0/2/7|25/ 7/ 7/11/37 */
+static const reg_setting lcd_rate_120[] =
+{
+       { 0x0914, 0xffff, (97<<8)|(0<<2)|2 },   /* UPLLSETVREG */
+       { 0x0924, 0xff00, (2<<14)|(7<<8) },     /* DISPCSETREG */
+       { 0x281A, 0x00ff, 25 },                 /* .HSWID(T2) */
+       { 0x281C, 0x00ff, 7 },                  /* .HSSTR(T8) */
+       { 0x281E, 0x00ff, 7 },                  /* .HSEND(T7) */
+       { 0x2822, 0x01ff, 11 },                 /* .VSEND (T9) */
+       { 0x2826, 0x0ff0, 37<<4 },              /* .DESTR(T3) */
+       { 0, 0, 0 }
+};
+
+/* 100.00 96/0/2/7|29/25/53/15/37 */
+static const reg_setting lcd_rate_100[] =
+{
+       { 0x0914, 0xffff, (96<<8)|(0<<2)|2 },   /* UPLLSETVREG */
+       { 0x0924, 0xff00, (2<<14)|(7<<8) },     /* DISPCSETREG */
+       { 0x281A, 0x00ff, 29 },                 /* .HSWID(T2) */
+       { 0x281C, 0x00ff, 25 },                 /* .HSSTR(T8) */
+       { 0x281E, 0x00ff, 53 },                 /* .HSEND(T7) */
+       { 0x2822, 0x01ff, 15 },                 /* .VSEND (T9) */
+       { 0x2826, 0x0ff0, 37<<4 },              /* .DESTR(T3) */
+       { 0, 0, 0 }
+};
+
+static reg_setting lcd_rate_defaults[] =
+{
+       { 0x0914, 0xffff, 0 },
+       { 0x0924, 0xff00, 0 },
+       { 0x281A, 0x00ff, 0 },
+       { 0x281C, 0x00ff, 0 },
+       { 0x281E, 0x00ff, 0 },
+       { 0x2822, 0x01ff, 0 },
+       { 0x2826, 0x0ff0, 0 },
+       { 0, 0, 0 }
+};
+
+static void get_reg_setting(reg_setting *set)
+{
+       for (; set->reg; set++)
+       {
+               unsigned short val = gp2x_memregs[set->reg >> 1];
+               val &= set->valmask;
+               set->val = val;
+       }
+}
+
+static void set_reg_setting(const reg_setting *set)
+{
+       for (; set->reg; set++)
+       {
+               unsigned short val = gp2x_memregs[set->reg >> 1];
+               val &= ~set->valmask;
+               val |= set->val;
+               gp2x_memregs[set->reg >> 1] = val;
+       }
+}
+
+void set_lcd_custom_rate(int is_pal)
+{
+       if (gp2x_memregs[0x2800>>1] & 0x100) // tv-out
+               return;
+
+       printf("setting custom LCD refresh (%d Hz)... ", is_pal ? 100 : 120);
+       fflush(stdout);
+
+       set_reg_setting(is_pal ? lcd_rate_100 : lcd_rate_120);
+       printf("done.\n");
+}
+
+void unset_lcd_custom_rate(void)
+{
+       printf("reset to prev LCD refresh.\n");
+       set_reg_setting(lcd_rate_defaults);
+}
+
+void set_lcd_gamma(int g100, int A_SNs_curve)
+{
+       float gamma = (float) g100 / 100;
+       int i;
+       gamma = 1 / gamma;
+
+       /* enable gamma */
+       gp2x_memregs[0x2880>>1] &= ~(1<<12);
+
+       gp2x_memregs[0x295C>>1] = 0;
+       for (i = 0; i < 256; i++)
+       {
+               unsigned char g;
+               unsigned short s;
+               const unsigned short grey50=143, grey75=177, grey25=97;
+               double blah;
+
+               if (A_SNs_curve)
+               {
+                       // The next formula is all about gaussian interpolation
+                       blah = ((  -128 * exp(-powf((float) i/64.0f + 2.0f , 2.0f))) +
+                               (   -64 * exp(-powf((float) i/64.0f + 1.0f , 2.0f))) +
+                               (grey25 * exp(-powf((float) i/64.0f - 1.0f , 2.0f))) +
+                               (grey50 * exp(-powf((float) i/64.0f - 2.0f , 2.0f))) +
+                               (grey75 * exp(-powf((float) i/64.0f - 3.0f , 2.0f))) +
+                               (   256 * exp(-powf((float) i/64.0f - 4.0f , 2.0f))) +
+                               (   320 * exp(-powf((float) i/64.0f - 5.0f , 2.0f))) +
+                               (   384 * exp(-powf((float) i/64.0f - 6.0f , 2.0f)))) / 1.772637;
+                       blah += 0.5;
+               }
+               else
+               {
+                       blah = i;
+               }
+
+               g = (unsigned char)(255.0 * pow(blah/255.0, gamma));
+               //printf("%d : %d\n", i, g);
+               s = (g<<8) | g;
+               gp2x_memregs[0x295E>>1]= s;
+               gp2x_memregs[0x295E>>1]= g;
+       }
+}
+
 
 /* these are not quite MMSP2 related,
  * more to GP2X F100/F200 consoles themselves. */
@@ -244,7 +448,14 @@ void mmsp2_init(void)
 
        memcpy(gp2x_screenaddrs_use, gp2x_screenaddrs, sizeof(gp2x_screenaddrs));
 
-       // touchscreen
+       /* default LCD refresh */
+       get_reg_setting(lcd_rate_defaults);
+
+       /* RAM timings */
+       memtimex[0] = gp2x_memregs[0x3802>>1];
+       memtimex[1] = gp2x_memregs[0x3804>>1];
+
+       /* touchscreen */
        touchdev = open("/dev/touchscreen/wm97xx", O_RDONLY);
        if (touchdev >= 0) {
                FILE *pcf = fopen("/etc/pointercal", "r");
@@ -259,18 +470,25 @@ void mmsp2_init(void)
        /* disable Linux read-ahead */
        proc_set("/proc/sys/vm/max-readahead", "0\n");
        proc_set("/proc/sys/vm/min-readahead", "0\n");
+
+       /* code940 portion */
+       sharedmem940_init();
 }
 
 void mmsp2_finish(void)
 {
        reset940(1, 3);
        pause940(1);
+       sharedmem940_finish();
 
        gp2x_memregs[0x290E>>1] = gp2x_screenaddr_old[0];
        gp2x_memregs[0x2910>>1] = gp2x_screenaddr_old[1];
        gp2x_memregs[0x2912>>1] = gp2x_screenaddr_old[2];
        gp2x_memregs[0x2914>>1] = gp2x_screenaddr_old[3];
 
+       unset_ram_timings();
+       unset_lcd_custom_rate();
+
        munmap(gp2x_screens[0], FRAMEBUFF_WHOLESIZE);
        munmap((void *)gp2x_memregs, 0x10000);
        close(memdev);
diff --git a/platform/gp2x/squidgehack.c b/platform/gp2x/squidgehack.c
deleted file mode 100644 (file)
index 28f997f..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-extern char **g_argv;
-
-/* Call this MMU Hack kernel module after doing mmap, and before doing memset*/
-int mmuhack(void)
-{
-       char kocmd[1024];
-       int i, mmufd;
-
-       /* some programs like some versions of gpSP use some weird version of mmuhack.o
-        * which doesn't seem to work. What's even worse they leave their mmuhack loaded on exit.
-        * So we must remove whatever may be left and always reload _our_ mmuhack.o */
-       system("/sbin/rmmod mmuhack");
-
-       strcpy(kocmd, "/sbin/insmod ");
-       strncpy(kocmd+13, g_argv[0], 1023-13);
-       kocmd[1023] = 0;
-       for (i = strlen(kocmd); i > 13; i--)
-               if (kocmd[i] == '/') { i++; break; }
-       strcpy(kocmd+i, "mmuhack.o");
-
-       printf("Installing NK's kernel module for Squidge MMU Hack (%s)...\n", kocmd);
-       system(kocmd);
-       mmufd = open("/dev/mmuhack", O_RDWR);
-       if(mmufd < 0) return 0;
-
-       close(mmufd);
-       return 1;
-}
-
-
-/* Unload MMU Hack kernel module after closing all memory devices*/
-int mmuunhack(void)
-{
-       int ret;
-       printf("Removing NK's kernel module for Squidge MMU Hack... "); fflush(stdout);
-       ret = system("/sbin/rmmod mmuhack");
-       printf("done (%i)\n", ret);
-
-       return ret;
-}
diff --git a/platform/gp2x/squidgehack.h b/platform/gp2x/squidgehack.h
deleted file mode 100644 (file)
index a83c737..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef __MMUHACK__
-#define __MMUHACK__
-
-extern int mmuhack(void);
-extern int mmuunhack(void);
-
-#endif /* __MMUHACK__ */
diff --git a/platform/gp2x/warm.c b/platform/gp2x/warm.c
new file mode 100644 (file)
index 0000000..7cf22ac
--- /dev/null
@@ -0,0 +1,254 @@
+/*
+ * wARM - exporting ARM processor specific privileged services to userspace
+ * userspace part
+ *
+ * Copyright (c) Gražvydas "notaz" Ignotas, 2009
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the organization nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/utsname.h>
+#include <sys/syscall.h>
+#include <errno.h>
+
+#define WARM_CODE
+#include "warm.h"
+
+/* provided by glibc */
+extern long init_module(void *, unsigned long, const char *);
+extern long delete_module(const char *, unsigned int);
+
+static int warm_fd = -1;
+static int kernel_version;
+
+static void sys_cacheflush(void *start, void *end)
+{
+#ifdef __ARM_EABI__
+       /* EABI version */
+       int num = __ARM_NR_cacheflush;
+       __asm__("mov  r0, %0 ;"
+               "mov  r1, %1 ;"
+               "mov  r2, #0 ;"
+               "mov  r7, %2 ;"
+               "swi  0" : : "r" (start), "r" (end), "r" (num)
+                       : "r0", "r1", "r2", "r3", "r7");
+#else
+       /* OABI */
+       __asm__("mov  r0, %0 ;"
+               "mov  r1, %1 ;"
+               "mov  r2, #0 ;"
+               "swi  %2" : : "r" (start), "r" (end), "i" __ARM_NR_cacheflush
+                       : "r0", "r1", "r2", "r3");
+#endif
+}
+
+/* Those are here because system() occasionaly fails on Wiz
+ * with errno 12 for some unknown reason */
+static int manual_insmod_26(const char *fname, const char *opts)
+{
+       unsigned long len, read_len;
+       int ret = -1;
+       void *buff;
+       FILE *f;
+
+       f = fopen(fname, "rb");
+       if (f == NULL)
+               return -1;
+
+       fseek(f, 0, SEEK_END);
+       len = ftell(f);
+       fseek(f, 0, SEEK_SET);
+
+       buff = malloc(len);
+       if (buff == NULL)
+               goto fail0;
+
+       read_len = fread(buff, 1, len, f);
+       if (read_len != len) {
+               fprintf(stderr, "failed to read module\n");
+               goto fail1;
+       }
+
+       ret = init_module(buff, len, opts);
+
+fail1:
+       free(buff);
+fail0:
+       fclose(f);
+       return ret;
+}
+
+static int manual_rmmod(const char *name)
+{
+       return delete_module(name, O_NONBLOCK|O_EXCL);
+}
+
+int warm_init(void)
+{
+       struct utsname unm;
+       char buff1[32], buff2[128];
+       int ret;
+
+       memset(&unm, 0, sizeof(unm));
+       uname(&unm);
+
+       if (strlen(unm.release) < 3 || unm.release[1] != '.') {
+               fprintf(stderr, "unexpected version string: %s\n", unm.release);
+               goto fail;
+       }
+       kernel_version = ((unm.release[0] - '0') << 4) | (unm.release[2] - '0');
+
+       warm_fd = open("/proc/warm", O_RDWR);
+       if (warm_fd >= 0)
+               return 0;
+
+       snprintf(buff1, sizeof(buff1), "warm_%s.%s", unm.release, kernel_version >= 0x26 ? "ko" : "o");
+       snprintf(buff2, sizeof(buff2), "/sbin/insmod %s verbose=1", buff1);
+
+       /* try to insmod */
+       ret = system(buff2);
+       if (ret != 0) {
+               fprintf(stderr, "system/insmod failed: %d %d\n", ret, errno);
+               if (kernel_version >= 0x26) {
+                       ret = manual_insmod_26(buff1, "verbose=1");
+                       if (ret != 0)
+                               fprintf(stderr, "manual insmod also failed: %d\n", ret);
+               }
+       }
+
+       warm_fd = open("/proc/warm", O_RDWR);
+       if (warm_fd >= 0)
+               return 0;
+
+fail:
+       fprintf(stderr, "wARM: can't init, acting as sys_cacheflush wrapper\n");
+       return -1;
+}
+
+void warm_finish(void)
+{
+       char name[32], cmd[64];
+       int ret;
+
+       if (warm_fd < 0)
+               return;
+
+       close(warm_fd);
+       warm_fd = -1;
+
+       if (kernel_version < 0x26) {
+               struct utsname unm;
+               memset(&unm, 0, sizeof(unm));
+               uname(&unm);
+               snprintf(name, sizeof(name), "warm_%s", unm.release);
+       }
+       else
+               strcpy(name, "warm");
+
+       snprintf(cmd, sizeof(cmd), "/sbin/rmmod %s", name);
+       ret = system(cmd);
+       if (ret != 0) {
+               fprintf(stderr, "system/rmmod failed: %d %d\n", ret, errno);
+               manual_rmmod(name);
+       }
+}
+
+int warm_cache_op_range(int op, void *addr, unsigned long size)
+{
+       struct warm_cache_op wop;
+       int ret;
+
+       if (warm_fd < 0) {
+               /* note that this won't work for warm_cache_op_all */
+               sys_cacheflush(addr, (char *)addr + size);
+               return -1;
+       }
+
+       wop.ops = op;
+       wop.addr = (unsigned long)addr;
+       wop.size = size;
+
+       ret = ioctl(warm_fd, WARMC_CACHE_OP, &wop);
+       if (ret != 0) {
+               perror("WARMC_CACHE_OP failed");
+               return -1;
+       }
+
+       return 0;
+}
+
+int warm_cache_op_all(int op)
+{
+       return warm_cache_op_range(op, NULL, (unsigned long)-1);
+}
+
+int warm_change_cb_range(int cb, int is_set, void *addr, unsigned long size)
+{
+       struct warm_change_cb ccb;
+       int ret;
+
+       if (warm_fd < 0)
+               return -1;
+       
+       ccb.addr = (unsigned long)addr;
+       ccb.size = size;
+       ccb.cb = cb;
+       ccb.is_set = is_set;
+
+       ret = ioctl(warm_fd, WARMC_CHANGE_CB, &ccb);
+       if (ret != 0) {
+               perror("WARMC_CHANGE_CB failed");
+               return -1;
+       }
+
+       return 0;
+}
+
+int warm_change_cb_upper(int cb, int is_set)
+{
+       return warm_change_cb_range(cb, is_set, 0, 0);
+}
+
+unsigned long warm_virt2phys(const void *ptr)
+{
+       unsigned long ptrio;
+       int ret;
+
+       ptrio = (unsigned long)ptr;
+       ret = ioctl(warm_fd, WARMC_VIRT2PHYS, &ptrio);
+       if (ret != 0) {
+               perror("WARMC_VIRT2PHYS failed");
+               return (unsigned long)-1;
+       }
+
+       return ptrio;
+}
+
diff --git a/platform/gp2x/warm.h b/platform/gp2x/warm.h
new file mode 100644 (file)
index 0000000..a3fdd6b
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * wARM - exporting ARM processor specific privileged services to userspace
+ * library functions
+ *
+ * Copyright (c) Gražvydas "notaz" Ignotas, 2009
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the organization nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __WARM_H__
+#define __WARM_H__ 1
+
+/* cache operations (warm_cache_op_*):
+ * o clean - write dirty data to memory, but also leave in cache.
+ * o invalidate - throw away everything in cache, losing dirty data.
+ *
+ * Write buffer is always drained, no ops will only drain WB
+ */
+#define WOP_D_CLEAN            (1 << 0)
+#define WOP_D_INVALIDATE       (1 << 1)
+#define WOP_I_INVALIDATE       (1 << 2)
+
+/* change C and B bits (warm_change_cb_*)
+ * if is_set in not zero, bits are set, else cleared.
+ * the address for range function is virtual address.
+ */
+#define WCB_C_BIT              (1 << 0)
+#define WCB_B_BIT              (1 << 1)
+
+#ifndef __ASSEMBLER__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+int warm_init(void);
+
+int warm_cache_op_range(int ops, void *virt_addr, unsigned long size);
+int warm_cache_op_all(int ops);
+
+int warm_change_cb_upper(int cb, int is_set);
+int warm_change_cb_range(int cb, int is_set, void *virt_addr, unsigned long size);
+
+unsigned long warm_virt2phys(const void *ptr);
+
+void warm_finish(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+/* internal */
+#ifdef WARM_CODE
+
+#include <linux/ioctl.h>
+
+#define WARM_IOCTL_BASE 'A'
+
+struct warm_cache_op
+{
+       unsigned long addr;
+       unsigned long size;
+       int ops;
+};
+
+struct warm_change_cb
+{
+       unsigned long addr;
+       unsigned long size;
+       int cb;
+       int is_set;
+};
+
+#define WARMC_CACHE_OP _IOW(WARM_IOCTL_BASE,  0, struct warm_cache_op)
+#define WARMC_CHANGE_CB        _IOW(WARM_IOCTL_BASE,  1, struct warm_change_cb)
+#define WARMC_VIRT2PHYS        _IOWR(WARM_IOCTL_BASE, 2, unsigned long)
+
+#endif /* WARM_CODE */
+#endif /* !__ASSEMBLER__ */
+#endif /* __WARM_H__ */
index b59e777..50b32e3 100644 (file)
@@ -1,4 +1,5 @@
 /* faked 940 code just uses local copy of ym2612 */
+/* TODO: rm this */
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -9,7 +10,7 @@
 #include <errno.h>
 
 #include "../../pico/sound/ym2612.h"
-#include "../gp2x/gp2x.h"
+//#include "../gp2x/gp2x.h"
 #include "../gp2x/emu.h"
 #include "../gp2x/code940/940shared.h"
 #include "../common/helix/pub/mp3dec.h"
index a58b451..ca915bc 100644 (file)
@@ -13,7 +13,7 @@
 #include <errno.h>
 
 #include "../gp2x/emu.h"
-#include "../gp2x/gp2x.h"
+//#include "../gp2x/gp2x.h"
 #include "../gp2x/version.h"
 #include "../common/emu.h"
 #include "sndout_oss.h"
@@ -333,56 +333,22 @@ void reset940(int yes, int bank)
 {
 }
 
-/* faking gp2x cpuctrl.c */
-void cpuctrl_init(void)
-{
-}
-
-void cpuctrl_deinit(void)
-{
-}
-
-void set_FCLK(unsigned MHZ)
-{
-}
-
-void Disable_940(void)
-{
-}
-
 void gp2x_video_wait_vsync(void)
 {
 }
 
-void set_RAM_Timings(int tRC, int tRAS, int tWR, int tMRD, int tRFC, int tRP, int tRCD)
-{
-}
-
 void set_gamma(int g100, int A_SNs_curve)
 {
 }
 
-void set_LCD_custom_rate(int rate)
-{
-}
-
-void unset_LCD_custom_rate(void)
-{
-}
-
-/* squidgehack.c */
-int mmuhack(void)
+void set_lcd_custom_rate(int rate)
 {
-       return 0;
 }
 
-
-int mmuunhack(void)
+void unset_lcd_custom_rate(void)
 {
-       return 0;
 }
 
-
 /* misc */
 void spend_cycles(int c)
 {