LV035-时钟实例
这里我是看的 rk3568 的教程学习的,这里就以 rk3568 为例,虽然芯片不同,但是设备树的语法都是一样的。
时钟(Clock) 用于描述硬件设备和系统中的时钟源以及时钟相关的配置和连接关系。 时钟在计算机系统中起着至关重要的作用, 用于同步和定时各种硬件设备的操作。 时钟可以分为两个主要角色: 时钟生产者(clock provider) 和时钟消费者(clock consumer) 。
一、时钟生产者(clock provider)
时钟生产者是负责生成和提供时钟信号的硬件或软件模块。 它可以是时钟控制器、PLL、 时钟发生器等。时钟节点属性如下:
- (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) clock-frequency
clock-frequency 属性是设备树中用于指定时钟频率的属性。 它用于描述时钟节点所提供的时钟信号的频率, 使用 Hertz (Hz) 作为单位。 对于时钟生产者节点, clock-frequency 属性表示该节点生成的时钟信号的频率。 它用于描述时钟控制器、 晶振、 PLL 等产生时钟信号的硬件或软件模块的输出频率, 例如指定时钟频率为 24000000 的具体示例如下所示:
osc24m: osc24m {
compatible = "clock";
clock-frequency = <24000000>;
clock-output-names = "osc24m";
#clock-cells = <O>;
};- (3) assigned-clocks 和 assigned-clock-rates
assigned-clocks 和 assigned-clock-rates 是设备树中用于描述多路时钟的属性, 通常一起使用。
assigned-clocks 属性用于标识时钟消费者节点所使用的时钟源。 它是一个整数数组, 每个元素对应一个时钟编号。 时钟编号是指时钟生产者节点(如时钟控制器) 所提供的时钟源的编号。 通过在时钟消费者节点中使用 assigned-clocks 属性, 可以指定该节点所需的时钟源。
assigned-clock-rates 属性用于指定每个时钟源的时钟频率。 它是一个整数数组, 每个元素对应一个时钟源的频率。 时钟频率以 Hz (赫兹) 为单位表示。 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>;
};- (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";
};在第一个节点中 "atlclk", "aplclk", "gpuclk" 三个时钟源的索引就分别被设置为了 0、 1、 2, 在第二个节点中 "pxlclk" 时钟源的索引值被设置为了 3.
- (5) assigned-clock-parents
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>;
};上述设备树表示了一个名为 clock 的时钟消费者节点, 具有以下属性:
assigned-clocks 属性指定了该节点使用的时钟源, 引用了两个时钟源节点: clkcon 0 和 pll 2。assigned-clock-parents 属性指定了这些时钟源的父时钟源, 引用了 pll 2 时钟源节点。assigned-clock-rates 属性指定了每个时钟源的时钟频率, 分别是 115200 和 9600。
二、时钟消费者(clock consumer)
定义: 时钟消费者是依赖时钟信号的硬件设备或模块。 它们通过引用时钟生产者节点提供的时钟源来获取时钟信号。 时钟消费者属性如下:
- (1) clocks
该属性用于指定时钟消费者节点所需的时钟源。 它是一个整数数组, 每个元素是一个时钟编号, 表示时钟消费者需要的一个时钟源。
- (2) clock-names
可选属性, 用于指定时钟消费者节点所需时钟源的名称。 它是一个字符串数组, 与 clocks 数组一一对应, 用于提供时钟源的描述性名称。
一个时钟消费者示例如下所示:
clock: clock {
clocks = <&cru CLK_VOP>;
clock-names = "clk_vop";
};clocks 属性指定了该节点使用的时钟源, 引用了 cru 节点中的 CLK_VOP 时钟源。clock-names 属性指定了时钟源的名称, 这里是 "clk_vop"。