S3C6410 系统时钟介绍

S3C6410 系统时钟介绍

-----------------------------
使用环境
PC:     ubuntu 11.04
kernel: 2.6.32-28-generic
corss:  arm-linux-gcc 4.3.2
arm:    s3c6410
-----------------------------
作者:    LvApp
联系方式: [email protected]

一切版权均有作者所有,欢迎转载,请指明出处,如何修改请与本人联系,谢谢


系统时钟配置
这篇主要介绍s3c6410在时钟设置上面是怎么处理的.
对于arm大家应该都不陌生,在使用的时候很多时候也非常关心主频是多少多少.经常听到的533Mhz 133Mhz 66Mhz 这些是比较典型的时钟频率了
那么这些值是怎么来的,时钟源在选择的时候,又是通过哪些寄存器.怎么一步步的设置过来的呢.
今天就来解析arm的clock系统.到底如何配置,才能让CLK_ARM CLK_HCLK CLK_PCKLS得到自己想要的频率的值呢?

首先直接看一个图:

S3C6410 系统时钟介绍_第1张图片
我们从左往右进行分析,首先当然是外部的时钟源的选择了,这里主要有 EXTCLK XTIpll 这两种源的提供,对于EXTCLK是我们比较常用的外部晶振了.而XTIpll是外部的时钟输入了.
接着,有了外部时钟之后,如何进行选择呢,,到底是晶振还是时钟输入呢?
这里我们看下面一张图
S3C6410 系统时钟介绍_第2张图片
从这图的最右边,可以看到clock source看到,对于XXTIpll 选择的话,只需要设置OM[0]这个引脚为0,而使用XEXTCLK那么设置OM[0]引脚为1就好了.
为了下面说明的方面,这里我们假设我们使用的是XEXTCLK 也就是OM[0]=1 假设为12MHz 通常这也是最常用的频率了.
顺便提一下, 从图中可知,s3c6410支持很多的启动模式,可以从nand sd srom等,通常用的很多是nand启动了.对于nand启动只需要根据外部nand的参数
设置OM引脚的电平,就可以给芯片指定启动方式了.这是题外话

继续看最上面那图的下一部分,我这里单独放出这个图,也是从手册里面摘录出来的,在看图之前,我们从大图中可以看到,整个图中有3个PLL,分别是
APLL MPLL EPLL这也是整个s3c6410中仅有的3个PLL,这三个PLL决定了核心,总线上面的频率.
在继续分析之前,这里我希望读者能够知道 PLL 和 DIV 的概念,一个是倍频器一个是分频器,说白了一个是做乘法一个是做除法

继续分析,从外面的EXTCLK之后,我们进入了APLL(这里先介绍APLL,其实另外两个也差不多).
从APLL之后会看到一个MUXapll,这是一把开关,表示我是直接用外部频率呢,还是使用对外部频率进行倍频后的频率,下面有个CLK_SRC[0]这个寄存器位.
果断去看一下.

这里写着 select clock source 选择时钟源的,具体看看第0位表示的是啥

这里可以看到,原来APLL_SEL[0]位就是control MUXapll 0:FINapll 是apll的输入,也就是EXTCLK,1:FOUTapll 是经过APLL之后输出的频率,既然我们
要使用倍频器,那么这里果断设置成1.
Ps:这里顺便把MPLL EPLL的列出来了,下次就不分析咯...

从倍频器出来到MUX之后,我们已经得到了倍频之后的频率了(倍频多少,下面会分析),继续往后有个1/2 这样的东西存在,按照前面的分析,看下MISC_CON[19]

这是一个BUS控制寄存器.还是先看看19位是什么吧

需要设置为0,那么也就是说MISC_CON[19] = 0
好了,既然明白了这里选择的是不经过1/2那么倍频之后的频率是直接到DIV/ARM上面了...
好到了这里,基本可以总结出 ARMCLK频率是这么算的
ARMCLK = EXTCLK * APLL / DIV
这里有人要问了,既然APLL 之后还要DIV 那为什么不干脆直接把DIV去了,直接APLL低一点不就行了,省的后面还是DIV.
其实前面还有一个岔路,就是让HCLKx2 也使用APLL的频率.这样APLL可以同时给ARMCLK 和 HCLKx2提供基准频率了,想怎么用,那就自己对这个频率进行DIV就行了

APLCLK分析完了,下面看MPLL
MPLL的前面跟APLL一样,到了中间有个SYNCMUX的选择,从图中看出是通过OTHERS[6]这一位来控制的,甚至可以发现1选择APLL 0选择MPLL


这里一般我们都使用默认的,选择MPLL
接着到了MICS_CON[19]这里上面已经分析过,是直接过来进入DIV/HCLKx2
但是CLKHCLKx2并不一定就是得到的是DIV/HCLKx2的频率,中间还有一个HCLK_GATE[24:23].这寄存器是啥?


可以看到,其实这些是对时钟频率是否提供给外设使用的gate位.这里默认HCLK_DDR1 = 1 也就是说 DIV/HCLKx2 提供的频率直接通过这里到大HCKx2的
HCLKx2 = EXTCLK * MPLL / DIV
HCLKx2 到底用在哪.看下面这段说明
HCLKX2 clocks are supplied to two DDR controllers, DDR0 and DDR1, of 6410. The operating speed can be up
to maximum 266MHz to send and to receive data through DDR controllers.

下面可以看到 HCLK 仅仅就是(DIV/HCKLx2) / (DIV/HCLK) 而已
剩下的,基本上也都能看懂了...EPLL这里就不分析了


那么这么多频率都被应用到哪了呢?
请看下面这个图

对于整个内部来说,所有的模块之间都是以总线的形式进行链接的,比如 WDT UART 等都链接到了APB/AXI这两者之一.那么这两个总线的频率又是多少呢?
依旧看图来说明
S3C6410 系统时钟介绍_第3张图片
从图中可以看到ARMCLK 直接提供给ARM1176核心处理.HCLK PCLK也都有对应的模块.
要知道详细模块从哪获得基准频率,请参看手册.这里就不一一列出来了.


下面重点要讲,如何计算这些频率的值.
S3C6410 系统时钟介绍_第4张图片
首先得知道,频率计算是有公式的...
在手册中介绍了.该公式如下,同时这个公式仅适用于APLL MPLL

下面看一个计算的方法,摘自手册

S3C6410 系统时钟介绍_第5张图片


可以自行根据公司代入上面的值,就可以计算出来了....

对于EPLL的计算公式有点不同..下面直接看图了...


是不是越来月简单了...arm的频率计算也就那么回事..哈哈~~~继续继续哈...





关于频率相关的介绍就介绍到这,详细的请参看s3c6410手册..内容比较多...

不啰嗦了...大半夜了...睡觉了~~~~

Finish!

Thanks a lot;


你可能感兴趣的:(c,ubuntu,div)