CPU Frequency
From wiki.gp2x.org
You use the IO-registers as usual to set the CPU. The setting bit below was more or less taken from sdk2x.
void hw_set_cpu(int speed)
{
int m = 0;
// Calculating the FPLL value from frequency is a bit complex
// so we just use some known-to-work values instead.
switch(speed)
{
case 250: m = 0x5D04; break;
case 225: m = 0x5304; break;
case 200: m = 0x4904; break;
case 175: m = 0x3F04; break;
case 150: m = 0x4901; break;
case 125: m = 0x3c01; break;
case 100: m = 0x6502; break;
case 75: m = 0x4902; break;
case 50: m = 0x6503; break;
}
if(m)
{
// Get interupt flags
unsigned int l = memregs32[0x808>>2];
// Turn off interrupts
memregs32[0x808>>2] = 0xFF8FFFE7;
// Set new clock frequency
memregs16[0x910>>1]=m;
// Wait for it to take
while(memregs16[0x0902>>1] & 1);
// Turn on interrupts again
memregs32[0x808>>2] = l;
}
}
This routine seems to work for every clockspeed.
#define SYS_CLK_FREQ 7372800
void SetClock(unsigned int MHZ)
{
#ifdef GP2X
unsigned int v;
unsigned int mdiv,pdiv=3,scale=0;
MHZ*=1000000;
mdiv=(MHZ*pdiv)/SYS_CLK_FREQ;
mdiv=((mdiv-8)<<8) & 0xff00;
pdiv=((pdiv-2)<<2) & 0xfc;
scale&=3;
v = mdiv | pdiv | scale;
unsigned int l = memregs32[0x808>>2];// Get interupt flags
memregs32[0x808>>2] = 0xFF8FFFE7; //Turn off interrupts
memregs16[0x910>>1]=v; //Set frequentie
while(memregs16[0x0902>>1] & 1); //Wait for the frequentie to be ajused
memregs32[0x808>>2] = l; //Turn on interrupts
#endif
}
To appropriately set memregs16 and memregs32, see GPIO Programming Example.