zoukankan      html  css  js  c++  java
  • u-boot分析(六)----时钟初始化

    u-boot分析(六)

      上篇博文我们按照210的启动流程,分析到了关闭看门狗,今天我们继续按照u-boot的启动流程进行分析,今天我们会主要分析时钟的初始化。

    今天我们会用到的文档:

    1.        Arm9内核手册:http://download.csdn.net/detail/wrjvszq/8358867

    2.        Arm11内核手册:http://download.csdn.net/detail/wrjvszq/8358877

    3.        Arm a8内核手册:http://download.csdn.net/detail/wrjvszq/8358893

    4.        2440芯片手册:http://download.csdn.net/detail/wrjvszq/8358949

    5.        6410芯片手册:http://download.csdn.net/detail/wrjvszq/8358965

    6.        210芯片手册:S5PV210_UM_REV1.1(我的不知道为什么传不上去大家去百度搜吧)

     

    由于arm的时钟体系比较复杂我们今天会通过以下几点,对arm的时钟体系进行介绍:

    1.      概念解析

    2.      体系介绍

    3.      编程分析

     

    l  概念解析

    1.       时钟脉冲信号

    由特定的电压幅度以及特定的时间间隔产生的脉冲信号

    2.       时钟频率

    单位时间内产生的脉冲个数

    3.       时钟脉冲信号来源

    时钟信号的来源有一下两种方式:

    1)        晶振(晶体振荡器):石英晶体经过打磨,加电极,通电,会产生特定的时钟频率,但是高频的价格比较昂贵。

    2)        PLL(锁相环):需要一个外部晶振,和一个能对晶体的特定频率加倍或分频的集成锁相环电路,可以产生不同频率的时钟信号,可以得到高频信号,成本低   

    l  体系介绍

    对于时钟体系的介绍我们将会通过下面4点来介绍:

    1)        晶振频率

    2)        PLL个数及分类

    3)        每个PLL可以产生哪些时钟

    4)        时钟用于哪些外设

    1.       2440时钟体系:

    1)        晶振频率:12 MHZ

    2)        PLL个数及分类:

    我们可以从芯片手册中的7. Clock&Power Management找到下图

    从上图我们可以知道其共有两个PLL分别为MPLLUPLL

    3)        PLL产生的时钟

    同样是从上图我们可以看出

    l  MPLL产生了HCLKPCLKFCLK

    l  UPLL产生了UCLK

    4)        时钟的用途

    可以总结为下表

    时钟

    应用场合

    设备

    FCLK

    处理器

    Arm9

    HCLK

    AHB总线

    LCDDMA

    PCLK

    APB总线

    UARTGPIO

    UCLK

    USB总线

    USB设备

     

    2.       6410时钟体系

    1)        晶振频率:24MHZ

    2)        PLL个数及分类:

    同样我们可以找到下图

    从上图我们可以知道其共有三个PLL分别为MPLLAPLLEPLL

    3)        PLL产生的时钟

    同样是从上图我们可以看出

    l  MPLL产生了HCLKPCLK

    l  APLL产生了ARMCLK

    l  EPLL产生了SCLK

    4)        时钟的用途

    可以总结为下表

    时钟

    应用场合

    设备

    ARMCLK

    处理器

    Arm11

    HCLK

    AHB总线

    LCDDMA

    PCLK

    APB总线

    UARTGPIO

    SCLK

    USB总线

    USB设备

    3.       210时钟体系

    1)        晶振频率:24MHZ

    2)        PLL个数及分类:

    同样我们可以找到下图

    从上图我们可以知道其共有三个PLL分别为MPLLAPLLEPLLVPLL

    3)        PLL产生的时钟

    同样是从上图我们可以看出

    l  APLL产生了MSYS体系的时钟包括ARMCLKHCLK_MSYSPCLK_MSYS

    l  MPLL产生了DSYS体系的时钟HCLK_DSYSPCLK_DSYS

    l  EPLL产生了PSYS体系的时钟HCLK_PSYSPCLK_PSYS

    l  VPLL产生视频相关时钟

    4)        时钟的用途

    可以总结为下表

    经过上述内容我们对arm时钟体系有了一定的了解,接下来我们分析其编程方法。

    l  编程分析

    1.       初始化流程

    通过阅读210的芯片手册,很轻松我们在3.5 CLOCK CONFIGURATION PROCEDURE可以找到其配置过程

    2.       如何配置

    我们将上面找到的基本的配置流程,和u-boot的代码比较一下,发现其步骤是一样的,大部分的设置比较简单(参照文档的说明即可),在此我就不一一分析了。

     

      1 system_clock_init:
      2 
      3     ldr    r0, =ELFIN_CLOCK_POWER_BASE    @0xe0100000
      4 
      5     /* Set Mux to FIN */
      6     ldr    r1, =0x0
      7     str    r1, [r0, #CLK_SRC0_OFFSET]
      8 
      9     ldr    r1,    =APLL_LOCKTIME_VAL
     10     str    r1,    [r0, #APLL_LOCK_OFFSET]
     11 
     12     /* Disable PLL */
     13     ldr    r1, =0x0
     14     str    r1, [r0, #APLL_CON0_OFFSET]
     15     ldr    r1, =0x0
     16     str    r1, [r0, #MPLL_CON_OFFSET]
     17 
     18     ldr    r1, =0x0
     19     str    r1, [r0, #MPLL_CON_OFFSET]
     20 
     21     ldr       r1, [r0, #CLK_DIV0_OFFSET]
     22     ldr    r2, =CLK_DIV0_MASK
     23     bic    r1, r1, r2
     24 
     25     ldr    r2, =CLK_DIV0_VAL
     26     orr    r1, r1, r2
     27     str    r1, [r0, #CLK_DIV0_OFFSET]
     28 
     29     ldr    r1, =APLL_VAL
     30     str    r1, [r0, #APLL_CON0_OFFSET]
     31 
     32     ldr    r1, =MPLL_VAL
     33     str    r1, [r0, #MPLL_CON_OFFSET]
     34 
     35     ldr    r1, =VPLL_VAL
     36     str    r1, [r0, #VPLL_CON_OFFSET]
     37 #if defined(CONFIG_EVT1)
     38     ldr    r1, =AFC_ON
     39     str    r1, [r0, #APLL_CON1_OFFSET]
     40 #endif
     41     mov    r1, #0x10000
     42 1:    subs    r1, r1, #1
     43     bne    1b
     44 
     45     ldr    r1, [r0, #CLK_SRC0_OFFSET]
     46     ldr    r2, =0x10001111
     47     orr    r1, r1, r2
     48     str    r1, [r0, #CLK_SRC0_OFFSET]
     49 
     50 #if defined(CONFIG_MCP_AC)
     51 
     52     /* CLK_SRC6[25:24] -> OneDRAM clock sel = MPLL */
     53     ldr    r1, [r0, #CLK_SRC6_OFFSET]
     54     bic    r1, r1, #(0x3<<24)
     55     orr    r1, r1, #0x01000000
     56     str    r1, [r0, #CLK_SRC6_OFFSET]
     57 
     58     /* CLK_DIV6[31:28] -> 4=1/5, 3=1/4(166MHZ@667MHz), 2=1/3 */
     59     ldr    r1, [r0, #CLK_DIV6_OFFSET]
     60     bic    r1, r1, #(0xF<<28)
     61     bic    r1, r1, #(0x7<<12)    @; ONENAND_RATIO: 0
     62     orr    r1, r1, #0x30000000
     63     str    r1, [r0, #CLK_DIV6_OFFSET]
     64 
     65 #elif defined (CONFIG_MCP_H)
     66 
     67     /* CLK_SRC6[25:24] -> OneDRAM clock sel = 00:SCLKA2M, 01:SCLKMPLL */
     68     ldr    r1, [r0, #CLK_SRC6_OFFSET]
     69     bic    r1, r1, #(0x3<<24)
     70     orr    r1, r1, #0x00000000
     71     str    r1, [r0, #CLK_SRC6_OFFSET]
     72 
     73     /* CLK_DIV6[31:28] -> 4=1/5, 3=1/4(166MHZ@667MHz), 2=1/3 */
     74     ldr    r1, [r0, #CLK_DIV6_OFFSET]
     75     bic    r1, r1, #(0xF<<28)
     76     bic    r1, r1, #(0x7<<12)    @; ONENAND_RATIO: 0
     77     orr    r1, r1, #0x00000000
     78     str    r1, [r0, #CLK_DIV6_OFFSET]
     79 
     80 #elif defined (CONFIG_MCP_B) || defined (CONFIG_MCP_D)
     81 
     82     /* CLK_SRC6[25:24] -> OneDRAM clock sel = 00:SCLKA2M, 01:SCLKMPLL */
     83     ldr    r1, [r0, #CLK_SRC6_OFFSET]
     84     bic    r1, r1, #(0x3<<24)
     85     orr    r1, r1, #0x01000000
     86     str    r1, [r0, #CLK_SRC6_OFFSET]
     87 
     88     /* CLK_DIV6[31:28] -> 4=1/5, 3=1/4(166MHZ@667MHz), 2=1/3 */
     89     ldr    r1, [r0, #CLK_DIV6_OFFSET]
     90     bic    r1, r1, #(0xF<<28)
     91     bic    r1, r1, #(0x7<<12)    @; ONENAND_RATIO: 0
     92     orr    r1, r1, #0x30000000
     93     str    r1, [r0, #CLK_DIV6_OFFSET]
     94 
     95 #elif defined (CONFIG_MCP_SINGLE)
     96 
     97     /* CLK_DIV6 */
     98     ldr    r1, [r0, #CLK_DIV6_OFFSET]
     99     bic    r1, r1, #(0x7<<12)    @; ONENAND_RATIO: 0
    100     str    r1, [r0, #CLK_DIV6_OFFSET]
    101 
    102 #endif
    103 
    104     mov    pc, lr

     

     

     

  • 相关阅读:
    1057. 数零壹(20)
    Docker镜像操作
    Maven 常用操作
    k8s集群搭建(kubadm方式)
    Spring单事务多线程操作引来的问题(Lock wait timeout exceeded; try restarting transaction)
    Centos7 Maven 安装教程
    Centos7 Git安装教程
    Centos7 Docker安装mysql5.7
    Centos7 Docker安装Nginx教程
    SpringBoot启动及配置文件加载原理分析
  • 原文地址:https://www.cnblogs.com/wrjvszq/p/4227435.html
Copyright © 2011-2022 走看看