该绑定是一个进行中的工作,它基于benh [1]的一些实验工作。
时钟信号源可以由设备树中的任何节点表示。 这些节点被指定为时钟提供者。 时钟使用者节点使用一对phandle和specifiers将时钟提供程序输出连接到时钟输入。 与gpio specifiers相似,clock specifiers是一个零数组,一个或多个单元标识设备上的时钟输出。 时钟说明符的长度由时钟提供程序节点中的#clock-cells属性的值定义。
[1] http://patchwork.ozlabs.org/patch/31551/
必需的属性:
#clock-cells:时钟说明符中的单元数; 对于具有单个时钟输出的节点,通常为0;
对于具有多个时钟输出的节点,通常为1。
可选属性:
clock-output-names:建议是由时钟说明符中第一个单元索引的时钟输出信号名称的字符串列表。 但是,clock-output-name的含义
是特定于时钟提供者的域,并且仅用于鼓励大多数时钟提供者使用相同的含义。此格式可能不适用于使用复杂时钟说明符格式的时钟提供者。
在这些情况下,建议忽略此属性并创建绑定特定名称的属性。
时钟使用者节点绝对不能直接引用提供程序的clock-output-names属性。
For example:
oscillator {
#clock-cells = <1>;
clock-output-names = "ckil", "ckih";
};
该节点定义了一个具有两个时钟输出的设备,第一个命名为 “ ckil”,第二个命名为“ ckih”。
消费者节点始终按索引引用时钟。 名称应反映设备的时钟输出信号名称。
clock-indices:如果节点中时钟的标识号不是从零线性开始的,则这允许将标识符映射到clock-output-names数组中。
例如,如果我们有两个时钟<&oscillator 1>和<&oscillator 3>:
oscillator {
compatible = "myclocktype";
#clock-cells = <1>;
clock-indices = <1>, <3>;
clock-output-names = "clka", "clkb";
}
这可以确保我们在clock-output-names中没有任何空字符串
必需的属性:
clocks:phandle和clock specifier对中输入到每个设备的时钟。 注意:如果时钟提供者将
#clock-cells指定为“ 0”,则仅会出现该对中的phandle部分。
可选属性:
clock-names:以与clocks属性相同的顺序排序的时钟输入名称字符串的列表。
消费者驱动程序将使用时钟名称来将时钟输入名称与时钟说明符进行匹配。
clock-ranges:空属性,指示子节点可以从该节点继承命名的时钟。 对于总线节点向其子节点提供时钟非常有用。
例如:
device {
clocks = <&osc 1>, <&ref 0>;
clock-names = "baud", "register";
};
这表示一个具有两个时钟输入的设备,分别称为“baud”和“register”。 baud时钟连接到&osc器件的输出1,register时钟连接到&ref的输出0。
Example:
/* external oscillator */
osc: oscillator {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <32678>;
clock-output-names = "osc";
};
/* phase-locked-loop device, generates a higher frequency clock
* from the external oscillator reference */
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, using the low frequency oscillator for the baud clock,
* and the high frequency switched PLL output for register
* clocking */
uart@a000 {
compatible = "fsl,imx-uart";
reg = <0xa000 0x1000>;
interrupts = <33>;
clocks = <&osc 0>, <&pll 1>;
clock-names = "baud", "register";
};
该DT片段定义了三个设备:一个提供低频参考时钟的外部振荡器,一个产生更高频率时钟信号的PLL设备以及一个UART。
Assigned clock parents and rates
某些平台可能需要初始配置默认的父时钟和时钟频率。 可以在设备树节点中指定时钟,分配的时钟父对象和分配的时钟速率属性指定这种配置。 Assigned-clock-parents属性应包含一对以phandle和clock标识符对形式的父时钟,而assigned-clock-rates属性应包含以Hz为单位的频率列表。这两个属性应对应于assigned-clocks属性中列出的时钟。
要跳过设置时钟的父时钟或时钟速率,应将其相应的条目设置为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>;
};
在此示例中,<&pll 2>时钟被设置为时钟<&clkcon 0>的父级,并且<&pll 2>时钟被分配了460800 Hz的频率值。
通过消耗该时钟的设备节点配置时钟的父级和速率只能对具有单个用户的时钟进行。 禁止在多个使用方节点中为共享时钟指定冲突的父级或速率配置。
可以在时钟提供程序节点中类似地指定影响多个用户设备的公共时钟配置。
Protected clocks
某些平台或固件可能无法完全向操作系统提供所有时钟,例如在那些以ARM安全执行级别运行的驱动程序使用这些时钟的情况下。 可以在设备树中使用时钟说明符列表形式的protected-clocks属性指定这种配置。 仅应在提供受保护时钟的节点中指定此属性:
clock-controller@a000f000 {
compatible = "vendor,clk95;
reg = <0xa000f000 0x1000>
#clocks-cells = <1>;
...
protected-clocks = <UART3_CLK>, <SPI5_CLK>;
};