这种绑定是一项正在进行的工作,并且是基于一些实验的工作。
时钟信号源可以由设备树中的任何节点表示。这些节点被指定为时钟提供者。使用时钟
节点phandle和时钟说明符对来连接时钟输出时钟输入。
与gpio说明符类似,时钟说明符是一个由零、一个或多个单元组成的数组,用于标识时钟
在设备上的输出。时钟说明符的长度由时钟提供程序节点中#clock-cells属性的值。
时钟提供者
所需属性:
#clock-cells: 时钟说明符中的单元数;通常为0节点具有单个时钟输出,1用于节点具有多个时钟输出。
可选属性:
clock-output-names: 建议为第一个单元格索引的时钟输出信号的字符串列表名称。
但是,时钟输出名称的含义是特定于时钟提供者,并且鼓励仅提供给对大多数时钟使用相同的含义
提供者。此格式可能不适用于时钟提供者使用复杂的时钟说明符格式。在这些情况下
建议省略此属性并创建特定名称属性的绑定。时钟节点消费者决不能直接引用提供者时钟输出名称属性
例如:
oscillator {
#clock-cells = <1>;
clock-output-names = "ckil", "ckih";
};
-该节点定义了一个设备具有两个时钟输出,第一个名为“ckil”和第二个名为“ckih”。消费者节点始终
按索引引用时钟。名称应反映设备时钟输出信号的名称。
clock-indices: 如果节点中时钟的标识号从零开始不是线性的,则这允许标识符映射
到时钟输出名称阵列中。
例如,如果我们有两个时钟 <&oscillator 1>和<&oscillator 3>::
oscillator {
compatible = “myclocktype”;
#clock-cells = <1>;
clock-indices = <1>, <3>;
clock-output-names = “clka”, “clkb”;
}
这确保了时钟输出名称中没有任何空字符串
时钟消费者
必需的属性
clocks: phandle和clock说明符对的列表,一对用于输入到设备的时钟。注意:如果
时钟提供者的 #clock-cell“0”,然后只有phandle会出现。
可选属性:
clock-names: 按相同顺序排列的时钟输入名称字符串列表。消费者驱动将使用clock-names来匹配特定时钟输入名称。
clock-ranges: 空属性指示子节点可以该节点的时钟。对总线节点提供时钟给子节点比较有用。
例如:
device {
clocks = <&osc 1>, <&ref 0>;
clock-names = “baud”, “register”;
};
这表示一个设备具有两个时钟输入,分别命名为"baud" 和"register"。
波特时钟连接到 &osc 设备输出1,寄存器时钟连接到&ref的输出0。
例如:
/* external oscillator */
osc: oscillator {
compatible = “fixed-clock”;
#clock-cells = <1>;
clock-frequency = <32678>;
clock-output-names = “osc”;
};
/锁相环装置,通过外部振荡器产生更高频率的时钟/
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";
};
/UART使用低频振荡器作为波特时钟,以及高频PLL输出作为寄存器时钟/
uart@a000 {
compatible = "fsl,imx-uart";
reg = <0xa000 0x1000>;
interrupts = <33>;
clocks = <&osc 0>, <&pll 1>;
clock-names = "baud", "register";
};
这个设备树代码定义了三个设备:一个外部振荡器,用于提供低频参考时钟,一个PLL设备产生更高频率
时钟信号和UART。
*振荡器是固定频率的,并提供一个时钟输出,称为“osc”。
*PLL既是时钟提供者又是时钟消耗者。它使用由外部振荡器产生的时钟信号,并提供两个输出信号(“pll”和“pll-switched”)。
*UART有它的波特时钟连接到外部振荡器及其寄存器时钟连接到PLL时钟(“pll-switched” 信号)
分配父时钟和速率
某些平台可能需要初始配置默认父时钟以及时钟频率。这样的配置通过在设备树节点中指定
分配的时钟、分配的父时钟和指定的时钟速率属性。所分配的父时钟应包含父项列表
phandle,时钟对,以及指定的时钟速率应包含以Hz为单位的频率列表属性。这些
属性应与分配的时钟列表相对应。
要跳过设置父级时钟或速率,其对应项应设置为0,或者如果后面没有任何非零项,则可以省略
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>;
};
在此示例中,<&pll2>时钟设置为时钟<&clkcon 0>的父时钟,并且
<&pll2>时钟被分配了460800Hz的频率值。
通过消费者的设备时钟节点配置父节点时钟和速率只能用于具有单个用户。在多个使用者节点中配置共享父级时钟或速率存在冲突,是被禁止的。
影响多个消费者设备的公共时钟的配置,只能在时钟提供者节点中指定。