X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=gp2x%2Fpollux_set.c;h=0af6468b7b56c8dcc54e696fe970b00545f47962;hb=HEAD;hp=fc60b27b3143bd1253ed443355dc28a00d18a3f7;hpb=fa8d133192876a802fbac43c0a0bfe4f5f85b682;p=libpicofe.git diff --git a/gp2x/pollux_set.c b/gp2x/pollux_set.c index fc60b27..0af6468 100644 --- a/gp2x/pollux_set.c +++ b/gp2x/pollux_set.c @@ -196,8 +196,8 @@ static int apply_cpuclk(volatile unsigned short *memregs, void *data) { volatile unsigned int *memregl = (volatile void *)memregs; int mhz = *(int *)data; - int mdiv, pdiv, sdiv = 0; - int i, v; + int adiv, mdiv, pdiv, sdiv = 0; + int i, vf000, vf004; // m = MDIV, p = PDIV, s = SDIV #define SYS_CLK_FREQ 27 @@ -205,13 +205,21 @@ static int apply_cpuclk(volatile unsigned short *memregs, void *data) mdiv = (mhz * pdiv) / SYS_CLK_FREQ; if (mdiv & ~0x3ff) return -1; - v = (pdiv<<18) | (mdiv<<8) | sdiv; + vf004 = (pdiv<<18) | (mdiv<<8) | sdiv; - memregl[0xf004>>2] = v; + // attempt to keep AHB the divider close to 250, but not higher + for (adiv = 1; mhz / adiv > 250; adiv++) + ; + + vf000 = memregl[0xf000>>2]; + vf000 = (vf000 & ~0x3c0) | ((adiv - 1) << 6); + memregl[0xf000>>2] = vf000; + memregl[0xf004>>2] = vf004; memregl[0xf07c>>2] |= 0x8000; for (i = 0; (memregl[0xf07c>>2] & 0x8000) && i < 0x100000; i++) ; + printf("clock set to %dMHz, AHB set to %dMHz\n", mhz, mhz / adiv); return 0; } @@ -329,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 #include