s3c6410 clock分析

启动信息如下

s3c6410_init_clocks: initialising clocks
S3C24XX Clocks, (c) 2004 Simtec Electronics
s3c6400_setup_clocks: registering clocks
s3c6400_setup_clocks: clkdiv0 = 01043310
s3c6400_setup_clocks: xtal is 12000000     //晶振是12MHZ
S3C64XX: PLL settings, A=532000000, M=532000000, E=24000000    //APLL, MPLL, EPLL

6410内部的三个锁相环

APLL for ARM operating

MPLL for main operating clock  for AXI AHB APB

EPLL for special purpose  for UART, IIS, IIC and etc.
S3C64XX: HCLKx2=266000000, HCLK=133000000, PCLK=66500000    //由上面的PLL得到的HCLK(high performance), PCLK(pheripheral bus)
div1: 00000555
mout_apll: source is fout_apll (1), rate is 532000000
mout_epll: source is fout_epll (1), rate is 24000000
mout_mpll: source is mpll (1), rate is 532000000
s3c64xx_clk_doutmpll_get_rate: parent is 532000000
mmc_bus: source is dout_mpll (1), rate is 44333333    //各种设备的pll
s3c64xx_clk_doutmpll_get_rate: parent is 532000000
mmc_bus: source is dout_mpll (1), rate is 44333333
s3c64xx_clk_doutmpll_get_rate: parent is 532000000
mmc_bus: source is dout_mpll (1), rate is 44333333
usb-host-bus: source is mout_epll (0), rate is 24000000
s3c64xx_clk_doutmpll_get_rate: parent is 532000000
uclk1: source is dout_mpll (1), rate is 66500000
spi-bus: source is mout_epll (0), rate is 24000000
spi-bus: source is mout_epll (0), rate is 24000000
audio-bus0: source is mout_epll (0), rate is 24000000
audio-bus1: source is mout_epll (0), rate is 24000000
audio-bus2: source is mout_epll (0), rate is 24000000
irda-bus: source is mout_epll (0), rate is 24000000

 

 

http://topic.csdn.net/u/20081125/17/f47176f4-b310-4ae0-b232-ad972fc870e5.html

 

为了降低电磁干扰和降低板间布线要求,芯片外接的晶振频率通常很低,通过时钟控制逻辑的PLL提高系统使时钟

 

其中pll 包含两种: MPLL 主要应用于各种设备时钟的提供,将重点讨论
UPLL 应用于USB时钟频率应用,为48M

其中MPLL的设置主要依靠使用各种锁相环和分频器来改变输入原始的频率,经过锁相环之后可以提升频率,关于频率的选择主要依靠改变CPU寄存器实现,MPLLCON通过改变其中的参数设置即可

Fin就是输入频率,这里就是12MHz
Mpll = (m * Fin) / (p * 2^s)
m = (MDIV + 8), p = (PDIV + 2), s = SDIV

而MDIV, PDIV, SDIV是从MPLLCON这个寄存器中得到的。
MPLL就是要得到的频率,我建议用参考手册给定的频率设置即可,标准之际。
接下来该设置各种设备的频率:

我所认为的MPLL分出三种模式:FCLK、HCLK、PCLK
这三种也应用于不同的场合,FCLK应用于CPU的时钟,HCLK用于AHB bus各种外围设备,PCLK 用于APB bus各种接口设备。
其中FCLK 应用就是MPLL的频率,一样的,不用设置的。
HCLK 可以设置为FCLK或FCLK/2 ,即通过设置相应得寄存器CLKDIVN中的对应位HDIVN即可,其中HDIVN为0时对应FCLK,为1时对应FCLK/2
PCLK可以设置为HCLK或HCLK/2 ,即通过设置相应得寄存器CLKDIVN中的对应位PDIVN即可,其中PDIVN为0时对应HCLK,为1时对应HCLK/2

If HDIVN=1, the CPU bus mode has to be changed from the fast bus mode to the asynchronous bus mode using following instructions.
MMU_SetAsyncBusMode
mrc p15,0,r0,c1,c0,0
orr r0,r0,#R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
If HDIVN=1 and the CPU bus mode is the fast bus mode, the CPU will operate by the HCLK. This feature can be used to change the CPU frequency as a half without affecting the HCLK and PCLK.
以上这段文字也是讲关于写协处理器来控制协调内部总线和外部总线的关系,不过原文有点不太明白,又不敢把错的意思表达出来,贻害众生,只好原文照搬后谈点看法,我感觉是当HCLK中设置为FCLK/2 时必须协调与内部总线关系,至于同步非同步还要通过协处理器来管理,这样就可以很好的协调各种总线的关系了,当出现HDIVN=1和CPU总线被设为快速非同步模式时,CPU(我认为是总线频率)可以完全依靠HCLK提供频率,因此将会改变CPU频率时不会影响到其它的变化。

今天看数据手册时有发现了几点没有发现的东西,主要是关于协处理器的。
ARM920T 竟然有两种输入时钟方式,FCLK 和BCLK ,其中BCLK 主要提供给AMBA
Bus的,可也可以通过选择协处理器的R1的NF,iA位来选择是否供是时钟给核ARM920T,才明白上面所述的

 

 

      把kernel boot起来后,然后重新编译了kernel,添加网络支持,因为2.6.27.8里面的网卡cs8900的驱动还有待修改,所以只好用usbnet,用 usbdevice来模拟网卡,同时给kernel加上rootfs on nfs 支持。在PC几上建好qq2440_rootfs的目录,把基本的lib复制过去,然后编译了busybox,也复制过去。重新启动开发板,设置好命令行参数后,系统已经能正常启动了,进入到busybox的命令行。
      试了几个命令后,发现系统有点缓慢,插入u盘后,很长时间,才能显示u盘的信息,但是系统的load average也不高,本来没在意这个现象,后来观察了下/proc/interrupts,发现timer tick明显偏少,估计了一下,一秒种才20-30次,但是config里面的HZ明明是200啊。执行了一下sleep 1,居然花了差不多8秒种,很明显,系统的时钟出了问题。。
      s3c2440的时钟最开始由12M的晶振产生,由MPLL合成405M的clock送给ARM核,同时产生其他的频率供给其它部件。linux使用了 s3c2440的timer 4产生tick 中断。timer 4的输入来自于PCLK。PCLK的频率应该是40.625 MHz,这个频率应该是稳定的,因为UART也是使用这个频率分频产生波特率的,现在UART正常工作,PCKL应该没有问题。那么就是Timer 4的配置可能有问题了。看了下arch/plat-s3c24xx/timer.c里面的timer的初始化过程,主要是分频的设置和count down value的设置,反复研究啦下,也没有问题。。。。
      后来实在没辙了,启动系统后,写了个小程序,在user space里面读关于timer配置的寄存器,才发现出了问题。TCFG1,就是分频的设置,timer 4应该设成1/2, 实际却是1/16,才造成时间相差了8倍。问题是time.c里面的设置是没有问题的。后来搜索了一下代码,才发现,在arch/plat- s3c24xx/pwm-clock.c里面初始化了5个定时器,包括timer4,也就是说timer4又被设置了一遍,覆盖了系统之前的设置,后来在 pwm里面去掉了timer4,系统终于恢复了正常。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值