我在i2c总线上有一些设备。我使用DTS作为探测驱动程序,但我不能探测其中一个驱动程序。具有地址(0x20)的设备内核向我发送消息:
i2c i2c-0: Failed to register i2c client mcp23017 at 0x20 (-16)
设备是mcp2301,我可以检测到它
i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
20: 20 UU -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- UU -- -- -- -- -- UU -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- UU
50: -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- 如您所见,同一设备(0x21也是mcp2301)工作正常。
当我使用i2cget/i2cset时,我可以正确地控制这个设备(0x20)。我还尝试了在内核中使用i2cdebug。但没有什么有趣的-因为0x20设备的驱动程序没有探测(不进入探测函数)。
我尝试了mcp230xx驱动程序和我自己的驱动程序,两者的行为是相同的。
谢谢
更新:
Complet dts is here.My dts overlayhere。和initcall_debug here的dmesg。最后,here是我的驱动器(但我也尝试了gpio-mcp23s08.c驱动程序,但出现了相同的错误)。
内核3.10.17 CPU是arm-iMX6
发布于 2018-05-25 13:52:54
DTS包含两次相同i2c地址的驱动程序,或者第二次尝试将驱动程序手动分配给此i2c地址而不先解除绑定。在这两种情况下,dmesg中都会出现错误EBUSY (-16)。此外,如果某些内部驱动程序内核期望的服务结构丢失或不完整,则可能会将驱动程序分配给总线,但不会进行探测。在这种情况下,i2cdetect会将已经分配的驱动程序上的i2c地址显示为数字,而不是繁忙标志UU,并且不会输出任何probe消息。
发布于 2019-01-30 21:22:43
我认为您有多个具有相同地址的I2C客户端(如果我查看了正确的DTS):
您的客户端地址为0x20
adv7180@20 {
compatible = "adv,adv7180";然后再次使用地址0x20:
encoder@20 {
compatible = "bustec,bt125_exp";然后您有地址为0x18的客户端
tlv320aic3107@18 {
compatible = "ti,tlv320aic3107";和同样的地址:
1w@18 {
compatible = "dallas,ds2482";这是有道理的,因为您有errno 16
#define EBUSY 16 /* Device or resource busy */https://stackoverflow.com/questions/41469028
复制相似问题