diff --git a/CppOutRun.layout b/CppOutRun.layout
index a0a968a..65bf75b 100644
--- a/CppOutRun.layout
+++ b/CppOutRun.layout
@@ -2,152 +2,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -175,4 +29,150 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/clock.cc b/src/clock.cc
index 87d2d27..2bef86f 100644
--- a/src/clock.cc
+++ b/src/clock.cc
@@ -7,27 +7,51 @@
#include
-#define FLLFRQ_default 0x00004384
-#define FRQCR_default 0x0F011112
+#define FLLFRQ_default_CG50 0x00004384
+#define FRQCR_default_CG50 0x0F011112
+
+#define CS0BCR_default_CG50 0x36DA0400 // CG50
+#define CS2BCR_default_CG50 0x36DA3400 // CG50
+#define CS3BCR_default_CG50 0x36DB4400 // CG50
+#define CS4BCR_default_CG50 0x36DB0400
+#define CS5aBCR_default_CG50 0x17DF0400
+#define CS5bBCR_default_CG50 0x17DF0400
+#define CS6aBCR_default_CG50 0x34D30200
+#define CS6bBCR_default_CG50 0x34D30200
+
+#define CS0WCR_default_CG50 0x000003C0 // CG50
+#define CS2WCR_default_CG50 0x000003C0 // CG50
+#define CS3WCR_default_CG50 0x000024D1 // CG50
+#define CS4WCR_default_CG50 0x00000540
+#define CS5aWCR_default_CG50 0x000203C1
+#define CS5bWCR_default_CG50 0x000203C1
+#define CS6aWCR_default_CG50 0x000302C0
+#define CS6bWCR_default_CG50 0x000302C0
+//#define SDCR_default 0x00000A08
+
+
+#define FLLFRQ_default_CG10_20 0x00004384
+#define FRQCR_default_CG10_20 0x0F102203
+
+#define CS0BCR_default_CG10_20 0x24920400
+#define CS2BCR_default_CG10_20 0x24923400
+#define CS3BCR_default_CG10_20 0x24924400
+#define CS4BCR_default_CG10_20 0x36DB0400
+#define CS5aBCR_default_CG10_20 0x15140400
+#define CS5bBCR_default_CG10_20 0x15140400
+#define CS6aBCR_default_CG10_20 0x34D30200
+#define CS6bBCR_default_CG10_20 0x34D30200
+
+#define CS0WCR_default_CG10_20 0x000001C0
+#define CS2WCR_default_CG10_20 0x00000140
+#define CS3WCR_default_CG10_20 0x000024D0
+#define CS4WCR_default_CG10_20 0x00000540
+#define CS5aWCR_default_CG10_20 0x00010240
+#define CS5bWCR_default_CG10_20 0x00010240
+#define CS6aWCR_default_CG10_20 0x000302C0
+#define CS6bWCR_default_CG10_20 0x000302C0
-#define CS0BCR_default 0x36DA0400 // CG50
-#define CS2BCR_default 0x36DA3400 // CG50
-#define CS3BCR_default 0x36DB4400 // CG50
-#define CS4BCR_default 0x36DB0400
-#define CS5aBCR_default 0x17DF0400
-#define CS5bBCR_default 0x17DF0400
-#define CS6aBCR_default 0x34D30200
-#define CS6bBCR_default 0x34D30200
-#define CS0WCR_default 0x000003C0 // CG50
-#define CS2WCR_default 0x000003C0 // CG50
-#define CS3WCR_default 0x000024D1 // CG50
-#define CS4WCR_default 0x00000540
-#define CS5aWCR_default 0x000203C1
-#define CS5bWCR_default 0x000203C1
-#define CS6aWCR_default 0x000302C0
-#define CS6bWCR_default 0x000302C0
-#define SDCR_default 0x00000A08
#define PLL_32x 0b011111 //
#define PLL_26x 0b011001 //
@@ -37,6 +61,7 @@
#define DIV_4 0b0001 // 1/4
#define DIV_8 0b0010 // 1/8
#define DIV16 0b0011 // 1/16
+#define DIV32 0b0100 // 1/32
#define WAIT18 0b1011
@@ -149,30 +174,30 @@ static overclock_level current_clock_state = -1;
bool overclock_config_changed = false;
-void SetOCDefault( void )
+void SetOCDefault_CG50( void )
{
BSC.CS0WCR.WR = WAIT18;
- CPG.FLLFRQ.lword = FLLFRQ_default;
- CPG.FRQCR.lword = FRQCR_default;
+ CPG.FLLFRQ.lword = FLLFRQ_default_CG50;
+ CPG.FRQCR.lword = FRQCR_default_CG50;
CPG.FRQCR.KICK = 1 ;
while((CPG.LSTATS & 1)!=0)
- BSC.CS0BCR.lword = CS0BCR_default;
- BSC.CS0WCR.lword = CS0WCR_default;
- BSC.CS2BCR.lword = CS2BCR_default;
- BSC.CS2WCR.lword = CS2WCR_default;
- BSC.CS3BCR.lword = CS3BCR_default;
- BSC.CS3WCR.lword = CS3WCR_default;
+ BSC.CS0BCR.lword = CS0BCR_default_CG50;
+ BSC.CS0WCR.lword = CS0WCR_default_CG50;
+ BSC.CS2BCR.lword = CS2BCR_default_CG50;
+ BSC.CS2WCR.lword = CS2WCR_default_CG50;
+ BSC.CS3BCR.lword = CS3BCR_default_CG50;
+ BSC.CS3WCR.lword = CS3WCR_default_CG50;
if ( BSC.CS3WCR.A3CL == 1 ) SDMR3_CL2 = 0; else SDMR3_CL3 = 0;
- BSC.CS5ABCR.lword = CS5aBCR_default;
- BSC.CS5AWCR.lword = CS5aWCR_default;
+ BSC.CS5ABCR.lword = CS5aBCR_default_CG50;
+ BSC.CS5AWCR.lword = CS5aWCR_default_CG50;
}
-void SetOCPtuneF2( void )
+void SetOCPtuneF2_CG50( void )
{
BSC.CS0WCR.WR = WAIT18;
@@ -185,17 +210,17 @@ void SetOCPtuneF2( void )
BSC.CS0BCR.lword = 0x24920400;
BSC.CS0WCR.lword = 0x00000340;
BSC.CS2BCR.lword = 0x24923400;
- BSC.CS2WCR.lword = CS2WCR_default;
+ BSC.CS2WCR.lword = CS2WCR_default_CG50;
BSC.CS3BCR.lword = 0x24924400;
- BSC.CS3WCR.lword = CS3WCR_default;
+ BSC.CS3WCR.lword = CS3WCR_default_CG50;
if ( BSC.CS3WCR.A3CL == 1 ) SDMR3_CL2 = 0; else SDMR3_CL3 = 0;
- BSC.CS5ABCR.lword = CS5aBCR_default;
- BSC.CS5AWCR.lword = CS5aWCR_default;
+ BSC.CS5ABCR.lword = CS5aBCR_default_CG50;
+ BSC.CS5AWCR.lword = CS5aWCR_default_CG50;
}
-void SetOCPtuneF3( void )
+void SetOCPtuneF3_CG50( void )
{
BSC.CS0WCR.WR = WAIT18;
@@ -208,17 +233,17 @@ void SetOCPtuneF3( void )
BSC.CS0BCR.lword = 0x24920400;
BSC.CS0WCR.lword = 0x00000240;
BSC.CS2BCR.lword = 0x24923400;
- BSC.CS2WCR.lword = CS2WCR_default;
+ BSC.CS2WCR.lword = CS2WCR_default_CG50;
BSC.CS3BCR.lword = 0x24924400;
- BSC.CS3WCR.lword = CS3WCR_default;
+ BSC.CS3WCR.lword = CS3WCR_default_CG50;
if ( BSC.CS3WCR.A3CL == 1 ) SDMR3_CL2 = 0; else SDMR3_CL3 = 0;
- BSC.CS5ABCR.lword = CS5aBCR_default;
- BSC.CS5AWCR.lword = CS5aWCR_default;
+ BSC.CS5ABCR.lword = CS5aBCR_default_CG50;
+ BSC.CS5AWCR.lword = CS5aWCR_default_CG50;
}
-void SetOCPtuneF4( void )
+void SetOCPtuneF4_CG50( void )
{
BSC.CS0WCR.WR = WAIT18;
@@ -232,14 +257,17 @@ void SetOCPtuneF4( void )
BSC.CS0BCR.lword = 0x24920400;
BSC.CS0WCR.lword = 0x000002C0;
BSC.CS2BCR.lword = 0x24923400;
- BSC.CS2WCR.lword = CS2WCR_default;
+ BSC.CS2WCR.lword = CS2WCR_default_CG50;
BSC.CS3BCR.lword = 0x24924400;
- BSC.CS3WCR.lword = CS3WCR_default;
- BSC.CS5ABCR.lword = CS5aBCR_default;
- BSC.CS5AWCR.lword = CS5aWCR_default;
+ BSC.CS3WCR.lword = CS3WCR_default_CG50;
+
+ if ( BSC.CS3WCR.A3CL == 1 ) SDMR3_CL2 = 0; else SDMR3_CL3 = 0;
+
+ BSC.CS5ABCR.lword = CS5aBCR_default_CG50;
+ BSC.CS5AWCR.lword = CS5aWCR_default_CG50;
}
-void SetOCPtuneF5( void )
+void SetOCPtuneF5_CG50( void )
{
BSC.CS0WCR.WR = WAIT18;
@@ -252,17 +280,203 @@ void SetOCPtuneF5( void )
BSC.CS0BCR.lword = 0x24920400;
BSC.CS0WCR.lword = 0x00000440;
BSC.CS2BCR.lword = 0x24923400;
- BSC.CS2WCR.lword = CS2WCR_default;
+ BSC.CS2WCR.lword = CS2WCR_default_CG50;
BSC.CS3BCR.lword = 0x24924400;
- BSC.CS3WCR.lword = CS3WCR_default;
+ BSC.CS3WCR.lword = CS3WCR_default_CG50;
if ( BSC.CS3WCR.A3CL == 1 ) SDMR3_CL2 = 0; else SDMR3_CL3 = 0;
- BSC.CS5ABCR.lword = CS5aBCR_default;
- BSC.CS5AWCR.lword = CS5aWCR_default;
+ BSC.CS5ABCR.lword = CS5aBCR_default_CG50;
+ BSC.CS5AWCR.lword = CS5aWCR_default_CG50;
}
+void SetOCDefault_CG10_20( void )
+{
+ BSC.CS0WCR.WR = WAIT18;
+
+ CPG.FLLFRQ.lword = FLLFRQ_default_CG10_20;
+ CPG.FRQCR.lword = FRQCR_default_CG10_20;
+
+ CPG.FRQCR.KICK = 1 ;
+ while((CPG.LSTATS & 1)!=0)
+
+ BSC.CS0BCR.lword = CS0BCR_default_CG10_20;
+ BSC.CS0WCR.lword = CS0WCR_default_CG10_20;
+ BSC.CS2BCR.lword = CS2BCR_default_CG10_20;
+ BSC.CS2WCR.lword = CS2WCR_default_CG10_20;
+ BSC.CS3BCR.lword = CS3BCR_default_CG10_20;
+ BSC.CS3WCR.lword = CS3WCR_default_CG10_20;
+
+ if ( BSC.CS3WCR.A3CL == 1 ) SDMR3_CL2 = 0; else SDMR3_CL3 = 0;
+
+ BSC.CS5ABCR.lword = CS5aBCR_default_CG10_20;
+ BSC.CS5AWCR.lword = CS5aWCR_default_CG10_20;
+}
+
+void SetOCPtuneF2_CG10_20( void )
+{
+ BSC.CS0WCR.WR = WAIT18;
+
+ CPG.FLLFRQ.lword = 0x00004000+900;
+ CPG.FRQCR.lword = (PLL_32x<<24)+(DIV_8<<20)+(DIV16<<12)+(DIV16<<8)+DIV32;
+
+ CPG.FRQCR.KICK = 1 ;
+ while((CPG.LSTATS & 1)!=0)
+
+ BSC.CS0BCR.lword = 0x04900400;
+ BSC.CS0WCR.lword = 0x00000140;
+ BSC.CS2BCR.lword = 0x04903400;
+ BSC.CS2WCR.lword = 0x000100C0;
+ BSC.CS3BCR.lword = CS3BCR_default_CG10_20;
+ BSC.CS3WCR.lword = CS3WCR_default_CG10_20;
+
+ if ( BSC.CS3WCR.A3CL == 1 ) SDMR3_CL2 = 0; else SDMR3_CL3 = 0;
+
+ BSC.CS5ABCR.lword = CS5aBCR_default_CG10_20;
+ BSC.CS5AWCR.lword = CS5aWCR_default_CG10_20;
+}
+
+void SetOCPtuneF3_CG10_20( void )
+{
+ BSC.CS0WCR.WR = WAIT18;
+
+ CPG.FLLFRQ.lword = 0x00004000+900;
+ CPG.FRQCR.lword = (PLL_32x<<24)+(DIV_4<<20)+(DIV_8<<12)+(DIV_8<<8)+DIV32;
+
+ CPG.FRQCR.KICK = 1 ;
+ while((CPG.LSTATS & 1)!=0)
+
+ BSC.CS0BCR.lword = 0x24900400;
+ BSC.CS0WCR.lword = 0x000002C0;
+ BSC.CS2BCR.lword = 0x04903400;
+ BSC.CS2WCR.lword = 0x000201C0;
+ BSC.CS3BCR.lword = CS3BCR_default_CG10_20;
+ BSC.CS3WCR.lword = CS3WCR_default_CG10_20;
+
+ if ( BSC.CS3WCR.A3CL == 1 ) SDMR3_CL2 = 0; else SDMR3_CL3 = 0;
+
+ BSC.CS5ABCR.lword = CS5aBCR_default_CG10_20;
+ BSC.CS5AWCR.lword = CS5aWCR_default_CG10_20;
+}
+
+void SetOCPtuneF4_CG10_20( void )
+{
+ BSC.CS0WCR.WR = WAIT18;
+
+ CPG.FLLFRQ.lword = 0x00004000+900;
+ CPG.FRQCR.lword = (PLL_32x<<24)+(DIV_4<<20)+(DIV_4<<12)+(DIV_4<<8)+DIV32;
+
+ CPG.FRQCR.KICK = 1 ;
+ while((CPG.LSTATS & 1)!=0)
+
+ BSC.CS0BCR.lword = 0x44900400;
+ BSC.CS0WCR.lword = 0x00000440;
+ BSC.CS2BCR.lword = 0x04903400;
+ BSC.CS2WCR.lword = 0x00040340;
+ BSC.CS3BCR.lword = CS3BCR_default_CG10_20;
+ BSC.CS3WCR.lword = CS3WCR_default_CG10_20;
+
+ if ( BSC.CS3WCR.A3CL == 1 ) SDMR3_CL2 = 0; else SDMR3_CL3 = 0;
+
+ BSC.CS5ABCR.lword = CS5aBCR_default_CG10_20;
+ BSC.CS5AWCR.lword = CS5aWCR_default_CG10_20;
+}
+
+void SetOCPtuneF5_CG10_20( void )
+{
+ BSC.CS0WCR.WR = WAIT18;
+
+ CPG.FLLFRQ.lword = 0x00004000+900;
+ CPG.FRQCR.lword = (PLL_26x<<24)+(DIV_2<<20)+(DIV_4<<12)+(DIV_4<<8)+DIV16;
+
+ CPG.FRQCR.KICK = 1 ;
+ while((CPG.LSTATS & 1)!=0)
+
+ BSC.CS0BCR.lword = 0x34900400;
+ BSC.CS0WCR.lword = 0x000003C0;
+ BSC.CS2BCR.lword = 0x04903400;
+ BSC.CS2WCR.lword = 0x000402C0;
+ BSC.CS3BCR.lword = CS3BCR_default_CG10_20;
+ BSC.CS3WCR.lword = CS3WCR_default_CG10_20;
+
+ if ( BSC.CS3WCR.A3CL == 1 ) SDMR3_CL2 = 0; else SDMR3_CL3 = 0;
+
+ BSC.CS5ABCR.lword = CS5aBCR_default_CG10_20;
+ BSC.CS5AWCR.lword = CS5aWCR_default_CG10_20;
+}
+
+
+
+overclock_level overclock_detect( void )
+{
+ if(gint[HWCALC] == HWCALC_FXCG50)
+ {
+
+ // OC_Default configuration
+ if (CPG.FLLFRQ.lword == FLLFRQ_default_CG50 && CPG.FRQCR.lword == FRQCR_default_CG50 && BSC.CS0BCR.lword == CS0BCR_default_CG50 && BSC.CS0WCR.lword == CS0WCR_default_CG50 &&
+ BSC.CS2BCR.lword == CS2BCR_default_CG50 && BSC.CS2WCR.lword == CS2WCR_default_CG50 && BSC.CS3BCR.lword == CS3BCR_default_CG50 && BSC.CS3WCR.lword == CS3WCR_default_CG50 &&
+ BSC.CS5ABCR.lword == CS5aBCR_default_CG50 && BSC.CS5AWCR.lword == CS5aWCR_default_CG50 ) return OC_Default;
+
+ // OC_PtuneF2 configuration
+ else if (CPG.FLLFRQ.lword == 0x00004000+900 && CPG.FRQCR.lword == (PLL_16x<<24)+(DIV_4<<20)+(DIV_8<<12)+(DIV_8<<8)+DIV_8 && BSC.CS0BCR.lword == 0x24920400 &&
+ BSC.CS0WCR.lword == 0x00000340 && BSC.CS2BCR.lword == 0x24923400 && BSC.CS2WCR.lword == CS2WCR_default_CG50 && BSC.CS3BCR.lword == 0x24924400 &&
+ BSC.CS3WCR.lword == CS3WCR_default_CG50 && BSC.CS5ABCR.lword == CS5aBCR_default_CG50 && BSC.CS5AWCR.lword == CS5aWCR_default_CG50 ) return OC_PtuneF2;
+
+ // OC_PtuneF3 configuration
+ else if (CPG.FLLFRQ.lword == 0x00004000+900 && CPG.FRQCR.lword == (PLL_26x<<24)+(DIV_4<<20)+(DIV_8<<12)+(DIV_8<<8)+DIV_8 && BSC.CS0BCR.lword == 0x24920400 &&
+ BSC.CS0WCR.lword == 0x00000240 && BSC.CS2BCR.lword == 0x24923400 && BSC.CS2WCR.lword == CS2WCR_default_CG50 && BSC.CS3BCR.lword == 0x24924400 &&
+ BSC.CS3WCR.lword == CS3WCR_default_CG50 && BSC.CS5ABCR.lword == CS5aBCR_default_CG50 && BSC.CS5AWCR.lword == CS5aWCR_default_CG50) return OC_PtuneF3;
+
+ // OC_PtuneF4 configuration
+ else if (CPG.FLLFRQ.lword == 0x00004000+900 && CPG.FRQCR.lword == (PLL_32x<<24)+(DIV_2<<20)+(DIV_4<<12)+(DIV_8<<8)+DIV16 && BSC.CS0BCR.lword == 0x24920400 &&
+ BSC.CS0WCR.lword == 0x000002C0 && BSC.CS2BCR.lword == 0x24923400 && BSC.CS2WCR.lword == CS2WCR_default_CG50 && BSC.CS3BCR.lword == 0x24924400 &&
+ BSC.CS3WCR.lword == CS3WCR_default_CG50 && BSC.CS5ABCR.lword == CS5aBCR_default_CG50 && BSC.CS5AWCR.lword == CS5aWCR_default_CG50) return OC_PtuneF4;
+
+ // OC_PtuneF5 configuration
+ else if (CPG.FLLFRQ.lword == 0x00004000+900 && CPG.FRQCR.lword == (PLL_26x<<24)+(DIV_2<<20)+(DIV_4<<12)+(DIV_4<<8)+DIV_8 && BSC.CS0BCR.lword == 0x24920400 &&
+ BSC.CS0WCR.lword == 0x00000440 && BSC.CS2BCR.lword == 0x24923400 && BSC.CS2WCR.lword == CS2WCR_default_CG50 && BSC.CS3BCR.lword == 0x24924400 &&
+ BSC.CS3WCR.lword == CS3WCR_default_CG50 && BSC.CS5ABCR.lword == CS5aBCR_default_CG50 && BSC.CS5AWCR.lword == CS5aWCR_default_CG50) return OC_PtuneF5;
+
+ // Not recognized
+ else return OC_Undefined;
+
+ }
+ else if(gint[HWCALC] == HWCALC_PRIZM)
+ {
+
+ // OC_Default configuration
+ if (CPG.FLLFRQ.lword == FLLFRQ_default_CG10_20 && CPG.FRQCR.lword == FRQCR_default_CG10_20 && BSC.CS0BCR.lword == CS0BCR_default_CG10_20 && BSC.CS0WCR.lword == CS0WCR_default_CG10_20 &&
+ BSC.CS2BCR.lword == CS2BCR_default_CG10_20 && BSC.CS2WCR.lword == CS2WCR_default_CG10_20 && BSC.CS3BCR.lword == CS3BCR_default_CG10_20 && BSC.CS3WCR.lword == CS3WCR_default_CG10_20 &&
+ BSC.CS5ABCR.lword == CS5aBCR_default_CG10_20 && BSC.CS5AWCR.lword == CS5aWCR_default_CG10_20 ) return OC_Default;
+
+ // OC_PtuneF2 configuration
+ else if (CPG.FLLFRQ.lword == 0x00004000+900 && CPG.FRQCR.lword == (PLL_32x<<24)+(DIV_8<<20)+(DIV16<<12)+(DIV16<<8)+DIV32 && BSC.CS0BCR.lword == 0x04900400 &&
+ BSC.CS0WCR.lword == 0x00000140 && BSC.CS2BCR.lword == 0x04903400 && BSC.CS2WCR.lword == 0x000100C0 && BSC.CS3BCR.lword == CS3BCR_default_CG10_20 &&
+ BSC.CS3WCR.lword == CS3WCR_default_CG10_20 && BSC.CS5ABCR.lword == CS5aBCR_default_CG10_20 && BSC.CS5AWCR.lword == CS5aWCR_default_CG10_20 ) return OC_PtuneF2;
+
+ // OC_PtuneF3 configuration
+ else if (CPG.FLLFRQ.lword == 0x00004000+900 && CPG.FRQCR.lword == (PLL_32x<<24)+(DIV_4<<20)+(DIV_8<<12)+(DIV_8<<8)+DIV32 && BSC.CS0BCR.lword == 0x24900400 &&
+ BSC.CS0WCR.lword == 0x000002C0 && BSC.CS2BCR.lword == 0x04903400 && BSC.CS2WCR.lword == 0x000201C0 && BSC.CS3BCR.lword == CS3BCR_default_CG10_20 &&
+ BSC.CS3WCR.lword == CS3WCR_default_CG10_20 && BSC.CS5ABCR.lword == CS5aBCR_default_CG10_20 && BSC.CS5AWCR.lword == CS5aWCR_default_CG10_20 ) return OC_PtuneF3;
+
+ // OC_PtuneF4 configuration
+ else if (CPG.FLLFRQ.lword == 0x00004000+900 && CPG.FRQCR.lword == (PLL_32x<<24)+(DIV_4<<20)+(DIV_4<<12)+(DIV_4<<8)+DIV32 && BSC.CS0BCR.lword == 0x44900400 &&
+ BSC.CS0WCR.lword == 0x00000440 && BSC.CS2BCR.lword == 0x04903400 && BSC.CS2WCR.lword == 0x00040340 && BSC.CS3BCR.lword == CS3BCR_default_CG10_20 &&
+ BSC.CS3WCR.lword == CS3WCR_default_CG10_20 && BSC.CS5ABCR.lword == CS5aBCR_default_CG10_20 && BSC.CS5AWCR.lword == CS5aWCR_default_CG10_20 ) return OC_PtuneF4;
+
+ // OC_PtuneF5 configuration
+ else if (CPG.FLLFRQ.lword == 0x00004000+900 && CPG.FRQCR.lword == (PLL_26x<<24)+(DIV_2<<20)+(DIV_4<<12)+(DIV_4<<8)+DIV16 && BSC.CS0BCR.lword == 0x34900400 &&
+ BSC.CS0WCR.lword == 0x000003C0 && BSC.CS2BCR.lword == 0x04903400 && BSC.CS2WCR.lword == 0x000402C0 && BSC.CS3BCR.lword == CS3BCR_default_CG10_20 &&
+ BSC.CS3WCR.lword == CS3WCR_default_CG10_20 && BSC.CS5ABCR.lword == CS5aBCR_default_CG10_20 && BSC.CS5AWCR.lword == CS5aWCR_default_CG10_20) return OC_PtuneF5;
+
+ // Not recognized
+ else return OC_Undefined;
+ }
+}
+
+
+
// return 0 if no need to change
// return 1 if successful change
// return -1 on error
@@ -271,6 +485,8 @@ int clock_overclock( overclock_level level )
{
uint32_t count=0;
+ if (level==OC_Undefined) return 0;
+
if(gint[HWCALC] == HWCALC_FXCG50 && current_clock_state!=level)
{
cpu_atomic_start();
@@ -279,11 +495,11 @@ int clock_overclock( overclock_level level )
initPphi = getPphi_sh7305(); // we get the current P_Phi_f
getInitialTimersParameters(); // we collect the current TCNT and TCOR
- if (level == OC_Default && current_clock_state!=OC_Default) SetOCDefault(), current_clock_state= OC_Default, overclock_config_changed=true;
- if (level == OC_PtuneF2 && current_clock_state!=OC_PtuneF2) SetOCPtuneF2(), current_clock_state= OC_PtuneF2, overclock_config_changed=true;
- if (level == OC_PtuneF3 && current_clock_state!=OC_PtuneF3) SetOCPtuneF3(), current_clock_state= OC_PtuneF3, overclock_config_changed=true;
- if (level == OC_PtuneF4 && current_clock_state!=OC_PtuneF4) SetOCPtuneF4(), current_clock_state= OC_PtuneF4, overclock_config_changed=true;
- if (level == OC_PtuneF5 && current_clock_state!=OC_PtuneF5) SetOCPtuneF5(), current_clock_state= OC_PtuneF5, overclock_config_changed=true;
+ if (level == OC_Default && current_clock_state!=OC_Default) SetOCDefault_CG50(), current_clock_state= OC_Default, overclock_config_changed=true;
+ if (level == OC_PtuneF2 && current_clock_state!=OC_PtuneF2) SetOCPtuneF2_CG50(), current_clock_state= OC_PtuneF2, overclock_config_changed=true;
+ if (level == OC_PtuneF3 && current_clock_state!=OC_PtuneF3) SetOCPtuneF3_CG50(), current_clock_state= OC_PtuneF3, overclock_config_changed=true;
+ if (level == OC_PtuneF4 && current_clock_state!=OC_PtuneF4) SetOCPtuneF4_CG50(), current_clock_state= OC_PtuneF4, overclock_config_changed=true;
+ if (level == OC_PtuneF5 && current_clock_state!=OC_PtuneF5) SetOCPtuneF5_CG50(), current_clock_state= OC_PtuneF5, overclock_config_changed=true;
newPphi = getPphi_sh7305(); // we get the new P_Phi_f after OC
computeNewTimersParameters( initPphi, newPphi ); // we compute the new TCNT and TCOR as per the new frequency
@@ -295,5 +511,32 @@ int clock_overclock( overclock_level level )
return 1;
}
+ else if(gint[HWCALC] == HWCALC_PRIZM && current_clock_state!=level)
+ {
+ cpu_atomic_start();
+
+ listTimerStatus(); // we list the running timers
+ initPphi = getPphi_sh7305(); // we get the current P_Phi_f
+ getInitialTimersParameters(); // we collect the current TCNT and TCOR
+
+ if (level == OC_Default && current_clock_state!=OC_Default) SetOCDefault_CG10_20(), current_clock_state= OC_Default, overclock_config_changed=true;
+ if (level == OC_PtuneF2 && current_clock_state!=OC_PtuneF2) SetOCPtuneF2_CG10_20(), current_clock_state= OC_PtuneF2, overclock_config_changed=true;
+ if (level == OC_PtuneF3 && current_clock_state!=OC_PtuneF3) SetOCPtuneF3_CG10_20(), current_clock_state= OC_PtuneF3, overclock_config_changed=true;
+ if (level == OC_PtuneF4 && current_clock_state!=OC_PtuneF4) SetOCPtuneF4_CG10_20(), current_clock_state= OC_PtuneF4, overclock_config_changed=true;
+ if (level == OC_PtuneF5 && current_clock_state!=OC_PtuneF5) SetOCPtuneF5_CG10_20(), current_clock_state= OC_PtuneF5, overclock_config_changed=true;
+
+ newPphi = getPphi_sh7305(); // we get the new P_Phi_f after OC
+ computeNewTimersParameters( initPphi, newPphi ); // we compute the new TCNT and TCOR as per the new frequency
+ updateNewTimersParameters(); // we adjust the timers accordingly
+
+ cpu_atomic_end();
+
+ cpg_compute_freq();
+
+ return 1;
+ }
+
+
+
else return 0;
}
diff --git a/src/clock.h b/src/clock.h
index e0459b4..a40f597 100644
--- a/src/clock.h
+++ b/src/clock.h
@@ -8,6 +8,7 @@ extern "C" {
typedef enum
{
+ OC_Undefined = -1, // Mode not recognized as a PTune/FTune configuration (i.e. certainly a user-defined mode)
OC_Default = 0, // Default (118MHz)
OC_PtuneF2 = 1, // 59MHz
OC_PtuneF3 = 2, // 96MHz
@@ -22,6 +23,7 @@ typedef enum
int clock_overclock( overclock_level level );
+overclock_level overclock_detect( void );
#ifdef __cplusplus
}
diff --git a/src/main.cc b/src/main.cc
index e3b4183..8d222c7 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -36,7 +36,7 @@
#define DEBUGXXX 0
#define OVERCLCK_ACTIVABLE 1
-char version[5] = {'V','1','.','0','6'};
+char version[5] = {'V','1','.','0','7'};
extern bopti_image_t player;
@@ -136,6 +136,7 @@ int lastindex=0;
int CC=0; // current curve
int CS=0;
+overclock_level EntryLevel;
void initEverything( void )
@@ -398,9 +399,11 @@ int main(void)
bool canWeAllocate3Mb = false;
#if (OVERCLCK_ACTIVABLE==1)
- //Check if we can overclock i.e. if we have a CG50/Graph 90+E
- if (gint[HWCALC] == HWCALC_FXCG50)
+ if (gint[HWCALC] == HWCALC_FXCG50 || gint[HWCALC] == HWCALC_PRIZM)
+ {
+ EntryLevel = overclock_detect();
isOCPossible = true;
+ }
else
isOCPossible = false;
#endif
@@ -527,8 +530,9 @@ int main(void)
gint_world_switch( GINT_CALL( saveparameters ) );
- if (gint[HWCALC] == HWCALC_FXCG50 && isOCActivated == true) clock_overclock( OC_PtuneF5 );
- else if (gint[HWCALC] == HWCALC_FXCG50 && isOCActivated == false) clock_overclock( OC_Default );
+ if ((gint[HWCALC] == HWCALC_FXCG50 || gint[HWCALC] == HWCALC_PRIZM) && isOCActivated == true) clock_overclock( OC_PtuneF5 );
+ else if ((gint[HWCALC] == HWCALC_FXCG50 || gint[HWCALC] == HWCALC_PRIZM) && isOCActivated == false && EntryLevel != OC_Undefined) clock_overclock( EntryLevel );
+ else if ((gint[HWCALC] == HWCALC_FXCG50 || gint[HWCALC] == HWCALC_PRIZM) && isOCActivated == false && EntryLevel == OC_Undefined) clock_overclock( OC_Default );
}
else if (mode==3)
{
@@ -1169,7 +1173,7 @@ int main(void)
dimage( 198-bigflag.width/2, 112-bigflag.height/2, &bigflag );
- if (ranking!=-1)
+ if (ranking!=-1 || mode==0)
{
dfont(&startseq);
@@ -1371,7 +1375,8 @@ int main(void)
usb_close();
#endif
- if (gint[HWCALC] == HWCALC_FXCG50 && isOCActivated == true) clock_overclock( OC_Default );
+ if ((gint[HWCALC] == HWCALC_FXCG50 || gint[HWCALC] == HWCALC_PRIZM) && isOCActivated == true && EntryLevel != OC_Undefined) clock_overclock( EntryLevel );
+ else if ((gint[HWCALC] == HWCALC_FXCG50 || gint[HWCALC] == HWCALC_PRIZM) && isOCActivated == true && EntryLevel == OC_Undefined) clock_overclock( OC_Default );
delete cam;