Tiny210 U-BOOT(二)--配置时钟频率基本原理

时间:2022-10-17 06:54:49

CPU时钟、NAND FLASH、DDR、串口、网卡至少这些硬件,是我们需要在u-boo的启动过程中完成初始化的,其余的细节问题先不说了。必竟前面的这些硬件,是u-boot在启动过程,做自搬移和最终引导内核前必须要用到的。为了理解u-boot源码中那些硬件操作汇编代码,我们先看看这些硬件的工作原理是如何的。

CPU的系统时钟

U-BOOT在启动的过程中,需要配置系统时钟,没有这东西,CPU就跑不起来。
配置系统时钟,大致是以下几个步骤:

(1)设置系统PLL锁定时间
(2)配置PLL
(3)配置各模块分频系数
(4)切换到PLL时钟

以后大家经常要翻的就是S5PV210的芯片手册了,以后说Pxxx页,指的就是S5PV210的芯片手册,这里我使用的是S5PV210_UM_REV1.1的版本,以后的页数都以这个为准。

1.基本原理
首先输出一个高电平,然后通过三个晶振输出一个频率,再然后通过倍频器(锁相环)将频率升高,接着再通过分频,把分出来的不同的频率,提供给不同的器件,比如ARM Cotrex内核、各种设备控制器等等。

Tiny210 U-BOOT(二)--配置时钟频率基本原理

Tiny210(S5PV210)上蓝色的框标注的就是晶振的位置,最上面的是27MHz,中间和下面两颗是24MHz,顺便讲一下另外几片东西,最左边的四片是内存DDR2-800,这表示数据传输频率为800MHz,外部时钟频率200MHz,内部时钟频率为100MHz;下面的黄色框是NAND FLASH,外部时钟频率133MHz。我怎么知道的?大家看了这一章以后,自然就知道怎么查了,别急,耐心往下看

倍频的原理:

Tiny210 U-BOOT(二)--配置时钟频率基本原理

上图就是上电后的XXTI输出的频率变化图(XXTI引脚见P361的系统时钟流程图最左边的XXTI引脚,XXTI的详细介绍见P354的Figure 3-2 S5PV210 Top-Level Clocks),频率从小变到指定频率需要一段时间(图中标红框的部分),当CPU频率在变化的时候(比如由复位后的初始的400HZ,我要升到1000HZ),先要把CPU的频率锁定,因为这时CPU的频率是变化的,频率变化会导致CPU的状态就无法确定,所以,需要用PLL--phase-locked loop锁相环,将CPU频率锁定一段时间,直到我的频率输出稳定为止。芯片手册上显示APLL默认的设置时间为30us(30毫秒锁定时间)。

Tiny210 U-BOOT(二)--配置时钟频率基本原理

锁定频率后,应该设置一个倍频因子,在ARM手册中去查表10.2,P,M,S设置对应的位的值,然后将频率提升,比如从晶振输出的24HZ,抬升到1000Hz。


分频的原理:
设置不同的位,比如,设置某一位为0当分频时,原来频率为1000HZ,那么频率就被分为1000/1=1000Hz, 这样就可以分给ARMCLK使用。


2.开始分析
Tiny210 U-BOOT(二)--配置时钟频率基本原理
上图取自芯片手册section 02_system的第3章 CLOCK CONTROLLER,在开篇的P353页的第一张图就是这个。

Tiny210 U-BOOT(二)--配置时钟频率基本原理

S5PV210的Clock分为三个domain,意思是三个区域--MSYS,DSYS,PSYS,这三个区域分别都是AMBA总线,AMBA总线分为AHB和APB两种总线(这是不严格的分法,仅仅是便于理解),每种总线都有不同的时钟频率,AHB--HCLK/APB--PCLK。那么MSYS,DSYS,PSYS最少有6个时钟(实际上不止6个),分别为HCLK_MSYS/PCLK_MSYS、HCLK_DSYS/PCLK_DSYS、HCLK_PSYS/PCLK_PSYS,再外加一个CPU要用的时钟ARMCLK,总共7个时钟频率。MSYS,DSYS,PSYS分别管理不同的设备,为不同的设备提供不同的频率。

再往下翻,这些不同设备的频率是如何产生的呢?由图可知最后,总共有13个CLK提供出来。

Tiny210 U-BOOT(二)--配置时钟频率基本原理

