1、方案概述
1.1 概述
本章主要描述时钟子系统的相关的重要概念、时钟方案、总体流程、代码结构。
1.2 重要概念
● 时钟子系统
这里讲的时钟是给
SOC各组件提供时钟的树状框架,并不是
内核使用的时间,和其他
模块一样,CLK也有框架,用以适配不同的平台。适配层之上是客户代码和接口,也就是各模块(如需要时钟
信号的外设,USB等)的驱动。适配层之下是具体的SOC台的时钟操作细节。
● 时钟树结构
可运行
linux的主流
处理器平台,都有非常复杂的Clock Tree,我们随便拿一个处理器的
SPEC,查看Clock相关的章节,一定会有一个非常庞大和复杂的树状图,这个图由Clock相关的器件,以及这些器件输出的Clock组成。
● 相关器件
Clock相关的器件包括:用于产生Clock的Oscillator(有源振荡器,也称作谐振荡器)或者Crystal(无源振荡器,也称
晶振);用于倍频的PLL(锁相环,Phase Locked Loop);用于分频的 Divider;用于多路选择的 Mux;用于 Clock
enable 控制的与门;使用 Clock 的硬件模块(可称作 Consumer);等等。
1.3 时钟方案
每一个 SOC 都有自己的时钟分配方案,主要是包括 PLL 的设置,各个 CLK 的父属性、DIV、MUX 等。
芯片不同,时钟方案是有差异的。
1.4 总体流程
主要内容包括(不需要所有 clk 都支持):
(1) Enable/Disable CLK。
(2) 设置 CLK 的频率。
(3) 选择 CLK 的 Parent。
1.5 代码结构
CLOCK 的软件框架由 CLK 的 clk-rk3xxx.c(clk 的寄存器描述、clk 之间的树状关系等)、
device driver 的 CLK 配置和 CLK API 三部分构成。这三部分的功能、CLK 代码路径如表 1-1 所示。
项目 | 功能 | 路径 |
Clk-rk3xxx.c Rk3xxx-cru.h | .c中主要是clk的寄存器描述、clk之间的树状关系描述等。
.h中是clk的ID定义,通过ID匹配clk name。 | Drivers/clk/rockchip/clk-rk3xxx.c include/dt-bindings/clock/rk3xxx-cru.h |
RK特别的处理 | 1、处理RK的PLL时钟
2、处理RK的CPU时钟等 | Drivers/clk/rockchip/clk-xxx.c |
CLK API | 提供linux环境下供driver调用的接口 | Drive rs/cl k/clk-xxx.x |
2、CLOCK 开发指南
2.1 概述
本章描述如何修改时钟配置、使用 API 接口及调试 CLK 程序。
2.2 时钟的相关概念
2.2.1 PLL
锁相环,是由24M的晶振输入,然后内部锁相环锁出相应的频率。这个是SOC所有CLOCK的时钟的源。SOC的所有总线及设备的时钟都是从PLL分频下来的。RK平台主要PLL有:
PLL | 子设备 | 用途 | 备注 |
APLLL | armCLKL | CPU小核的时钟 | 一般只给CPU使用,因为CPU会变频,PLL会根据CPU要求 的频率变化 |
APLLB | ARMCLKB | CPU大核的时钟 | 一般只给CPU使用,因为CPU会变频,PLL会根据CPU要求 的频率变化 |
DPLL | Clk_DDR | DDR的时钟 | 一般只给DDR使用,因为DDR会变频,DPLL会根据DDR 要求变化 |
GPLL | | 提供总线、外设时钟 做备份 | 一般设置在594M或者1200M,保证基本的100、200、300、 400M的时钟都有输岀 |
CPLL | | 其他设备做备份 | 一般可能是 400、500、800、1000M。 |
NPLL | | GMAC或者给其他 设备做备份 | 一般可能是 1000M。 |
VPLL | | HDML VOP 使用 | 频率根据显示分辨率定,支持任意频率对jitter有要求。 |
PPLL | | PMUCRU时钟,给PMU模块提供时钟 | 一般可能是676M,可以出26M。 |
2.2.2 ACLK、PCLK、HCLK
ACLK 是设备的总线的 CLK,PCLK 跟 HCLK 一般是用于寄存器读写的。而像 CLK_
GPU 是 GPU的
控制器的时钟。
我们 SOC 的总线有 ACLK_PERI、HCLK_PERI、PCLK_PERI、ACLK_BUS、HCLK_BUS、PCLK_BUS.各个设备的总线时钟会挂在上面这些时钟下面,如下图结构:
更多详细内容请下载附件查看