gp2x: pollux: bring back ram timings

This commit is contained in:
notaz 2013-10-04 03:14:02 +03:00
parent 11166a22ce
commit 9a5a0dc9ff
3 changed files with 46 additions and 0 deletions

View file

@ -337,6 +337,21 @@ again:
return 0;
}
int pollux_set_fromenv(volatile unsigned short *memregs,
const char *env_var)
{
const char *set_string;
int ret = -1;
set_string = getenv(env_var);
if (set_string)
ret = pollux_set(memregs, set_string);
else
printf("env var %s not defined.\n", env_var);
return ret;
}
#ifdef BINARY
#include <sys/types.h>
#include <sys/stat.h>

View file

@ -4,6 +4,8 @@ extern "C"
#endif
int pollux_set(volatile unsigned short *memregs, const char *str);
int pollux_set_fromenv(volatile unsigned short *memregs,
const char *env_var);
#ifdef __cplusplus
}

View file

@ -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,6 +61,26 @@ 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]
@ -235,6 +257,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]));
@ -305,6 +332,8 @@ 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],