Change_freq

Synopsis #

This routine will effectively change the speed of the operating PLL circuit.

Definition #

#define PLL_24x 0b010111 // 87 MHz
#define PLL_18x 0b010001 // 65.25 MHz
#define PLL_16x 0b001111 // 58 MHz (NORMAL SPEED)
#define PLL_15x 0b001110 // 54.37 MHz
#define PLL_12x 0b001011 // 43.5 MHz
#define PLL_8x  0b000111 // 29 MHz
#define PLL_6x  0b000101 // 21.75 MHz
#define PLL_4x  0b000011 // 14.5 MHz
#define PLL_3x  0b000010 // 10.8 MHz
#define PLL_2x  0b000001 // 7.25 MHz
#define PLL_1x  0b000000 // 3.6 MHz

void change_freq(int mult) {
    __asm__(
        "mov r4, r0\n\t"
        "and #0x3F, r0\n\t" 
        "shll16 r0\n\t" 
        "shll8 r0\n\t" 
        "mov.l frqcr, r1\n\t"  
        "mov.l pll_mask, r3\n\t"  
        "mov.l @r1, r2\n\t"  
        "and r3, r2\n\t"  
        "or r0, r2\n\t" 
        "mov.l r2, @r1\n\t" 
        "mov.l frqcr_kick_bit, r0\n\t" 
        "mov.l @r1, r2\n\t"
        "or r0, r2\n\t"
        "rts\n\t"
        "mov.l r2, @r1\n\t"
        ".align 4\n\t"
        "frqcr_kick_bit: .long 0x80000000\n\t"
        "pll_mask: .long 0xC0FFFFFF\n\t" 
        "frqcr: .long 0xA4150000\n\t"
    );
}

Inputs #

None

Outputs #

None

Comments #

Notes: PLEASE before handling MENU keypresses in your add-in, use PLL_16x to go back to normal operating speed, at the courtesy of other applications and the OS. Feeding a value not defined below (AKA, an invalid value), will cause a crash.