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分别为MPLL和UPLL
3) PLL产生的时钟
同样是从上图我们可以看出
l MPLL产生了HCLK、PCLK、FCLK
l UPLL产生了UCLK。
4) 时钟的用途
可以总结为下表
时钟 |
应用场合 |
设备 |
FCLK |
处理器 |
Arm9 |
HCLK |
AHB总线 |
LCD、DMA等 |
PCLK |
APB总线 |
UART、GPIO等 |
UCLK |
USB总线 |
USB设备 |
2. 6410时钟体系
1) 晶振频率:24MHZ
2) PLL个数及分类:
同样我们可以找到下图
从上图我们可以知道其共有三个PLL分别为MPLL、APLL和EPLL
3) PLL产生的时钟
同样是从上图我们可以看出
l MPLL产生了HCLK、PCLK
l APLL产生了ARMCLK
l EPLL产生了SCLK
4) 时钟的用途
可以总结为下表
时钟 |
应用场合 |
设备 |
ARMCLK |
处理器 |
Arm11 |
HCLK |
AHB总线 |
LCD、DMA等 |
PCLK |
APB总线 |
UART、GPIO等 |
SCLK |
USB总线 |
USB设备 |
3. 210时钟体系
1) 晶振频率:24MHZ
2) PLL个数及分类:
同样我们可以找到下图
从上图我们可以知道其共有三个PLL分别为MPLL、APLL、EPLL和VPLL
3) PLL产生的时钟
同样是从上图我们可以看出
l APLL产生了MSYS体系的时钟包括ARMCLK、HCLK_MSYS、PCLK_MSYS
l MPLL产生了DSYS体系的时钟HCLK_DSYS、PCLK_DSYS
l EPLL产生了PSYS体系的时钟HCLK_PSYS、PCLK_PSYS
l VPLL产生视频相关时钟
4) 时钟的用途
可以总结为下表
经过上述内容我们对arm时钟体系有了一定的了解,接下来我们分析其编程方法。
l 编程分析
1. 初始化流程
通过阅读210的芯片手册,很轻松我们在3.5 CLOCK CONFIGURATION PROCEDURE可以找到其配置过程
2. 如何配置
我们将上面找到的基本的配置流程,和u-boot的代码比较一下,发现其步骤是一样的,大部分的设置比较简单(参照文档的说明即可),在此我就不一一分析了。
system_clock_init: ldr r0, =ELFIN_CLOCK_POWER_BASE @0xe0100000 /* Set Mux to FIN */
ldr r1, =0x0
str r1, [r0, #CLK_SRC0_OFFSET] ldr r1, =APLL_LOCKTIME_VAL
str r1, [r0, #APLL_LOCK_OFFSET] /* Disable PLL */
ldr r1, =0x0
str r1, [r0, #APLL_CON0_OFFSET]
ldr r1, =0x0
str r1, [r0, #MPLL_CON_OFFSET] ldr r1, =0x0
str r1, [r0, #MPLL_CON_OFFSET] ldr r1, [r0, #CLK_DIV0_OFFSET]
ldr r2, =CLK_DIV0_MASK
bic r1, r1, r2 ldr r2, =CLK_DIV0_VAL
orr r1, r1, r2
str r1, [r0, #CLK_DIV0_OFFSET] ldr r1, =APLL_VAL
str r1, [r0, #APLL_CON0_OFFSET] ldr r1, =MPLL_VAL
str r1, [r0, #MPLL_CON_OFFSET] ldr r1, =VPLL_VAL
str r1, [r0, #VPLL_CON_OFFSET]
#if defined(CONFIG_EVT1)
ldr r1, =AFC_ON
str r1, [r0, #APLL_CON1_OFFSET]
#endif
mov r1, #0x10000
: subs r1, r1, #
bne 1b ldr r1, [r0, #CLK_SRC0_OFFSET]
ldr r2, =0x10001111
orr r1, r1, r2
str r1, [r0, #CLK_SRC0_OFFSET] #if defined(CONFIG_MCP_AC) /* CLK_SRC6[25:24] -> OneDRAM clock sel = MPLL */
ldr r1, [r0, #CLK_SRC6_OFFSET]
bic r1, r1, #(0x3<<)
orr r1, r1, #0x01000000
str r1, [r0, #CLK_SRC6_OFFSET] /* CLK_DIV6[31:28] -> 4=1/5, 3=1/4(166MHZ@667MHz), 2=1/3 */
ldr r1, [r0, #CLK_DIV6_OFFSET]
bic r1, r1, #(0xF<<)
bic r1, r1, #(0x7<<) @; ONENAND_RATIO:
orr r1, r1, #0x30000000
str r1, [r0, #CLK_DIV6_OFFSET] #elif defined (CONFIG_MCP_H) /* CLK_SRC6[25:24] -> OneDRAM clock sel = 00:SCLKA2M, 01:SCLKMPLL */
ldr r1, [r0, #CLK_SRC6_OFFSET]
bic r1, r1, #(0x3<<)
orr r1, r1, #0x00000000
str r1, [r0, #CLK_SRC6_OFFSET] /* CLK_DIV6[31:28] -> 4=1/5, 3=1/4(166MHZ@667MHz), 2=1/3 */
ldr r1, [r0, #CLK_DIV6_OFFSET]
bic r1, r1, #(0xF<<)
bic r1, r1, #(0x7<<) @; ONENAND_RATIO:
orr r1, r1, #0x00000000
str r1, [r0, #CLK_DIV6_OFFSET] #elif defined (CONFIG_MCP_B) || defined (CONFIG_MCP_D) /* CLK_SRC6[25:24] -> OneDRAM clock sel = 00:SCLKA2M, 01:SCLKMPLL */
ldr r1, [r0, #CLK_SRC6_OFFSET]
bic r1, r1, #(0x3<<)
orr r1, r1, #0x01000000
str r1, [r0, #CLK_SRC6_OFFSET] /* CLK_DIV6[31:28] -> 4=1/5, 3=1/4(166MHZ@667MHz), 2=1/3 */
ldr r1, [r0, #CLK_DIV6_OFFSET]
bic r1, r1, #(0xF<<)
bic r1, r1, #(0x7<<) @; ONENAND_RATIO:
orr r1, r1, #0x30000000
str r1, [r0, #CLK_DIV6_OFFSET] #elif defined (CONFIG_MCP_SINGLE) /* CLK_DIV6 */
ldr r1, [r0, #CLK_DIV6_OFFSET]
bic r1, r1, #(0x7<<) @; ONENAND_RATIO:
str r1, [r0, #CLK_DIV6_OFFSET] #endif mov pc, lr
最新文章
- C++ 11 lambda
- untiy数据包的输出、加载和卸载
- UESTC 884 方老师的专题讲座 --数位DP
- java json 的生成和解析 --json-lib
- 后台代码对iBatis配置文件中具体的sql语句的调用实现(被封装的增删改查)
- 【log4net】配置文件
- Java基础--Java内存管理与垃圾回收
- 高级UNIX环境编程7 进程
- Oracle Autonomous Transactions(自治事务)
- 【.NET-EF】Entity Framework学习笔记1 - VS2013没有EF的解决方法
- 【teradata】强制解锁
- syncthing 多主机同步文件工具
- hive、sqoop、MySQL间的数据传递
- centos7管理用户权限
- [leetcode]Word Search @ Python
- PHP直接输出一张图片
- Django自带的用户认证
- django中的验证码
- 多线程下的神奇的IOCP
- nodejs 异步编程 教程(推荐)