CCU - 时钟管理模块
时钟管理模块是 Linux 系统为统一管理各硬件的时钟而实现的一套管理框架,负责所有模块的时钟调节。
时钟管理模块在 Linux 系统中扮演着关键角色,负责调节硬件模块的工作频率和管理电源切换。为了确保硬件模块正常运行,必须首先配置其工作频率、开启电源开关以及处理总线访问等操作。时钟管理模块通过为设备驱动程序提供统一的操作接口,使得驱动程序无需过多关注时钟硬件的具体实现细节。
此外,sunxi 的 clk 驱动集成了 reset 相关功能,因此涉及该驱动的文章可能包含有关 reset 子系统的使用说明。Reset 控制器在 Linux 中用于控制硬件模块的复位行为,通常与时钟管理密切相关,可确保在配置硬件设备时进行适当的复位操作,以保证设备处于正确状态。这些功能共同为系统的稳定性和各硬件模块之间的协调提供了重要支持。
时钟结构
系统时钟主要是指一些为其他硬件模块提供时钟源输入的时钟源,为其它硬件模块提供时钟源输入。系统时钟一般由多个硬件模块共享,不允许随意调节。
如下图所示,该平台有 10 路PLL作为系统时钟为其它模块提供时钟源,图中是 HOSC,也可以直接作为系统时钟源给给其他硬件模块提供时钟。
系统时钟来源:32k(LOSC)
、16M(IOSC)
、24M(HOSC)
,32k
时钟也可以从16M
分频得来。系统在 HOSC 的基础上,增加一些锁相环电路,实现更高的时钟频率输出。为了便于控制一些模块的时钟频率,系统对时钟源进行了分组,实现较多的锁相环电路,以实现分路独立调节。
模块配置
驱动配置
Clock Drivers ->
<*> Clock Support for Allwinner SoCs
<*> DDR_CCU
<*> SUN55IW3 CCU
<*> SUN55IW3 PRCM CCU
<*> SUN55IW3_MCU_CCU
设备树配置
CCU 模块配置
ccu: ccu@2001000 {
compatible = "allwinner,sun55iw3-ccu";
reg = <0x0 0x02001000 0x0 0x1000>;
clocks = <&dcxo24M>, <&rtc_ccu CLK_OSC32K>, <&rc_16m>;
clock-names = "hosc", "losc", "iosc";
#clock-cells = <1>;
#reset-cells = <1>;
};