我正在使用以下I2C / GPIO Device driver来访问MCP23017 GPIO。使用insmod命令,我可以加载驱动程序及其在/ proc / modules中列出的内容。我有两个MCP23017芯片连接到我的Raspberry Pi。两者都在地址0x20
和0x21
处检测到。驱动程序的initcall注册驱动程序。我通过打印出一条消息检查了这一点。但是不调用驱动程序探测功能。设备未打开/无法位于其他位置。
probe
来电是否与open
来电相似?echo mcp23017 0x20 > new_device
手动创建一个带有地址的新设备。但它没有用。我收到了以下消息:Driver 'mcp23s08' is already registered, aborting...
任何帮助都将不胜感激。
答案 0 :(得分:0)
probe()
函数。匹配在设备树中找到驱动程序的compatible字段时发生(对于您的驱动程序,它是"microchip,mcp23017"
字符串)。
显然,您没有设备树中描述的设备(MCP23017),这就是为什么不调用probe()
的原因。您可以加载相应的设备树叠加来克服此问题。您在评论中指出的one似乎是正确的。阅读有关在Raspberry Pi生态系统here中加载叠加层的更多信息。
您可以尝试按照该文章中的描述加载叠加层:
$ sudo dtoverlay mcp23017.dtbo
或者您可以尝试使用Capemgr来实现此目的。就个人而言,我没有尝试过任何一种,所以你应该看看哪种方式最适合你。
在评论中回答您的问题。
但是当我尝试
i2cdetect
命令时,它会显示UU。
见man i2cdetect。因此“UU”表示i2cdetect
跳过了探测,因为您指定的地址处的设备已被驱动程序使用。我想这就是你想要的,所以没关系。
使用
rmmod mcp23017
命令,我看到该设备仍在设备下,但i2cdetect
显示0x20
因此,您卸载了驱动程序,现在i2cdetect
向您显示0x20
地址上有一些设备。我想这是正确的行为。此外,如果您想完全摆脱您的设备 - 尝试卸载DT overlay以及驱动程序。
我也连接了两个MCP23017芯片。但我只能看到设备下
0x20
处的设备。0x21
的I2C芯片仍未被检测到,但驱动程序表示它支持多达8个芯片
我可以看到这个问题的两个可能原因。
0x20
地址的设备的说明,但缺少具有0x21
地址的设备的说明。如果是这种情况,您应该找到DT覆盖的来源,添加其余设备的描述,编译修改后的DT覆盖,然后加载它而不是预先构建的。0x20
地址。有关详细信息,请参阅MCP23017数据手册中的1.4
Hardware Address Decoder
部分。检查芯片上的A0
,A1
,A2
针脚。