由上图可知,通过XOM[0]产生频率,然后在APLL升频,然后在分频1时,有一个两级分频,然后,在分频2又有一个8级分频,最后,就可以输出一个频率,提供给S5PV210的ARM芯片使用,P356页查到常用的CLK值,这里我们的S5PV210的ARMCLK为1000MHz。

-----------------------------------------------------------------

那么,在硬件上是如何实现的呢?
观察:
开发板上晶振有三颗,两个24Hz,一个27Hz。(晶振,全名晶体振荡器,成份石英(二氧化硅),晶振用于通过压电效应给CPU提出振荡频率,再通过别的电路,将正弦曲线波转换成方波,相当于CPU的起搏器,有了晶振,CPU才有频率输出)。

CPU输出24Hz频率后,就需要把频率放大。在频率放大的过程中,首先需要考虑的一个问题就是----PPLphase-locked loop)锁相环。

锁相环(PLL: Phase-locked loops)是一种利用反馈(Feedback)控制原理实现的频率相位的同步技术,其作用是将电路输出的时钟与其外部的参考时钟保持同步。当参考时钟的频率相位发生改变时,锁相环会检测到这种变化,并且通过其内部的反馈系统来调节输出频率,直到两者重新同步,这种同步又称为“锁相”(Phase-locked)。

简单的说,比如在CPU复位后默认工作频率在400Hz,现在CPU输出频率变成了1000Hz了,使用锁相环电路保证与CPU输出频率一致。

CPU第一次启动时,PLL(锁相环)有一个默认的初始值,芯片手册找到P522页,找到默认的初始频率:
• APLL: M=200, P=6, S=1 FOUT = (MDIV X FIN )/ (PDIV X 2(SDIV-1))) = 800MHz 
• MPLL: M=667, P=12, S=1 FOUT = (MDIV X FIN) / (PDIV X 2SDIV) = 667MHz 
• EPLL: M=80, P=3, S=3, K=0 FOUT = ((MDIV+KDIV) X FIN) / (PDIV X 2SDIV) = 80MHz

Tiny210 U-BOOT(二)--配置时钟频率基本原理

由上图查出可知,ARMCLK的默认频率为400MHz


-----------------------------------------------------------------

查看芯片手册的P356页,查出总共有以下几种由CMU输出的时钟
有四种PLLs(APLL,MPLL,EPLL,EPLL),还包括USB_OTG PHY clock。
To generate internal clocks, the following components are used.
• APLL uses FINPLL (refer to Figure 3-1) as input to generate 30MHz ~ 1GHz.
• MPLL uses FINPLL as input to generate 50MHz ~ 2GHz.
• EPLL uses FINPLL as input to generate 10MHz ~ 600MHz.
• VPLL uses FINPLL or SCLK_HDMI27M as input to generate 10MHz ~ 600MHz. This PLL generates 54MHz video clock.
• USB OTG PHY uses XUSBXTI to generate 30MHz and 48MHz
• HDMI PHY uses XUSBXTI or XHDMIXTI to generate 54MHz


常用的APLL/MPLL/EPLL/VPLL是干什么的呢?P448页
• APLL: used to generate ARM clock
• MPLL: used to generate system bus clock and several special clocks
• EPLL: used to generate several special clocks
• VPLL: used to generate Video clocks. Usually, generates 54 MHz.


先查看APLL PMS的倍频表
P357 S5PV210_UM_REV1.1.pdf -- Table 3-1. APLL PMS Value 

Tiny210 U-BOOT(二)--配置时钟频率基本原理


查看芯片手册,设置P/M/S的bit,可以将频率拉升到我们想要的频率。
那么我们要设置升高频,翻看手册,P371页,找到PLL CONTROL REGISTERS。
• (APLL_LOCK, R/W, Address = 0xE010_0000)
• (MPLL_LOCK, R/W, Address = 0xE010_0008)
• (EPLL_LOCK, R/W, Address = 0xE010_0010)
• (VPLL_LOCK, R/W, Address = 0xE010_0020) 


锁相环中的锁定时间就是指当频率变化后,锁相环重新同步该频率的时间。

由芯片手册上显示APLL的lock time是30us,如果是晶振输出的频率是24MHZ,lock time是30毫秒,那么PLL_LOCKTIME是720,也就是0x2D0