U-Boot i2c 检测到我的设备 (70) 但 Linux i2c 没有。为什么?
U-Boot i2c detects my device (70) but Linux i2c does not. Why?
我正在从 Linux 3.10 迁移到稍新的版本 Linux 4.4.8。迁移后,i2c 似乎无法再看到我的某些硬件。硬件本身没有任何变化,在以前的 linux 版本 (3.10) 中运行良好。
我现在 运行 遇到的问题是我的 i2c 命令不再有效。
尝试写入设备时写入失败。
[]# i2cset -y 0 0x70 0 1 b
Error: Write failed
然后我决定 运行 i2cdetect 以确定可以看到什么,这就是我得到的输出
在Linux中:
[]# i2cdetect -y -a 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 21 -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- 64 -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
在 U-Boot 中:
[u-boot]# i2c probe
Valid chip addresses: 20 21 64 70
我在 U-Boot 中可以看到我的设备但在 Linux 中看不到我的设备的原因是什么?
我怀疑设备树可能需要修改?但是我检查了旧的 dtsi 文件,两个 Linux 版本的 i2c0 之间没有什么不同...
i2cdump 给出所有 X 的输出
[]# i2cdump -y 0 0x70
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
10: XX XX XX XX XX XX XX XX XX XX...
i2c host controller: linux-4-4-8/drivers/i2c/busses/i2c-mv64xxx.c
设备
0x20、0x21:PCA9555 IO 端口扩展器
0x70:PCA9548A i2c 多路复用器
较新的内核有一个不同的父 dtsi 文件,它为 pinctrl 定义了各种 mpp
我使用的 dts 文件包含一些已定义但我们从未使用过的以太网设备,由于我们的硬件几乎相同,因此我们使用了另一个团队的设备树。这些以太网使用了以下 mdio
mdio@72004 {
pinctrl-names = "default";
pinctrl-0 = <&mdio_pins>; //<==== This was the problem
phy0: ethernet-phy@0 {
reg = <0>;
};
};
mdio使用&mdio_pins,在较新的内核中定义为
mdio_pins: mdio-pins {
marvell,pins = "mpp4", "mpp5";
marvell,function = "ge";
};
我的设备的 gpio reset 恰好是 mpp5.
我将设备树的以太网部分更改为以下内容
ethernet@70000 {
status = "disabled";
};
mdio@72004 {
status = "disabled";
};
ethernet@30000 {
status = "disabled";
};
这解决了设备在 i2cdetect 中不显示的问题,并且硬件像以前一样工作。
假设我继承的设备树在所用硬件的定义中是具体的,这是我自己的错。
我正在从 Linux 3.10 迁移到稍新的版本 Linux 4.4.8。迁移后,i2c 似乎无法再看到我的某些硬件。硬件本身没有任何变化,在以前的 linux 版本 (3.10) 中运行良好。
我现在 运行 遇到的问题是我的 i2c 命令不再有效。
尝试写入设备时写入失败。
[]# i2cset -y 0 0x70 0 1 b
Error: Write failed
然后我决定 运行 i2cdetect 以确定可以看到什么,这就是我得到的输出
在Linux中:
[]# i2cdetect -y -a 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 21 -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- 64 -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
在 U-Boot 中:
[u-boot]# i2c probe
Valid chip addresses: 20 21 64 70
我在 U-Boot 中可以看到我的设备但在 Linux 中看不到我的设备的原因是什么?
我怀疑设备树可能需要修改?但是我检查了旧的 dtsi 文件,两个 Linux 版本的 i2c0 之间没有什么不同...
i2cdump 给出所有 X 的输出
[]# i2cdump -y 0 0x70
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
10: XX XX XX XX XX XX XX XX XX XX...
i2c host controller: linux-4-4-8/drivers/i2c/busses/i2c-mv64xxx.c
设备
0x20、0x21:PCA9555 IO 端口扩展器
0x70:PCA9548A i2c 多路复用器
较新的内核有一个不同的父 dtsi 文件,它为 pinctrl 定义了各种 mpp
我使用的 dts 文件包含一些已定义但我们从未使用过的以太网设备,由于我们的硬件几乎相同,因此我们使用了另一个团队的设备树。这些以太网使用了以下 mdio
mdio@72004 {
pinctrl-names = "default";
pinctrl-0 = <&mdio_pins>; //<==== This was the problem
phy0: ethernet-phy@0 {
reg = <0>;
};
};
mdio使用&mdio_pins,在较新的内核中定义为
mdio_pins: mdio-pins {
marvell,pins = "mpp4", "mpp5";
marvell,function = "ge";
};
我的设备的 gpio reset 恰好是 mpp5.
我将设备树的以太网部分更改为以下内容
ethernet@70000 {
status = "disabled";
};
mdio@72004 {
status = "disabled";
};
ethernet@30000 {
status = "disabled";
};
这解决了设备在 i2cdetect 中不显示的问题,并且硬件像以前一样工作。
假设我继承的设备树在所用硬件的定义中是具体的,这是我自己的错。