==Example==/* 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>; // 代表consumerclock-names = "ref"; //reg = <0x4c000 0x1000>;clock-output-names = "pll", "pll-switched"; //代表provider};/* 时钟消费者 */uart@a000 {compatible = "fsl,imx-uart";reg = <0xa000 0x1000>;...clocks = <&osc 0>, <&pll 1>; //clocks-xx 用于时钟连接clock-names = "baud", "register";assigned-clocks = <&clkcon 0>, <&pll 2>;// assigned-clocks-xx 用于时钟配置assigned-clock-parents = <&pll 2>; //只有一组,所以忽略clocks 中 &pll2 对应的parentassigned-clock-rates = <0>, <460800>; //0 代表跳过配置};
1、consumer dts interface
clock consumer的属性列表如下:
属性名 | 描述 | |
clocks | 必须 | 该属性描述clock consumer设备使用的clock source,或者clock input 而clock source是由phandle和clock specifier来描述。 phandle指向一个clock provider的device node, 如果该provider的#clock-cells等于0,那么说明该provider就一个output,那么就不需要clock specifier来进一步描述。如果该provider的#clock-cells不等于0,那么clock specifier必须提供,以便指明本设备到底使用provider输出时钟源的哪一路。 |
clock-names | 可选 | 同样的,该属性也似描述设备使用的clock source信息的,也是一个数组,是一个字符串数组,每一个字符串描述一个clock source,对应着clocks中phandle和clock specifier。 之所以提供clock-names这个属性其实是为了编程方便,驱动程序可以通过比较直观的clock name来找到该设备的输入时钟源信息。 |
clock-ranges | 可选 | 该属性值为空,主要用来说明该设备的下级设备可以继承该设备的clock source。例如B设备是A设备的sub node,A设备如果有clock-ranges属性,那么B设备在寻找其clock source的时候,如果在本node定义的clock相关属性中没有能够找到,那么可以去A设备去继续寻找(也就是说,B设备会继承A设备的clock source相关的属性,也就是clocks或者clock-names这两个属性)。 |
2、provider dts interface
clock provider的属性列表如下:
属性 | 描述 | |
#clock-cells | 必须 | 我们上面说过了,一个HW block(clock consumer)的时钟源可以通过phandle和clock specifier来描述,这里#clock-cells就是说明使用多少个cell(u32)来描述clock specifier。 如果等于0,说明provider就一个clock output,不需要specifier, 如果等于1,说明provider有多个clock output(能用u32标识)。 >=2的情况应该不存在,一个provider不可能提供超过2^32个clock output。 |
clock-output-names | 可选 | 如果clock provider能提供多路时钟输出,那么给每一个clock output起个适合人类阅读的名字是不错的选择,这也就是clock-output-names的目的。clock consumer中提供的clock specifier是一个index,通过这个index可以在clock-output-names属性值中找到对应的时钟源的名字。 |
clock-indices | 可选 | 如果不提供这个属性,那么clock-output-names和index的对应关系就是0,1,2……。 如果这个对应关系不是线性的,那么可以通过clock-indices属性来定义映射到clock-output-names的index。 |
3、clock config interface
初始化时可以通过dts来设定clock parent以及clock rate,具体属性如下:
属性名 | 描述 | |
assigned-clocks | 可选 | 这个属性列出了需要进行设定的clock,其值是一个phandle+clock specifier数组 |
assigned-clock-parent | 可选 | 准备要设定的parent列表。“儿子”在哪里呢?assigned-clocks中定义的,注意,是一一对应的。例如: assigned-clocks:A, B,C; assigned-clock-parent:A_parent,B_parent,C_parent; |
assigned-clock-rate | 可选 | 要设定的频率列表,同样的,和assigned-clocks也是一一对应的。 |
参考连接:
wowotech Common Clock Framework系统结构
linux 文档: Documentation/devicetree/bindings/clock/clock-bindings.txt