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是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试 ...
随机推荐
- thrift 通信的使用 /安装
参考: http://blog.csdn.net/yohunl/article/details/41748511 http://blog.csdn.net/amuseme_lu/article/det ...
- POJ1004 Financial Management
题目来源:http://poj.org/problem?id=1004 题目大意: Larry今年毕业并找到了工作.他开始赚很多的钱,然而他似乎总觉得不够.Larry决定好好掌控他的资产,解决他的财务 ...
- iperf简单说明
1.官网下载安装包 https://iperf.fr/iperf-download.php 2.安装(根据下载包的类型进行安装) 3.参数说明服务端(默认监听端口5201) iperf -s -u - ...
- day34 协程
1. 前提 之前我们学习了线程.进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位.按道理来说我们已经算是把cpu的利用率提高很多了.但是我们知道无论是创建多进程还 ...
- day30 锁 队列
1. 守护进程 会随着主进程的结束而结束. 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daem ...
- 你不得不知道的5个神奇的Docker工具
Docker社区非常活跃,每天都会推出大量有用的工具.要想持续追踪社区中发生的各项创新其实非常困难.为了帮助你,我收集了一些每天在日常工作中使用.令人感兴趣并且十分有用的Docker工具.这些工具消除 ...
- Tomcat分析-启动过程
Server是Tomcat最顶层的容器 Service用于提供服务 Connector用于处理连接相关的事情,并提供Socket与request和response的转换 Container用于封装和管 ...
- CSS文件的三种引入方式
CSS的引入方式共有三种:行内样式.内部样式表.外部样式表. 一.行内样式 使用style属性引入CSS样式. 示例:<h1 style="color:red;">st ...
- Python练习六十:网页分析,找出里面的正文与链接
网页分析,找出里面的正文与链接 代码如下: from urllib import request from bs4 import BeautifulSoup request = request.url ...
- OS---存储器
1.存储器的层次结构 1.1 概述 理想情况下,存储器应当速度非常快.并且与处理器的速度匹配.容量大且价格低廉: 实际情况,无法满足上述三个条件: 于是在现在OS中,存储器采用 层次结构 来组织: ...