【问题标题】:MCP23017 I2C Device driver probe function is not calledMCP23017 I2C 设备驱动程序探测函数未被调用
【发布时间】:2016-07-28 16:15:22
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

  • 我怎样才能找到你的板子使用的设备树文件?
  • 我对 Linux 还是很陌生。你想让我在这里发布设备树文件吗?抱歉,我没听懂你的问题。
  • 您的设备 (MCP23017) 必须在设备树中进行描述。因此,您的主板的设备树文件应该有这个描述,或者您应该为您的设备创建自己的设备树覆盖并将其与驱动程序一起加载。如果设备树中没有正确的设备描述,您的驱动程序probe() 函数将不会被调用,因为该函数仅在驱动程序与设备树描述匹配时才会调用。所以我要求您提供设备树文件的链接(您正在用于您的主板)或为您的设备提供您的设备树覆盖(您在驱动程序之前加载)。
  • 感谢您的解释。我找到了mcp23017.dtbo 文件,我认为它是设备的设备树覆盖。如果这是正确的设备覆盖,我如何将其加载到驱动程序?
  • 这是overlay file的链接

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


【解决方案1】:

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

显然您没有在设备树中描述您的设备 (MCP23017),这就是不调用 probe() 的原因。您可以加载相应的设备树覆盖来解决此问题。您在评论中指出的one 似乎是正确的。阅读更多关于在 Raspberry Pi 生态系统中加载叠加层的信息here

您可以尝试按照该文章中的说明加载叠加层:

$ sudo dtoverlay mcp23017.dtbo

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

更新

在 cmets 中回答您的问题。

但是当我尝试i2cdetect 命令时,它会显示 UU。

man i2cdetect。所以“UU”表示i2cdetect 跳过了探测,因为您指定地址的设备已被驱动程序使用。我猜是你想要的,所以没关系。

使用rmmod mcp23017 命令,我看到设备仍在设备下,但i2cdetect 显示0x20

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

我还连接了两个 MCP23017 芯片。但我只能在设备下看到0x20 的设备。 0x21 的 I2C 芯片仍然没有被检测到,尽管驱动程序说它最多支持 8 个芯片

我可以看到导致此问题的两个可能原因。

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

【讨论】:

  • 谢谢。探测功能有效。检测到 mcp23017,我可以在 /sys/bus/i2c/devices 下找到它作为 1-0020,它的名称为 mcp23017。但是当我尝试i2cdetect 命令时,它会显示UU。使用rmmod mcp23017 命令,我看到设备仍在设备下,但 i2cdetect 显示0x20。知道这里有什么问题吗?我还连接了两个 MCP23017 芯片。但是我只能在设备下看到 0x20 的设备。仍然没有检测到 0x21 处的 I2C 芯片,但驱动程序说它最多支持 8 个芯片
  • 首先,想知道您用来加载 DT 覆盖和驱动程序的程序是什么?至于您的问题,我稍后会尝试解决。
  • 我按照你提到的文章(和命令)来加载 DT 覆盖。和insmod 加载驱动程序。
  • 我在回答中的更新部分回答了您的问题。
  • 非常感谢。我修改了叠加层,它可以工作。现在我正在尝试使用 GPIO 引脚和中断。但是,在加载驱动程序和覆盖(即显示 UU 时)后,我无法使用 i2cgeti2cset 命令设置 gpio 引脚。我收到了Error: Could not set address to 0x20: Device or resource busy
猜你喜欢
  • 2021-05-27
  • 2011-11-04
  • 1970-01-01
  • 2012-02-28
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 2016-05-28
相关资源
最近更新 更多