蜗窝科技

为什么这个DTS不好用呢

蜗窝讨论区存档 · Linux kernel技术问答 · 楼主 Kerry · 2016-07-28 · 6 帖

本文是原「蜗窝讨论区」的历史存档(2016-07-28),来自版块「Linux kernel技术问答」,共 6 帖。讨论区已停止服务,此处仅供查阅。

Kerry · 2016-07-28 13:51

这个定义是好用的,

** 写道:**

/ { model = "××××××××××××"; compatible = "××××××××××××××××"; #address-cells = <1>; #size-cells = <1>;

pll2: pll2 {
    #clock-cells = &lt;0&gt;;
    compatible = "fixed-clock";
    clock-frequency = &lt;800000000&gt;;
};

sdclk0: sdclk1 { compatible = “fixed-factor-clock”; #clock-cells = &lt;0&gt;; clock-div = &lt;1&gt;; clock-mult = &lt;1&gt;; clocks = &lt;&amp;pll2&gt;; clock-output-names = “ahbs”; };

gate_sd1: gate_sd1 { compatible = “xacti,ev9x-gates-sd-clk”; #clock-cells = &lt;0&gt;; reg = &lt;0x300A3010 0x4&gt;; div_reg = &lt;0x30000A34&gt;; clocks = &lt;&amp;pll2&gt;; };

gate_sd0: gate_sd0 { compatible = “xacti,ev9x-gates-sd-clk”; #clock-cells = &lt;0&gt;; reg = &lt;0x300A3000 0x4&gt;; div_reg = &lt;0x30000A30&gt;; clocks = &lt;&amp;pll2&gt;; };

gate_sd2: gate_sd2 { compatible = "xacti,ev9x-gates-sd-clk"; #clock-cells = <0>; reg = <0x300A3040 0x4>; div_reg = <0x30000A38>; clocks = <&pll2>; };

sdhci: sdhci@21A10000 {
    compatible = "inrevium,te4395-sdhci";
    reg = &lt;0x21A10000 0x1000&gt;;
    int_mod = &lt;0x300A30F0 0x0020&gt;;
    int_stt = &lt;0x300A30F4 0x0020&gt;;
    clocks = &lt;&amp;gate_sd1&gt;;
    interrupt-parent = &lt;&amp;vic0&gt;;
    interrupts = &lt;21&gt;;
};

这个定义是不好用的,

** 写道:**

/ { model = "××××××××××××"; compatible = "××××××××××××××××"; #address-cells = <1>; #size-cells = <1>;

pll2: pll2 {
    #clock-cells = &lt;0&gt;;
    compatible = "fixed-clock";
    clock-frequency = &lt;800000000&gt;;
};

sdclk0: sdclk1 { compatible = “fixed-factor-clock”; #clock-cells = &lt;0&gt;; clock-div = &lt;1&gt;; clock-mult = &lt;1&gt;; clocks = &lt;&amp;pll2&gt;; clock-output-names = “ahbs”; };

gate_sd0: gate_sd0 { compatible = “xacti,ev9x-gates-sd-clk”; #clock-cells = &lt;0&gt;; reg = &lt;0x300A3000 0x4&gt;; div_reg = &lt;0x30000A30&gt;; clocks = &lt;&amp;pll2&gt;; };

gate_sd1: gate_sd1 { compatible = “xacti,ev9x-gates-sd-clk”; #clock-cells = &lt;0&gt;; reg = &lt;0x300A3010 0x4&gt;; div_reg = &lt;0x30000A34&gt;; clocks = &lt;&amp;pll2&gt;; };

gate_sd2: gate_sd2 { compatible = "xacti,ev9x-gates-sd-clk"; #clock-cells = <0>; reg = <0x300A3040 0x4>; div_reg = <0x30000A38>; clocks = <&pll2>; };

sdhci: sdhci@21A10000 {
    compatible = "inrevium,te4395-sdhci";
    reg = &lt;0x21A10000 0x1000&gt;;
    int_mod = &lt;0x300A30F0 0x0020&gt;;
    int_stt = &lt;0x300A30F4 0x0020&gt;;
    clocks = &lt;&amp;gate_sd1&gt;;
    interrupt-parent = &lt;&amp;vic0&gt;;
    interrupts = &lt;21&gt;;
};

我的sdhci用的是gate_sd1时钟, 在这里把gate_sd1写在前面就好用,是为什么呢, 在代码里会调用devm_clk_get获取时钟

** 写道:**

pltfm_host-&gt;clk = devm_clk_get(&amp;pdev-&gt;dev, NULL);
if (IS_ERR(pltfm_host-&gt;clk)) {
    ret = PTR_ERR(pltfm_host-&gt;clk);
    pr_info("devm_clk_get( failed, return %d, got clk:%p\n", ret, pltfm_host-&gt;clk);
    goto err;
}

错误时的输出:

** 写道:**

devm_clk_get( failed, return -517, got clk:fffffdfb

是不是很奇怪

wowo · 2016-07-28 17:09

Kerry 写道: 这个定义是好用的,

** 写道:**

/ { model = "××××××××××××"; compatible = "××××××××××××××××"; #address-cells = <1>; #size-cells = <1>;

pll2: pll2 {
    #clock-cells = &lt;0&gt;;
    compatible = "fixed-clock";
    clock-frequency = &lt;800000000&gt;;
};

sdclk0: sdclk1 { compatible = “fixed-factor-clock”; #clock-cells = &lt;0&gt;; clock-div = &lt;1&gt;; clock-mult = &lt;1&gt;; clocks = &lt;&amp;pll2&gt;; clock-output-names = “ahbs”; };

gate_sd1: gate_sd1 { compatible = “xacti,ev9x-gates-sd-clk”; #clock-cells = &lt;0&gt;; reg = &lt;0x300A3010 0x4&gt;; div_reg = &lt;0x30000A34&gt;; clocks = &lt;&amp;pll2&gt;; };

gate_sd0: gate_sd0 { compatible = “xacti,ev9x-gates-sd-clk”; #clock-cells = &lt;0&gt;; reg = &lt;0x300A3000 0x4&gt;; div_reg = &lt;0x30000A30&gt;; clocks = &lt;&amp;pll2&gt;; };

gate_sd2: gate_sd2 { compatible = "xacti,ev9x-gates-sd-clk"; #clock-cells = <0>; reg = <0x300A3040 0x4>; div_reg = <0x30000A38>; clocks = <&pll2>; };

sdhci: sdhci@21A10000 {
    compatible = "inrevium,te4395-sdhci";
    reg = &lt;0x21A10000 0x1000&gt;;
    int_mod = &lt;0x300A30F0 0x0020&gt;;
    int_stt = &lt;0x300A30F4 0x0020&gt;;
    clocks = &lt;&amp;gate_sd1&gt;;
    interrupt-parent = &lt;&amp;vic0&gt;;
    interrupts = &lt;21&gt;;
};

这个定义是不好用的,

** 写道:**

/ { model = "××××××××××××"; compatible = "××××××××××××××××"; #address-cells = <1>; #size-cells = <1>;

pll2: pll2 {
    #clock-cells = &lt;0&gt;;
    compatible = "fixed-clock";
    clock-frequency = &lt;800000000&gt;;
};

sdclk0: sdclk1 { compatible = “fixed-factor-clock”; #clock-cells = &lt;0&gt;; clock-div = &lt;1&gt;; clock-mult = &lt;1&gt;; clocks = &lt;&amp;pll2&gt;; clock-output-names = “ahbs”; };

gate_sd0: gate_sd0 { compatible = “xacti,ev9x-gates-sd-clk”; #clock-cells = &lt;0&gt;; reg = &lt;0x300A3000 0x4&gt;; div_reg = &lt;0x30000A30&gt;; clocks = &lt;&amp;pll2&gt;; };

gate_sd1: gate_sd1 { compatible = “xacti,ev9x-gates-sd-clk”; #clock-cells = &lt;0&gt;; reg = &lt;0x300A3010 0x4&gt;; div_reg = &lt;0x30000A34&gt;; clocks = &lt;&amp;pll2&gt;; };

gate_sd2: gate_sd2 { compatible = "xacti,ev9x-gates-sd-clk"; #clock-cells = <0>; reg = <0x300A3040 0x4>; div_reg = <0x30000A38>; clocks = <&pll2>; };

sdhci: sdhci@21A10000 {
    compatible = "inrevium,te4395-sdhci";
    reg = &lt;0x21A10000 0x1000&gt;;
    int_mod = &lt;0x300A30F0 0x0020&gt;;
    int_stt = &lt;0x300A30F4 0x0020&gt;;
    clocks = &lt;&amp;gate_sd1&gt;;
    interrupt-parent = &lt;&amp;vic0&gt;;
    interrupts = &lt;21&gt;;
};

我的sdhci用的是gate_sd1时钟, 在这里把gate_sd1写在前面就好用,是为什么呢, 在代码里会调用devm_clk_get获取时钟

** 写道:**

pltfm_host-&gt;clk = devm_clk_get(&amp;pdev-&gt;dev, NULL);
if (IS_ERR(pltfm_host-&gt;clk)) {
    ret = PTR_ERR(pltfm_host-&gt;clk);
    pr_info("devm_clk_get( failed, return %d, got clk:%p\n", ret, pltfm_host-&gt;clk);
    goto err;
}

错误时的输出:

** 写道:**

devm_clk_get( failed, return -517, got clk:fffffdfb

是不是很奇怪

检查一下DTB文件在内存中,是不是有被覆盖的风险。

tigger · 2016-07-28 19:57

可以看一下wowo之前写的几篇dts的文章,会对你的问题有帮助的~

728330453 · 2016-08-26 12:36

@Kerry

可以在uboot下面,通过以下命令:
fdt addr xxxx(addr of dtb)
fdt print
将你的设备树flash上的内容打印出来,
然后对比,这两个设备树是不是一样的!!!

按照道理来说,先后顺序并不影响在内存中节点的排布以及内容吧!

希望对你有帮助~

Kerry · 2016-11-10 10:42

728330453 写道: @Kerry

可以在uboot下面,通过以下命令:
fdt addr xxxx(addr of dtb)
fdt print
将你的设备树flash上的内容打印出来,
然后对比,这两个设备树是不是一样的!!!

按照道理来说,先后顺序并不影响在内存中节点的排布以及内容吧!

希望对你有帮助~

谢谢你的回复,我没有用uboot。。。。

zhuzhiqiang · 2016-11-15 09:44

没看懂啥意思