1.S5PV210的时钟系统
S5PV210的时钟系统由三个时钟域组成,分别是主时钟(Main System, MSYS),显示相关时钟系统(Display System, DSYS),以及外围设备时钟系统(Periphereal System, PSYS)。MSYS主要是给Cortex A8处理器、 DRAM 内存控制器、3D、内部 SRAM、INTC以及配置接口SPERI用的,最高可达到200MHz;DSYS主要是给显示相关的模块用的,如:FIMC、FIMD、JPEG 等,最高可达到 166MHz;PSYS主要用于IO外设用的,如:GPIO、I2C、WDT、UART等,最高可达到133MHz,S5PV210时钟域的整体框架如下图所示:
1.1 各种顶层时钟
.来自外部时钟引脚,分别是XRTCXTI、XXTI、XUSBXTI、XHDMIXTI。.来自时钟管理单元(CMU),例如ARMCLK,HCLK,PCLK等
.来自USB PHY
.来自GPIO引脚
外部时钟引脚XRTCXTI、XXTI、XUSBXTI、XHDMIXTI的时钟分别由外部晶振来提供,处理器也可将外部时钟屏蔽,
XRTCXTI来自XRTCXTI和XRTCXTO,频率是32.768KHZ,主要给RTC提供信号
XXTI:来自XXTI、XXTO引脚,CMU和PLL利用该信号产生时钟信号给其他模块,比如APLL,MPLL,VPLL,EPLL。外部晶振频率在12-50M之间,推荐外部晶振位24M,与IROM基准时钟一致。
XUSBXTI:来自XUSBXTI,XUSBXTO引脚,给APLL,MPLL,VPLL,EPLL以及USB PHY提供时钟信号,推荐外部晶振位24M,理由同上。
XHDMIXTI:来自XHDMIXTI、XHDMIXTO,频率为27M。
.APLL使用FINPLL作为输入时钟来产生30M-1G的时钟
.MPLL使用FINPLL作为输入时钟来产生50M-2G的时钟
.EPLL使用FINPLL作为输入时钟来产生10M-600M的时钟
.VPLL使用FINPLL或者SCLK_HDMI127M作为输入时钟来产生10M-600M的时钟,且产生54M的视频时钟信号。
.USB PHY使用XUSBXTI产生30M和48M的时钟
.HDMI PHY使用XUSBXTI和XHDMIXIT产生54M的时钟。
Cortex A8内核和MSYS时钟域(ARMCLK、HCLK_MSYS、PCLK_PSYS0)一般采用APLL时钟信号源
DSYS,PSYS时钟域(HCLK_DSYS,HCLK_PSYS,PCLK_DSYS,PCLK_PSYS)和外围设备时钟信号(IPs,SPI)则使用MPLL和EPLL作为时钟信号源。
.视频时钟则采用VPLL
1.2 各类时钟频率之间的关系
.主时钟域
图3 主时钟域
.显示相关时钟域
图4 显示相关时钟域
.外围设备时钟域
图5 外围设备时钟域
.高性能应用中的时钟选择
.APLL:用于驱动主时钟域和显示相关时钟域,可产生最高达1GHZ、占空比为49:51的时钟信号。
.MPLL:用来驱动显示相关的时钟域和外围设备的时钟域,可产生最高达2GHZ、占空比为40:60的时钟信号。
.EPLL:主要产生音频时钟信号。
.VPLL:主要用来产生54MHZ的视频时钟信号。
在大部分的情况下,使用APLL来驱动主时钟域,MPLL来驱动显示相关时钟域。
2.PLL的配置、时钟初始化
对于什么是PLL,读者请自行谷歌吧,这边就不说了啊,现在主要来看看APLL和MPLL,其余两个PLL类似,照猫画虎即可。2.1 APLL
APLL主要是为主时钟域和处理器内核提供倍频后的时钟信号,来看看如何设置APLL2.1.1 APLL之锁定时间寄存器APLL_LOCK(0xE010_0000)
APLL的锁定时间与Freq相关,而Freq是指输入时钟信号的频率和分频系数的PDIV的比值,即Freq = FIN / PDIV。
为什么要配置锁定时间呢?这还要从PLL内部说起。。。。因为PLL设置完成过程需要一个起振的过程,这段时间内PLL输出的频率还不稳定,所有需要一定的时间让其输出稳定的倍频后的信号。
#define APLL_LOCK (* (volatile unsigned long *) 0xE0100000);
APLL_LOCK |= 0x00000FFF;
2.1.1 APLL之控制寄存器0 APLL_CON0
假如我要产生一定频率范围的时钟信号,该怎么做?这就必须要靠我们的APLL的控制寄存器APLL_CON了。
APLL的输出时钟信号频率与输入时钟信号频率之间有以下关系:
图9 分频系数计算
举个栗子说吧,假如我期望产生一个900MHZ的时钟输出信号,在输入时钟为24MHZ时,查表可知,可以分别设置PDIV,MDIV,SDIV的值为4, 150, 1,代入公式检验:24*150 /(4 * 2^(1-1))=900MHZ.
具体代码示例:
#define APLL_CON0 (* (volatile unsigned long *) 0xE0100100)
#define APLL_PDIV 0x4
#define APLL_MDIV 0x96
#define APLL_SDIV 0x1
#define set_pll(pdiv, mdiv, sdiv) (1 << 31 | pdiv << 8 | mdiv << 16 | sdiv )
#define APLL_RES set_pll(APLL_PDIV, APLL_MDIV, APLL_SDIV)
APLL_CON0 = APLL_RES;
2.2 MPLL
MPLL的配置和APLL类似,但还是存在着一些差异的,主要体现在输入时钟和输出时钟之间的转换关系不同。其余的设置均一样。
图11 MPLL分频系数
2.3 时钟信号源选择寄存器0 CLK_SRC0时钟信号选择器寄存器主要是用来对处理器各个模块的时钟信号源进行配置,选择需要的时钟信号源作为该模块的时钟输入,在S5PV210中有7个时钟信号源寄存器,这7个寄存器控制着各级模块中输入时钟源的选择。下面拿CLK_SRC0来开刀。
图12 CLK_SRC0寄存器
发现,通过设置CLK_SRC0的相应位,可设置4个PLL的输出时钟的多路选择器以及3个时钟域的输入时钟选择器,根据图7可知,除了时钟信号源多路选择器之外,还存在着许多的分频器,通过分频器,3个时钟域中的时钟信号的频率就可以得出图3-6所描述的关系了。2.4 时钟分频寄存器0 CLK_DIV0
此寄存器主要用来对处理器中的高频时钟信号分频为各种不同频率的时钟信号,以满足不同模块的时钟需求。通过时钟分频寄存器0的相应位,控制着时钟信号MOUT_MSYS与ARMCLK、HCLK_MSYS、PCLK_MSYS、HCLK_DSYS、PCLK_DSYS、HCLK_PSYS、PCLK_PSYS之间频率的比例关系。
3.顶层时钟初始化流程
遵循的原则:所有无波形干扰的多路选择器输入必须处于工作状态一旦某个PLL停止工作,它的输出时钟不能被选择器作为其他模块的输入时钟,也就是说,PLL必须处于有效状态。
时钟初始化基本流程:使能PLL --> 配置PLL的锁定时间 --> 选择PLL输出时钟 --> 设置PLL的分频系数P、M、S --> 改变系统时钟的分频系数 --> 改变特殊时钟的分频系数
时钟的介绍就到此为止吧。