本文转载自:http://www.cnblogs.com/humaoxiao/p/4225320.html
—————————————————————————————--------
本文解决的问题:
1、宏观上几个大模块的时钟配置顺序。
2、小模块的时钟选择、分频和一般的配置顺序。
3、对小模块来说,官方手册推荐的时钟源选择问题。
4、本文只以手册的“
推荐配置”进行说明,“自由玩法”不保证稳定性。
—————————————————————————————--------
多路选择器选择原则:
1、尽量保持默认配置不动。
2、尽量选择前端频率最高的源。
3、其它手册要求的特殊情况。
—————————————————————————————--------
几个符号:
左边深色的:
无抖动多路选择器,无抖动意味着在多路选择切换的瞬间,下游时钟就可以稳定下来。需要注意是在切换时要保证上游时钟已经存在并稳定,不然下游时钟状态不确定。
右边浅色的:
有抖动多路选择器,意味着多路选择切换后,要经历一段时间的不稳定时间,但是有稳定后有相应寄存器标志位标示下游时钟已经稳定,这类指示寄存器器一般以
CLK_MUX_STAT开头。
—————————————————————————————--------
全局约束条件:
1、无抖动多路选择器的时钟源需要存在并且稳定。
2、当某个PLL被设置为关闭状态,是不可以使用它的输出信号的。
—————————————————————————————--------
晶振说明:
由于一般USB IP核需要直接使用高精度时钟,所以在XUSBXTI引脚上接24M晶振,XXTI引脚就不需要接了。手册上说由于iROM代码是根据24M晶振频率设计的,所以24M的选择没什么好说的。
—————————————————————————————--------
一、时钟之源PLL配置
原因:根据全局约束条件2,如果PLL关闭那么不可以使用它的输出,再根据全局约束条件1,多路选择器此时只能选择外部时钟!而24M的时钟直接作为系统的时钟显然是不合适的!
4412有4个PLL:
APLL, MPLL, EPLL, and VPLL。推荐使用24M外部晶振作为它们的时钟源。
理论上讲,4个PLL均可以在22 ~ 1400MHz之间自由设置,但是手册强烈推荐的频率范围为:
—————————————————————————————--------
APLL & MPLL:200 ~ 1400MHz
EPLL:90 ~ 416MHz
VPLL:100 ~ 440MHz
—————————————————————————————--------
1.0 设置PLL_LOCKTIME
PLL频率从小变到指定频率需要一段时间(图中标红框的部分虽然不是PLL实际波形但可以参考着理解),当PLL频率在变化的时候,比如由复位后的初始的400MHz升到1000MHz, 这时,首先把CPU的频率锁定,因这此时CPU的频率是变化的,频率变化,CPU的状态就无法确定,所以,此时用 PLL_LOCKTIME 将CPU频率锁定一段时间,直到频率输出稳定为止。芯片手册上显示APLL最大的锁定时间为100us(Table 60 -9),如果外部晶振是24MHz,100us换算成tick就是2400个tick,所以
APLL_LOCK(Address:0x1004_4000)寄存器该写入0x960
MPLL_LOCK(Address:0x1004_0008)寄存器该写入0x190
EPLL_LOCK(Address:0x1003_C010)寄存器该写入0xBB8
VPLL_LOCK(Address:0x1003_C020)寄存器该写入0x190
1.1 APLL & MPLL的倍频值:
设定对应寄存器的 P、M、S 三个值,不同的搭配最终频率不同,无须自己计算,系统推荐的搭配如下:
1.2 EPLL的倍频值:
设定对应寄存器的 P、M、S、K 四个值,不同的搭配最终频率不同,无须自己计算,系统推荐的搭配如下:
1.3 VPLL的倍频值
设定对应寄存器的 P、M、S、K 四个值,不同的搭配最终频率不同,无须自己计算,系统推荐的搭配如下:
1.4 等待PLL稳定
如果PLL输出稳定了,那么PLL_CON0的Bit[29]会由0变1。
查询用汇编实现,以APLL为例:
/*———————————————————————*/
wait_pll_lock:
ldr r1, [r0, r2]
tst r1, #(1<<29)
beq wait_pll_lock
mov pc, lr
ldr r0, =CMU_BASE /* 0x10030000 */
ldr r2, =APLL_CON0_OFFSET /* 0x14100 */
bl wait_pll_lock
/*———————————————————————*/
二、主要模块的初始化顺序
虽然官方文档中并没有强制按下面的顺序初始化,但是按照逻辑来讲,是应该使用这个顺序的。
locktime -> pll -> mux -> div
cpi -> dmc -> top -> leftbus -> rightbus
上个直观点的图:
三、上游多路选择器的配置
上游多路选择器决定下游模块的时钟源,CMU_CPU有4个MUX,CMU_DMC有四个MUX,CMU_TOP有14个MUX,CMU_LEFTBUS有2个MUX,CMU_RIGHTBUS有2个MUX。
当然下游还有其它非常多的MUX,先搁置一下暂且不说。
3.1 CMU_CPU MUXs配置
CMU_CPU有4个MUX,配置寄存器CLK_SRC_CPU,基地址0x1004_4200。配置完成后,最靠近PLL的两个MUX均切换时钟源至PLL。
CMU_DMC有8个MUX,配置寄存器CLK_SRC_DMC,基地址0x1004_0200。配置完成后,最靠近PLL的一个MUX切换时钟源至PLL。
CMU_TOP有13个MUX,配置寄存器CLK_SRC_TOP0 CLK_SRC_TOP1,基地址0x1003_C210 0x1003_C214。
3.4 CMU_LEFTBUS & CMU_RIGHTBUS MUXs配置
CMU_LEFTBUS & CMU_LEFTBUS各有2个MUX,配置寄存器CLK_SRC_LEFTBUS CLK_SRC_RIGHTBUS,基地址0x1003_4200 0x1003_8200。
分频器的位置一般在MUX之后,通常是一个MUX,但如果需要旁路时钟输出,可能需要两个或更多个分频器级连来获取最终的频率。
分频器设置的前提条件(手册并无强制要求,根据各种约束条件获得,有疑问留言讨论):
1、如果分频器上级还有分频器,请首先保证上级分频器频率已稳定,一直确认到上级是MUX为止。
2、确认上级级连的一个或多个MUX已使能且输出稳定,一直确认到上级是APLL MPLL EPLL VPLL这四个PLL为止。
3、确认APLL MPLL EPLL VPLL已使能且输出稳定。
分频器设置时,必然会影响与它相连的所有IP核,所以个人认为设置分频器时,应保证下游IP核停止工作,待分频器稳定后再重新初始化下游IP核。
按照PLL -> MUX ->分频器的顺序举例说明。
5.1 PLLLOCKTIME
APLL_LOCK(Address:0x1004_4000)寄存器该写入0x00000960
MPLL_LOCK(Address:0x1004_0008)寄存器该写入0x00000190
EPLL_LOCK(Address:0x1003_C010)寄存器该写入0x00000BB8
VPLL_LOCK(Address:0x1003_C020)寄存器该写入0x00000190
5.2 PLL
APLL 1000MHz : APLL_CON0:0x10044100 写入 0x807D0300
APLL_CON1:0x10044104 bit[22] 写入 0 ,默认值
注:为什么此时APLL一般不设置到1400MHz?因为ARM_CORE从APLL取时钟,但是此时电源管理芯片上电默认给ARM_CORE只提供1.1V的电压,反查手册后发现在1.1V下,ARM核最高只能运行在1000MHz,要想运行在1400MHz需要设置电源管理芯片输出1.4V电压。
MPLL 800MHz : MPLL_CON0:0x10040108 写入 0x80640300
MPLL_CON1:0x1004010C bit[22] 写入 0 ,默认值
EPLL 400MHz : EPLL_CON0:0x1003C110 写入 0x80640301
EPLL_CON1:0x1003C114 写入 0x66010000 ,默认值
EPLL_CON2:
0x1003C118 写入 0x00000080 ,默认值
VPLL 100MHz : VPLL_CON0:0x1003C120 写入 0x80640303
VPLL_CON1:0x1003C124 写入 0x66016000 ,默认值
VPLL_CON2:0x1003C128 写入 0x00000080 ,默认值
5.3 MUX
按照3.1 - 3.4节配置后的通路。
CMU_CPU:CLK_SRC_CPU :0x10044200 寄存器写入 0x01000001
CMU_DMC:CLK_SRC_DMC :0x10040200 寄存器写入 0x00011000
CMU_TOP:CLK_SRC_TOP0:0x1003C210 寄存器写入 0x00000110
CLK_SRC_TOP1:0x1003C214 寄存器写入 0x00011000
CMU_LEFTBUS :CLK_SRC_LEFTBUS :0x10034200 寄存器写入 0x00000010
CMU_RIGHTBUS:CLK_SRC_RIGHTBUS:0x10038200 寄存器写入 0x00000010
5.4 分频器
5.4.1 LEFTBUS
CLK_DIV_LEFTBUS:0x10034500 寄存器写入 0x00000013
,这样ACLK_GDL = 200MHz ACLK_GPL = 100MHz。
5.4.2 RIGHTBUS
CLK_DIV_RIGHTBUS:0x10038500 寄存器写入 0x00000013,这样ACLK_GDR = 200MHz ACLK_GPR = 100MHz。
5.4.3 DMC
CLK_DIV_DMC0:0x10040500 寄存器写入 0x00111113
CLK_DIV_DMC1:0x10040504 寄存器写入 0x01011113
这样,
ACLK_ACP = 200MHz
PCLK_ACP = 100MHz
SCLK_DPHY = 400MHz
SCLK_DMC (DDR时钟) = 400MHz
ACLK_DMCD = 200MHz
ACLK_DMCP = 100MHz
SCLK_G2D_ACP = 200MHz
SCLK_C2C = 400MHz
ACLK_C2C = 200MHz
SCLK_PWI = 12MHz
5.4.4 CPU
CLK_DIV_CPU0:0x10044500寄存器写入 0x01143730
CLK_DIV_CPU1:0x10044504寄存器写入 0x00000004
5.4.5 TOP
CLK_DIV_TOP:0x1003C510 寄存器写入 0x01205473
至此,时钟所有配置结束。
参考资料:《Exynos 4412
SCP User’s Manual Rev 0.10》。
感谢:迅为u-boot相关代码。
来源于http://www.cnblogs.com/humaoxiao,转载请注明出处。