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

MCP23017 I2C Device driver probe function is not called

我正在使用以下 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...

如有任何帮助,我们将不胜感激。

probe() 当驱动程序与设备树中的设备描述相匹配时调用函数。当在设备树中找到您的驱动程序的 compatible 字段(对于您的驱动程序,它是 "microchip,mcp23017" 字符串)时,就会发生匹配。

显然您没有设备树中描述的设备 (MCP23017),这就是未调用 probe() 的原因。您可以加载相应的 Device Tree Overlay 来解决此问题。 one you pointed out in your comment seems to be correct. Read more about loading overlays in Raspberry Pi ecosystem here.

您可以尝试按照那篇文章中的描述加载叠加层:

$ sudo dtoverlay mcp23017.dtbo

或者您可以尝试使用 Capemgr 来达到这个目的。就我个人而言,我没有尝试过任何一种,所以你应该看看哪种最适合你。

更新

正在评论中回复您的问题。

But when I try the i2cdetect command it shows UU.

参见 man i2cdetect。所以 "UU" 意味着 i2cdetect 跳过了探测,因为你指定地址的设备已经被驱动程序使用。我猜这是你想要的,所以没关系。

With a rmmod mcp23017 command I see the device still under devices but i2cdetect shows 0x20

所以您卸载了驱动程序,现在 i2cdetect 显示 0x20 地址上有一些设备。我想这是正确的行为。另外,如果你想完全摆脱你的设备——尝试卸载 DT 覆盖和驱动程序。

Also I have connected two MCP23017 chips. But I can see only the device at 0x20 under devices. The I2C chip at 0x21 is still not detected, though the driver says it supports up to 8 chips

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

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