04、设备树中时钟描述(被使用)
时钟(Clock)是嵌入式系统中用于协调硬件设备运作的重要工具,主要涉及时钟信号的来源、配置方式及连接关系。它通过两种核心角色发挥作用:
- 时钟生产者:负责生成时钟信号的部件;
- 时钟消费者:需要依赖时钟信号才能正常工作的硬件设备。
一、时钟生产者(Clock Provider)
定义: 时钟生产者是负责生成和提供时钟信号的硬件或软件模块。 它可以是时钟控制器、PLL、 时钟发生器等。
1.1、clock-cells
该属性用于指定时钟编号的位数。 它是一个整数值, 表示时钟编号的位数。 通常情况下, 当 clock-cells 为 0 时表示一个时钟, 为 1 表示多个时钟。 具体示例如下所示:
示例 1: 单个时钟
osc24m: osc24m {
compatible = "clock";
clock-frequency = <24000000>;
clock-output-names = "osc24m";
#clock-cells = <O>;
};
示例 2: 多个时钟
clock: clock {
#clock-cells = <1>;
clock-output-names = "clock1", "clock2";
};
2
3
4
5
6
7
8
9
10
11
12
1.2、clock-frequency
clock-frequency 属性是设备树中用于指定时钟频率的属性。 它用于描述时钟节点所提供的时钟信号的频率, 使用 Hertz (Hz) 作为单位。 对于时钟生产者节点, clock-frequency 属性表示该节点生成的时钟信号的频率。 它用于描述时钟控制器、 晶振、 PLL 等产生时钟信号的硬件或软件模块的输出频率, 例如指定时钟频率为 24000000 的具体示例如下所示:
osc24m: osc24m {
compatible = "clock";
clock-frequency = <24000000>;
clock-output-names = "osc24m";
#clock-cells = <O>;
};
2
3
4
5
6
1.3、assigned-clocks 和 assigned-clock-rates
assigned-clocks 属性用于列出设备需要的时钟源。它是一个数字列表,每个数字对应时钟提供者(如时钟控制器)提供的具体时钟编号。设备通过这个属性明确自己需要哪些时钟。
assigned-clock-rates 属性设置每个时钟的频率(单位为赫兹)。它也是一个数字列表,每个数字对应 assigned-clocks 列表中同一位置时钟的频率值。两个列表的顺序和数量必须完全一致。。
关于 assigned-clocks 和 assigned-clock-rates 属性的一个具体示例如下所示:
cru: clock-controller@fdd20000 {
#clock-cells = <1>;
assigned-clocks = <&pmucru CLK_RTC_32K>, <&cru ACLK_RKVDEC_PRE>;
assigned-clock-rates = <32768>, <300000000>;
};
2
3
4
5
1.4、clock-indices
clock-indices 属性用于指定时钟消费者节点所使用的时钟源的索引值。它是一个整数数组, 每个元素对应一个时钟源的索引。
时钟索引是指时钟生产者节点(如时钟控制器) 所提供的时钟源的编号。 通过在时钟消费者节点中使用 clock-indices 属性, 可以明确指定该节点所需的时钟源, 并按照特定的顺序进行匹配。
一个 clock-indices 示例如下所示:
scpi_dvfs: clocks-0 {
#clock-cells = <1>;
clock-indices = <0>, <1>, <2>;
clock-output-names = "atlclk", "aplclk", "gpuclk";
};
scpi_clk: clocks-1 {
#clock-cells = <1>;
clock-indices = <3>;
clock-output-names = "pxlclk";
};
2
3
4
5
6
7
8
9
10
在第一个节点中"atlclk", “aplclk”, "gpuclk"三个时钟源的索引就分别被设置为了 0、 1、 2, 在第二个节点中"pxlclk"时钟源的索引值被设置为了 3.
1.5、assigned-clock-parents
assigned-clock-parents属性用于指定设备需要的时钟信号来源。它是一个列表,每个条目对应一个父时钟的名称。在时钟系统中,有些时钟会作为其他时钟的输入源(比如父时钟为子时钟提供基础信号)。通过这个属性,设备可以直接说明自己需要哪些父时钟,并按顺序匹配对应的时钟源。
一个实际的 assigned-clock-parents 属性例子如下所示:
clock: clock {
assigned-clocks = <&clkcon 0>, <&pll 2>;
assigned-clock-parents = <&pll 2>;
assigned-clock-rates = <115200>, <9600>;
};
2
3
4
5
上述设备树表示了一个名为 clock 的时钟消费者节点, 具有以下属性:
- assigned-clocks 属性指定了该节点使用的时钟源, 引用了两个时钟源节点: clkcon 0 和 pll 2。
- assigned-clock-parents 属性指定了这些时钟源的父时钟源, 引用了 pll 2 时钟源节点。
- assigned-clock-rates 属性指定了每个时钟源的时钟频率, 分别是 115200 和 9600。
二、时钟消费者(Clock Consumer)
定义: 时钟消费者是依赖时钟信号的硬件设备或模块。 它们通过引用时钟生产者节点提供的时钟源来获取时钟信号。
2.1、clocks
该属性用于指定时钟消费者节点所需的时钟源。 它是一个整数数组, 每个元素是一个时钟编号, 表示时钟消费者需要的一个时钟源。
2.2、clock-names
可选属性, 用于指定时钟消费者节点所需时钟源的名称。 它是一个字符串数组, 与 clocks 数组一一对应, 用于提供时钟源的描述性名称。
一个时钟消费者示例如下所示:
clock: clock {
clocks = <&cru CLK_VOP>;
clock-names = "clk_vop";
};
2
3
4
clocks 属性指定了该节点使用的时钟源, 引用了 cru 节点中的 CLK_VOP 时钟源。clock-names 属性指定了时钟源的名称, 这里是 “clk_vop”。