X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=gp2x%2Fsoc_pollux.c;h=7e860923d874e58510cf85877f35459b1d134869;hb=39014486f9e50110d23dece007ce4c0ed90d15b1;hp=bbccede900aa1e337ce0e509f3a2554702e0ebf4;hpb=11166a22ce7ec97d1dc4a2ea00da52979eca5b38;p=libpicofe.git diff --git a/gp2x/soc_pollux.c b/gp2x/soc_pollux.c index bbccede..7e86092 100644 --- a/gp2x/soc_pollux.c +++ b/gp2x/soc_pollux.c @@ -29,10 +29,12 @@ #include "soc.h" #include "plat_gp2x.h" +#include "pollux_set.h" #include "../plat.h" static int battdev = -1, mixerdev = -1; static int cpu_clock_allowed; +static unsigned short saved_memtimex[2]; static unsigned int saved_video_regs[2][6]; static unsigned int timer_drift; // count per real second @@ -59,12 +61,33 @@ static int decode_pll(unsigned int reg) return v; } +/* RAM timings */ +static void set_ram_timings(void) +{ + pollux_set_fromenv(memregs, "POLLUX_RAM_TIMINGS"); +} + +static void unset_ram_timings(void) +{ + int i; + + memregs[0x14802>>1] = saved_memtimex[0]; + memregs[0x14804>>1] = saved_memtimex[1] | 0x8000; + + for (i = 0; i < 0x100000; i++) + if (!(memregs[0x14804>>1] & 0x8000)) + break; + + printf("RAM timings reset to startup values.\n"); +} + #define TIMER_BASE3 0x1980 #define TIMER_REG(x) memregl[(TIMER_BASE3 + x) >> 2] static unsigned int gp2x_get_ticks_us_(void) { - TIMER_REG(0x08) = 0x4b; /* run timer, latch value */ + unsigned int div = TIMER_REG(0x08) & 3; + TIMER_REG(0x08) = 0x48 | div; /* run timer, latch value */ return TIMER_REG(0); } @@ -235,6 +258,11 @@ void pollux_init(void) } memregl = (volatile void *)memregs; + saved_memtimex[0] = memregs[0x14802>>1]; + saved_memtimex[1] = memregs[0x14804>>1]; + + set_ram_timings(); + // save video regs of both MLCs save_multiple_regs(saved_video_regs[0], 0x4058, ARRAY_SIZE(saved_video_regs[0])); save_multiple_regs(saved_video_regs[1], 0x4458, ARRAY_SIZE(saved_video_regs[1])); @@ -275,6 +303,9 @@ void pollux_init(void) TIMER_REG(0x44) = ((timer_div - 1) << 4) | 2; /* using PLL1 */ TIMER_REG(0x40) = 0x0c; /* clocks on */ TIMER_REG(0x08) = 0x68 | timer_div2; /* run timer, clear irq, latch value */ + + gp2x_get_ticks_ms = gp2x_get_ticks_ms_; + gp2x_get_ticks_us = gp2x_get_ticks_us_; } else { fprintf(stderr, "warning: could not make use of timer\n"); @@ -296,15 +327,14 @@ void pollux_init(void) plat_target.cpu_clock_set = pollux_cpu_clock_set; plat_target.bat_capacity_get = pollux_bat_capacity_get; plat_target.step_volume = step_volume; - - gp2x_get_ticks_ms = gp2x_get_ticks_ms_; - gp2x_get_ticks_us = gp2x_get_ticks_us_; } void pollux_finish(void) { timer_cleanup(); + unset_ram_timings(); + restore_multiple_regs(0x4058, saved_video_regs[0], ARRAY_SIZE(saved_video_regs[0])); restore_multiple_regs(0x4458, saved_video_regs[1],