为什么这个DTS不好用呢
本文是原「蜗窝讨论区」的历史存档(2016-07-28),来自版块「Linux kernel技术问答」,共 6 帖。讨论区已停止服务,此处仅供查阅。
这个定义是好用的,
** 写道:**
/ { model = "××××××××××××"; compatible = "××××××××××××××××"; #address-cells = <1>; #size-cells = <1>;
pll2: pll2 {
#clock-cells = <0>;
compatible = "fixed-clock";
clock-frequency = <800000000>;
};
sdclk0: sdclk1 {
compatible = “fixed-factor-clock”;
#clock-cells = <0>;
clock-div = <1>;
clock-mult = <1>;
clocks = <&pll2>;
clock-output-names = “ahbs”;
};
gate_sd1: gate_sd1 {
compatible = “xacti,ev9x-gates-sd-clk”;
#clock-cells = <0>;
reg = <0x300A3010 0x4>;
div_reg = <0x30000A34>;
clocks = <&pll2>;
};
gate_sd0: gate_sd0 {
compatible = “xacti,ev9x-gates-sd-clk”;
#clock-cells = <0>;
reg = <0x300A3000 0x4>;
div_reg = <0x30000A30>;
clocks = <&pll2>;
};
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 = <0x21A10000 0x1000>;
int_mod = <0x300A30F0 0x0020>;
int_stt = <0x300A30F4 0x0020>;
clocks = <&gate_sd1>;
interrupt-parent = <&vic0>;
interrupts = <21>;
};
这个定义是不好用的,
** 写道:**
/ { model = "××××××××××××"; compatible = "××××××××××××××××"; #address-cells = <1>; #size-cells = <1>;
pll2: pll2 {
#clock-cells = <0>;
compatible = "fixed-clock";
clock-frequency = <800000000>;
};
sdclk0: sdclk1 {
compatible = “fixed-factor-clock”;
#clock-cells = <0>;
clock-div = <1>;
clock-mult = <1>;
clocks = <&pll2>;
clock-output-names = “ahbs”;
};
gate_sd0: gate_sd0 {
compatible = “xacti,ev9x-gates-sd-clk”;
#clock-cells = <0>;
reg = <0x300A3000 0x4>;
div_reg = <0x30000A30>;
clocks = <&pll2>;
};
gate_sd1: gate_sd1 {
compatible = “xacti,ev9x-gates-sd-clk”;
#clock-cells = <0>;
reg = <0x300A3010 0x4>;
div_reg = <0x30000A34>;
clocks = <&pll2>;
};
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 = <0x21A10000 0x1000>;
int_mod = <0x300A30F0 0x0020>;
int_stt = <0x300A30F4 0x0020>;
clocks = <&gate_sd1>;
interrupt-parent = <&vic0>;
interrupts = <21>;
};
我的sdhci用的是gate_sd1时钟, 在这里把gate_sd1写在前面就好用,是为什么呢, 在代码里会调用devm_clk_get获取时钟
** 写道:**
pltfm_host->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(pltfm_host->clk)) {
ret = PTR_ERR(pltfm_host->clk);
pr_info("devm_clk_get( failed, return %d, got clk:%p\n", ret, pltfm_host->clk);
goto err;
}
错误时的输出:
** 写道:**
devm_clk_get( failed, return -517, got clk:fffffdfb
是不是很奇怪
Kerry 写道: 这个定义是好用的,
** 写道:**
/ { model = "××××××××××××"; compatible = "××××××××××××××××"; #address-cells = <1>; #size-cells = <1>;
pll2: pll2 {
#clock-cells = <0>;
compatible = "fixed-clock";
clock-frequency = <800000000>;
};
sdclk0: sdclk1 {
compatible = “fixed-factor-clock”;
#clock-cells = <0>;
clock-div = <1>;
clock-mult = <1>;
clocks = <&pll2>;
clock-output-names = “ahbs”;
};
gate_sd1: gate_sd1 {
compatible = “xacti,ev9x-gates-sd-clk”;
#clock-cells = <0>;
reg = <0x300A3010 0x4>;
div_reg = <0x30000A34>;
clocks = <&pll2>;
};
gate_sd0: gate_sd0 {
compatible = “xacti,ev9x-gates-sd-clk”;
#clock-cells = <0>;
reg = <0x300A3000 0x4>;
div_reg = <0x30000A30>;
clocks = <&pll2>;
};
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 = <0x21A10000 0x1000>;
int_mod = <0x300A30F0 0x0020>;
int_stt = <0x300A30F4 0x0020>;
clocks = <&gate_sd1>;
interrupt-parent = <&vic0>;
interrupts = <21>;
};
这个定义是不好用的,
** 写道:**
/ { model = "××××××××××××"; compatible = "××××××××××××××××"; #address-cells = <1>; #size-cells = <1>;
pll2: pll2 {
#clock-cells = <0>;
compatible = "fixed-clock";
clock-frequency = <800000000>;
};
sdclk0: sdclk1 {
compatible = “fixed-factor-clock”;
#clock-cells = <0>;
clock-div = <1>;
clock-mult = <1>;
clocks = <&pll2>;
clock-output-names = “ahbs”;
};
gate_sd0: gate_sd0 {
compatible = “xacti,ev9x-gates-sd-clk”;
#clock-cells = <0>;
reg = <0x300A3000 0x4>;
div_reg = <0x30000A30>;
clocks = <&pll2>;
};
gate_sd1: gate_sd1 {
compatible = “xacti,ev9x-gates-sd-clk”;
#clock-cells = <0>;
reg = <0x300A3010 0x4>;
div_reg = <0x30000A34>;
clocks = <&pll2>;
};
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 = <0x21A10000 0x1000>;
int_mod = <0x300A30F0 0x0020>;
int_stt = <0x300A30F4 0x0020>;
clocks = <&gate_sd1>;
interrupt-parent = <&vic0>;
interrupts = <21>;
};
我的sdhci用的是gate_sd1时钟, 在这里把gate_sd1写在前面就好用,是为什么呢, 在代码里会调用devm_clk_get获取时钟
** 写道:**
pltfm_host->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(pltfm_host->clk)) {
ret = PTR_ERR(pltfm_host->clk);
pr_info("devm_clk_get( failed, return %d, got clk:%p\n", ret, pltfm_host->clk);
goto err;
}
错误时的输出:
** 写道:**
devm_clk_get( failed, return -517, got clk:fffffdfb
是不是很奇怪
检查一下DTB文件在内存中,是不是有被覆盖的风险。
可以看一下wowo之前写的几篇dts的文章,会对你的问题有帮助的~
@Kerry
可以在uboot下面,通过以下命令:
fdt addr xxxx(addr of dtb)
fdt print
将你的设备树flash上的内容打印出来,
然后对比,这两个设备树是不是一样的!!!
按照道理来说,先后顺序并不影响在内存中节点的排布以及内容吧!
希望对你有帮助~
728330453 写道: @Kerry
可以在uboot下面,通过以下命令:
fdt addr xxxx(addr of dtb)
fdt print
将你的设备树flash上的内容打印出来,
然后对比,这两个设备树是不是一样的!!!
按照道理来说,先后顺序并不影响在内存中节点的排布以及内容吧!
希望对你有帮助~
谢谢你的回复,我没有用uboot。。。。
没看懂啥意思
