Clock
介绍 Clock 的功能和使用方法。
模块介绍
Clock 是系统中的时钟控制器模块,负责时钟的管理与分发。
功能介绍

Linux为了做好时钟管理,提供了一个时钟管理框架 Common Clock Framework(以下简称CCF),为设备驱动提供统一的操作接口,使设备驱动不必关心时钟硬件实现的具体细节。
CCF 框架包括以下核心组成部分:
clock provider:对应上图的右侧部分,即 clock controller,负责提供系统所需的各种时钟。
clock consumer:对应上图的左侧部分,即使用时钟的一些设备驱动。
clock framework:CCF 的核心部分,向 clock consumers 提供操作 clock 的通用 API;实现时钟管理的核心逻辑,将与硬件相关的 clock 控制逻辑封装成操作函数集,交由 clock provider 实现。
device tree:CCF 允许在设备树中声明可用的时钟与设备的关联。
Clock 系统相关的器件包括:
- Oscillator / Crystal:有源或无源晶振,作为根时钟源。
- PLL(Phase Locked Loop) :锁相环倍频,提高基础频率。
- Divider:分频器,降低频率。
- MUX:多路选择器,切换时钟源。
- GATE:时钟开关,控制时钟通断。
系统中可能存在很多个这样的硬件模块,呈树形结构,Linux 将他们管理成一个时钟树(clock-tree),系统中的时钟树(Clock Tree)通常以晶振(Oscillator/Crystal)为起点,逐层经由 PLL(倍频)、MUX(选择)、DIV(分频)及 GATE(控制)等节点,最终输出给设备使用。CCF 实现了多种基础时钟类型,例如:
- 固定速率时钟 fixed_rate clock
- 门控时钟 gate clock
- 分频器时钟 divider clock
- 复用器时钟 mux clock
一般为了方便使用,会根据时钟树设计,实现一些时钟类型。
源码结构介绍
Clock 控制器驱动源码
Clock 控制器驱动代码在 drivers/clk/spacemit 目录下:
drivers/clk/spacemit
|-- ccu_ddn.c #ddn时钟类型源码
|-- ccu_ddn.h
|-- ccu_ddr.c #ddr时钟类型源码
|-- ccu_ddr.h
|-- ccu_dpll.c #dpll时钟类型源码
|-- ccu_dpll.h
|-- ccu_mix.c #mix时钟类型源码
|-- ccu_mix.h
|-- ccu_pll.c #pll时钟类型源码
|-- ccu_pll.h
|-- ccu-spacemit-k1x.c #k1 clock controller驱动
|-- ccu-spacemit-k1x.h
|-- Kconfig
|-- Makefile
Clock 控制器驱动实现了五种类型的时钟模块:
- PLL 类型,锁相环类型
- DPLL 类型,DDR 相关的锁相环类型
- DDN 类型,分数 divider,有一级除频,对应分母,一级倍频,对应分子
- MIX 类型,混合类型,支持 gate/mux/divider 的任一种或者随意组合
- DDR 类型,DDR 相关的特殊时钟类型
各时钟index定义
各时钟 index 定义在 dt-bindings 下:
include/dt-bindings/clock/spacemit-k1x-clock.h