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
u-boot分析(六)----时钟初始化的更多相关文章
- STM32_3 时钟初始化分析
		在startup文件中,调用了2个函数,一个是System_Init, 另一个是main. System_Init()在system_stm32f10x.c 这个文件中,先看一下时钟树,再分析一下这个 ... 
- 第3阶段——内核启动分析之start_kernel初始化函数(5)
		内核启动分析之start_kernel初始化函数(init/main.c) stext函数启动内核后,就开始进入start_kernel初始化各个函数, 下面只是浅尝辄止的描述一下函数的功能,很多函数 ... 
- 手机自动化测试:Appium源码分析之跟踪代码分析六
		手机自动化测试:Appium源码分析之跟踪代码分析六 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest推出手机自 ... 
- Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏
		Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏 云收藏项目已经开源3年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时 ... 
- ThinkPHP6源码分析之应用初始化
		ThinkPHP6 源码分析之应用初始化 官方群点击此处. App Construct 先来看看在 __construct 中做了什么,基本任何框架都会在这里做一些基本的操作,也就是从这里开始延伸出去 ... 
- nginx源码分析之模块初始化
		在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要 ... 
- nginx源码分析之网络初始化
		nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ... 
- s3c6410_时钟初始化
		参考: 1)<USER'S MANUAL-S3C6410X>第三章 SYSTEM CONTROLLER 2)u-boot/board/samsumg/smdk6410/lowlevel_i ... 
- LPC1788系统时钟初始化
		#ifndef __SYS_H_ #define __SYS_H_ #include "common.h" #define SystemCoreClock 120000000 ... 
- 老李推荐:第5章6节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 初始化事件源
		老李推荐:第5章6节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 初始化事件源 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试 ... 
随机推荐
- Gym - 101845F  最大流
			The UN finals are here!, the coaches/ex-coaches team is creating a new exciting contest to select wh ... 
- 解决spring使用动态代理
			解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ... 转 ... 
- 项目笔记《DeepLung:Deep 3D Dual Path Nets for Automated Pulmonary Nodule Detection and Classification》(一)预处理
			最近一个月都在做肺结节的检测,学到了不少东西,运行的项目主要是基于这篇论文,在github上可以查到项目代码. 我个人总结的肺结节检测可以分为三个阶段,数据预处理,网络搭建及训练,结果评估. 这篇博客 ... 
- JScrollPane (滚动面板)使用心得
			注意:使用滚动面板时,必须指定内部组件是哪个组件 JScrollPane的两种使用方式:. 方式一: //直接在创建滚动面板对象时,就指定所要显示的组件 //本例中所要显示的是jPanel JPane ... 
- sublime 显示 python 错误信息
			默认的编译器可以直接按Ctrl+B编译运行Python,并在控制台输出结果.美中不足的是无法输出中文,需要自己手动配置一番. 在Sublime Text 3 中依次点击菜单Tools->buil ... 
- Python语言、编译解释、动态库静态库、编译过程、头文件
			学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库, 什么是编译: 编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了.一把翻译 ... 
- asp.net core 标签验证函数功能
			public class AuthFilter : Attribute, IActionFilter { public void OnActionExecuted(ActionExecutedCont ... 
- Ubuntu 安装 phpredis扩展
			官网 https://github.com/phpredis/phpredis 下载->然后解压->上传服务器 /etc/phpredis 进行 cd /etc/phpredisphpiz ... 
- Java字符容量capacity()方法
			Java字符容量计算:比如StringBuffer sb=new StringBuffer("Good");输出 . 
- 4.AOP
			1.代理模式 代理模式(Proxy Pattern)是GoF23种常用设计模式之一使用代理模式创建代理对象,让代理对象控制目标对象的访问,并且可以在不改变目标对象的情况下添加一些额外的功能包括静态代理 ... 
