gpt4 book ai didi

linux - 未调用 MCP23017 I2C 设备驱动程序探测函数

转载 作者:太空狗 更新时间:2023-10-29 12:42:14 27 4
gpt4 key购买 nike

我正在使用以下 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您在评论中指出的似乎是正确的。阅读有关在 Raspberry Pi 生态系统中加载覆盖的更多信息 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 地址。请参阅 1.4 节
    MCP23017 中的硬件地址解码器
    数据表的详细信息。检查芯片上的 A0A1A2 引脚。

关于linux - 未调用 MCP23017 I2C 设备驱动程序探测函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38641710/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com