系列文章目录
Exynos4412的Linux时钟驱动开发(一)——Exynos4412的时钟管理单元CMU
Exynos4412的Linux时钟驱动开发(二)——时钟驱动的初始化(CLK_OF_DECLARE的机制)
Exynos4412的Linux时钟驱动开发(三)——Common Clock Framework(CCF)简介
Exynos4412的Linux5.4.174时钟驱动开发(四)——clk API的调用方法
Exynos4412的Linux5.4.174时钟驱动开发(五)——时钟设备树的修改方法
Exynos4412的Linux5.4.174时钟驱动开发(五)——设备树的修改方法
在Exynos4412的Linux5.4.174时钟驱动开发(四)——clk API的调用方法这篇博文中,我们了解到关于时钟有2种设备:第一种是时钟提供者,例如晶振、PLL;第二种是时钟使用者,例如串口、pwm、adc等。这两种设备的设备树的属性是不一样的。
一、时钟提供者(clock provider)的设备树
示例:
/* 外部晶振(external oscillator)*/
osc: oscillator {
compatible = "fixed-clock";
#clock-cells = <1>;
clock-frequency = <32678>;
clock-output-names = "osc";
};
/* PLL device, 产生高频率clock
* 其输入时钟是外部晶振(external oscillator)*/
pll: pll@4c000 {
compatible = "vendor,some-pll-interface"
#clock-cells = <1>;
clocks = <&osc 0>;
clock-names = "ref";
reg = <0x4c000 0x1000>;
clock-output-names = "pll", "pll-switched";
};
-
compatible属性
匹配compatible属性,调用时钟初始化函数,就能够构建clk_hw结构体,并把该节点添加到of_clk_provider
的list链表中。 -
#clock-cells属性:
时钟提供者(clock provider)的node节点必须有#clock-cells
属性,说明该节点是clock provider。它有2种取值:
#clock-cells = <0>,只有一个时钟输出
#clock-cells = <1>,有多个时钟输出 -
reg属性
时钟控制寄存器的物理首地址。 -
clock-output-names、clock-indices、Protected clocks属性
请参考以下文献,第①个博文较好地翻译了第②个帮助文档:
①clock bindings
②Documentation/devicetree/bindings/clock/clock-bindings.txt
可以看出,示例中的pll: pll@4c000
既是时钟使用者,也是时钟生产者。
二、时钟使用者(clock consumer)的设备树
示例:
uart@a000 {
compatible = "fsl,imx-uart";
reg = <0xa000 0x1000>;
...
clocks = <&osc 0>, <&pll 1>;
clock-names = "baud", "register";
assigned-clocks = <&clkcon 0>, <&pll 2>;
assigned-clock-parents = <&pll 2>;
assigned-clock-rates = <0>, <460800>;
};
- compatible属性
根据compatible匹配probe函数,调用devm_clk_get()
函数根据clock-names来查找并获取对时钟生产者的引用,获取时钟生产者的clk结构体。 - clocks属性:
时钟使用者(clock consumer)的node节点必须有clocks
属性,说明该节点是clock consumer。
clocks属性由2部分组成:phandle、clock-specifier。
clocks = <phandle clock-specifier>
– phandle是@节点名称(例如上个示例中的@osc、@pll)。
– clock-specifier怎么理解呢?一个时钟控制器可以控制很多时钟硬件(例如5种基本时钟:fixed-rate、fixed-factor、gate、mux、divider),每种时钟硬件都有对应的ID号。clock-specifier就是这个ID号。例如,Exynos4412的时钟硬件编号已经在include/dt-bindings/clock/exynos4.h中声明了。
另外,注意:如果时钟提供者将#clock-cells指定为“ 0”,则仅会出现该对中的phandle部分。
-
reg属性
时钟使用者寄存器的物理首地址。 -
clock-names、clock-ranges、Assigned clock parents and rates属性
请参考以下文献,第①个博文较好地翻译了第②个帮助文档:
①clock bindings
②Documentation/devicetree/bindings/clock/clock-bindings.txt