linux设备树-时钟

==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>;     // 代表consumer
        clock-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  对应的parent
        assigned-clock-rates = <0>, <460800>; //0 代表跳过配置
    };

1、consumer dts interface

clock consumer的属性列表如下:

属性名描述
clocks必须

该属性描述clock consumer设备使用的clock source,或者clock input
该属性是一个数组,数组中每一个具体的entry对应一个clock source。

而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

  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐分享-程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值