[U-Boot-Users] RE: changing core frequency in omap 5912

Hiroki Kaminaga kaminaga at sm.sony.co.jp
Wed Feb 15 07:14:27 CET 2006


Hi,

> So here is what you need to do:
> 
> 1). Make sure the DPLL1 is in bypass
> 2). Configure the ARM_SYSST for "synchronous scalable" mode
> 3). Configure the ARM_CKCTL register so that the different clock domains
> operate no faster than the maximum speed for that particular domain. See
> "OMAP5912 Global Clock Rules" in the OMAP5912 Errata guide for a list
> showing the maximum speed for each clock domain
> (http://focus.ti.com/docs/prod/folders/print/omap5912.html)
> 4). Configure DPLL1. 

Thank you!

I tried below code, (in temporary cmd in u-boot):

        /* register address */
#define CLKGEN_REG_BASE         (0xfffece00)
#define REG_ARM_CKCTL           (CLKGEN_REG_BASE + 0x0)
#define REG_ARM_IDLECT1         (CLKGEN_REG_BASE + 0x4)
#define REG_ARM_IDLECT2         (CLKGEN_REG_BASE + 0x8)
#define REG_ARM_EWUPCT          (CLKGEN_REG_BASE + 0xC)
#define REG_ARM_RSTCT1          (CLKGEN_REG_BASE + 0x10)
#define REG_ARM_RSTCT2          (CLKGEN_REG_BASE + 0x14)
#define REG_ARM_SYSST           (CLKGEN_REG_BASE + 0x18)
#define REG_ARM_IDLECT3         (CLKGEN_REG_BASE + 0x24)
#define REG_ARM_DPLL1           (0xfffecf00)
        /* register set value */
#define VAL_ARM_SYSST           (0x1000)
#define VAL_ARM_DPLL1           (0x2810)
#define VAL_ARM_CKCTL           (0x050f)
#define VAL_ARM_IDLECT1         (0x0400)
#define VAL_ARM_IDLECT2         (0x0000)
        /* ARM_IDLECT2 bit shifts */
#define EN_WDTCK        0
#define EN_XORPCK       1
#define EN_PERCK        2
#define EN_LCDCK        3
#define EN_LBCK         4 /* Not on 1610/1710 */
/*#define EN_HSABCK     5*/
#define EN_APICK        6
#define EN_TIMCK        7

...

	*(short *)REG_ARM_SYSST = VAL_ARM_SYSST;
	{ /* busy loop wait finish bubbles */
		int i = 0x400;
		while (i--) ;
	}
	*(short *)REG_ARM_DPLL1 = VAL_ARM_DPLL1;
	{ /* busy loop wait to let it settle */
		int i = 10;
		while (i--) ;
	}
	*(short *)REG_ARM_CKCTL = VAL_ARM_CKCTL;
	*(short *)REG_ARM_CKCTL &= 0xfff;
	*(short *)REG_ARM_RSTCT1 = 0x0;
	*(short *)REG_ARM_RSTCT2 = 0x1; /* PER_EN bit */
	*(short *)REG_ARM_IDLECT1 = VAL_ARM_IDLECT1;

	*(short *)REG_ARM_IDLECT2 |= EN_PERCK;
	*(short *)REG_ARM_IDLECT2 |= EN_XORPCK;
	*(short *)REG_ARM_IDLECT2 |= EN_TIMCK;

	{ /* busy loop wait finish bubbles */
		int i = 0x400;
		while (i--) ;
	}

and seems working:

(ARM CKCTL register content)
OMAP5912 OSK # md.l fffece00
fffece00: 0000050f 00000400 000003ff 0000003f    ............?...
fffece10: 00000000 00000001 00001000 00000015    ................
fffece20: 00000000 00000015 0000ffff 0000ffff    ................
...
(ARM DPLL1 register content)
OMAP5912 OSK # md.l fffecf00
fffecf00: 00002813 2b58c02f 00010000 00000000    .(../.X+........


I'm not sure about the amount and place of delay I need though...
(I set delay referencing board/omap5912osk/lowlevel_init.S)

# Also, is there any simpler method to read ARM926EJS cpu speed?


Best Regards,

HK.
--




More information about the U-Boot mailing list