MCP23017未调用I2C设备驱动程序探测功能

时间:2016-07-28 16:15:23

标签: linux linux-kernel raspberry-pi linux-device-driver i2c

我正在使用以下I2C / GPIO Device driver来访问MCP23017 GPIO。使用insmod命令,我可以加载驱动程序及其在/ proc / modules中列出的内容。我有两个MCP23017芯片连接到我的Raspberry Pi。两者都在地址0x200x21处检测到。驱动程序的initcall注册驱动程序。我通过打印出一条消息检查了这一点。但是不调用驱动程序探测功能。设备未打开/无法位于其他位置。

  1. 如何调用探测功能?
  2. 是否应手动完成探测以找到设备?
  3. probe来电是否与open来电相似?
  4. 我尝试了这个echo mcp23017 0x20 > new_device手动创建一个带有地址的新设备。但它没有用。我收到了以下消息:Driver 'mcp23s08' is already registered, aborting...
  5. 任何帮助都将不胜感激。

1 个答案:

答案 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个芯片

我可以看到这个问题的两个可能原因。

  1. DT overlay仅包含具有0x20地址的设备的说明,但缺少具有0x21地址的设备的说明。如果是这种情况,您应该找到DT覆盖的来源,添加其余设备的描述,编译修改后的DT覆盖,然后加载它而不是预先构建的。
  2. 可以将所有设备配置为使用0x20地址。有关详细信息,请参阅MCP23017数据手册中的1.4 Hardware Address Decoder部分。检查芯片上的A0A1A2针脚。