diff options
Diffstat (limited to 'backends/gp32/gp32std.cpp')
-rw-r--r-- | backends/gp32/gp32std.cpp | 103 |
1 files changed, 98 insertions, 5 deletions
diff --git a/backends/gp32/gp32std.cpp b/backends/gp32/gp32std.cpp index 1a62cb13dc..bacf232310 100644 --- a/backends/gp32/gp32std.cpp +++ b/backends/gp32/gp32std.cpp @@ -158,6 +158,10 @@ GPFILE *gp_fopen(const char *fileName, const char *openMode) { file->cachePos = 0; mode = OPEN_W; err = GpFileCreate(fileName, ALWAYS_CREATE, &file->handle); + } else if(tolower(openMode[0]) == 'a') { + warning("We do not support 'a' file open mode."); + free(file); + return NULL; } else { error("wrong file mode"); } @@ -183,7 +187,7 @@ int gp_fclose(GPFILE *stream) { /* if (*(uint32 *)((char *)stream - sizeof(uint32)) == 0x4321) { debug(0, "Double closing", __FUNCTION__); return 1; - } // return 1 ?? + } */ if (stream->cachePos) { @@ -214,6 +218,7 @@ int gp_fseek(GPFILE *stream, long offset, int whence) { return GpFileSeek(stream->handle, whence, offset, (long *)&dummy); } +//TODO: read cache size_t gp_fread(void *ptr, size_t size, size_t n, GPFILE *stream) { ulong readcount = 0; ERR_CODE err = GpFileRead(stream->handle, ptr, size * n, &readcount); //fixme? size*n @@ -483,6 +488,94 @@ void gp_delay(uint32 msecs) { while (GpTickCountGet() < startTime + msecs); } +void gp_clockSpeedChange(int freq, int magic, int div) { + #define rTCFG0 (*(volatile unsigned *)0x15100000) + #define rTCFG1 (*(volatile unsigned *)0x15100004) + #define rTCNTB4 (*(volatile unsigned *)0x1510003c) + unsigned int pclk; + unsigned int prescaler0; + + // Change CPU Speed + GpClockSpeedChange(freq, magic, div); + pclk = GpPClkGet(); + + // Repair SDK timer - it forgets to set prescaler + prescaler0 = (pclk / (8000 * 40)) - 1; + rTCFG0 = (rTCFG0 & 0xFFFFFF00) | prescaler0; + rTCFG1 = 0x30033; + + // Repair GpTickCountGet + rTCNTB4 = pclk / 1600; +} + +void gp_setCpuSpeed(int freq) { + // Default value for 40 mhz + static int CLKDIV = 0x48013; + static int MCLK = 40000000; + static int CLKMODE = 0; + static int HCLK = 40000000; + static int PCLK = 40000000; + + switch (freq) { + // overclocked + case 168: { CLKDIV = 0x14000; MCLK = 168000000; CLKMODE = 3; break; } + case 172: { CLKDIV = 0x23010; MCLK = 172000000; CLKMODE = 3; break; } + case 176: { CLKDIV = 0x24010; MCLK = 176000000; CLKMODE = 3; break; } + case 180: { CLKDIV = 0x16000; MCLK = 180000000; CLKMODE = 3; break; } + case 184: { CLKDIV = 0x26010; MCLK = 184000000; CLKMODE = 3; break; } + case 188: { CLKDIV = 0x27010; MCLK = 188000000; CLKMODE = 3; break; } + case 192: { CLKDIV = 0x18000; MCLK = 192000000; CLKMODE = 3; break; } + case 196: { CLKDIV = 0x29010; MCLK = 196000000; CLKMODE = 3; break; } + case 200: { CLKDIV = 0x2A010; MCLK = 200000000; CLKMODE = 3; break; } + case 204: { CLKDIV = 0x2b010; MCLK = 204000000; CLKMODE = 3; break; } + case 208: { CLKDIV = 0x2c010; MCLK = 208000000; CLKMODE = 3; break; } + case 212: { CLKDIV = 0x2d010; MCLK = 212000000; CLKMODE = 3; break; } + case 216: { CLKDIV = 0x2e010; MCLK = 216000000; CLKMODE = 3; break; } + case 220: { CLKDIV = 0x2f010; MCLK = 220000000; CLKMODE = 3; break; } + case 224: { CLKDIV = 0x30010; MCLK = 224000000; CLKMODE = 3; break; } + case 228: { CLKDIV = 0x1e000; MCLK = 228000000; CLKMODE = 3; break; } + case 232: { CLKDIV = 0x32010; MCLK = 232000000; CLKMODE = 3; break; } + case 236: { CLKDIV = 0x33010; MCLK = 236000000; CLKMODE = 3; break; } + case 240: { CLKDIV = 0x20000; MCLK = 240000000; CLKMODE = 3; break; } + case 244: { CLKDIV = 0x35010; MCLK = 244000000; CLKMODE = 3; break; } + case 248: { CLKDIV = 0x36010; MCLK = 248000000; CLKMODE = 3; break; } + case 252: { CLKDIV = 0x22000; MCLK = 252000000; CLKMODE = 3; break; } + case 256: { CLKDIV = 0x38010; MCLK = 256000000; CLKMODE = 3; break; } + + // normal +// case 166: { CLKDIV = 0x4B011; MCLK = 166000000; CLKMODE = 3; break; } + case 166: { CLKDIV = 0x2f001; MCLK = 165000000; CLKMODE = 3; break; } + case 164: { CLKDIV = 0x4a011; MCLK = 164000000; CLKMODE = 3; break; } + case 160: { CLKDIV = 0x48011; MCLK = 160000000; CLKMODE = 3; break; } + case 156: { CLKDIV = 0x2c001; MCLK = 156000000; CLKMODE = 3; break; } + case 144: { CLKDIV = 0x28001; MCLK = 144000000; CLKMODE = 3; break; } + case 133: { CLKDIV = 0x51021; MCLK = 133500000; CLKMODE = 2; break; } + case 132: { CLKDIV = 0x3a011; MCLK = 132000000; CLKMODE = 3; break; } + case 120: { CLKDIV = 0x24001; MCLK = 120000000; CLKMODE = 2; break; } + case 100: { CLKDIV = 0x2b011; MCLK = 102000000; CLKMODE = 2; break; } + case 66: { CLKDIV = 0x25002; MCLK = 67500000; CLKMODE = 2; break; } + case 50: { CLKDIV = 0x2a012; MCLK = 50000000; CLKMODE = 0; break; } +// case 40: { CLKDIV = 0x48013; MCLK = 40000000; CLKMODE = 0; break; } + case 40: { CLKDIV = 0x48013; MCLK = 40000000; CLKMODE = 1; break; } +// case 33: { CLKDIV = 0x25003; MCLK = 33750000; CLKMODE = 0; break; } + case 33: { CLKDIV = 0x25003; MCLK = 33750000; CLKMODE = 2; break; } + case 22: { CLKDIV = 0x33023; MCLK = 22125000; CLKMODE = 0; break; } + default: + error("Invalid CPU frequency!"); + } + if (CLKMODE == 0) { HCLK = MCLK; PCLK = MCLK; } + if (CLKMODE == 1) { HCLK = MCLK; PCLK = MCLK / 2; } + if (CLKMODE == 2) { HCLK = MCLK / 2; PCLK = MCLK / 2; } + if (CLKMODE == 3) { HCLK = MCLK / 2; PCLK = MCLK / 4; } + + gp_clockSpeedChange(MCLK, CLKDIV, CLKMODE); +} + +void gp_Reset() { + gp_setCpuSpeed(66); + asm volatile("swi #4\n"); +} + void gp_exit(int code) { if (!code) { printf(" ----------------------------------------"); @@ -521,7 +614,7 @@ void NP(const char *fmt, ...) { va_end(marker); _dprintf("NP:%s", s); - //gp_delay(50); + gp_delay(50); } void LP(const char *fmt, ...) { @@ -534,7 +627,7 @@ void LP(const char *fmt, ...) { va_end(marker); _dprintf("LP:%s", s); - //gp_delay(300); + gp_delay(300); } void SP(const char *fmt, ...) { @@ -547,7 +640,7 @@ void SP(const char *fmt, ...) { va_end(marker); _dprintf("SP:%s", s); - //gp_delay(50); + gp_delay(50); } void BP(const char *fmt, ...) { @@ -560,5 +653,5 @@ void BP(const char *fmt, ...) { va_end(marker); _dprintf("BP:%s", s); - //gp_delay(2000); + gp_delay(2000); } |