我正在使用以下 I2C/GPIO设备驱动 https://github.com/torvalds/linux/blob/master/drivers/gpio/gpio-mcp23s08.c访问 MCP23017 GPIO。使用 insmod 命令,我可以加载驱动程序及其在 /proc/modules 中列出的内容。我有两个 MCP23017 芯片连接到我的 Raspberry Pi。两者均在地址处检测到0x20
and 0x21
。对驱动程序的 initcall 注册驱动程序。我通过打印一条消息来检查这一点。但是驱动程序的探测函数没有被调用。设备未打开/无法位于其他地方。
- 探针函数是如何调用的?
- 是否应该手动进行探测来定位设备?
- Is the
probe
调用类似于open
call?
- 我试过这个
echo mcp23017 0x20 > new_device
使用该地址手动创建一个新设备。但这没有用。我收到以下消息:Driver 'mcp23s08' is already registered, aborting...
任何帮助,将不胜感激。
probe()
当驱动程序与设备树中的设备描述匹配时调用该函数。匹配发生在兼容的 http://elinux.org/Device_Tree_Usage#Understanding_the_compatible_Property在设备树中找到您的驱动程序的字段(对于您的驱动程序来说,它是"microchip,mcp23017"
细绳)。
显然您没有在设备树中描述您的设备(MCP23017),这就是为什么probe()
不被调用。您可以加载相应的设备树覆盖来解决此问题。这one http://mirrors.neusoft.edu.cn/rpi-firmware/boot/overlays/mcp23017.dtbo你在评论中指出的似乎是正确的。阅读有关在 Raspberry Pi 生态系统中加载覆盖层的更多信息here https://www.raspberrypi.org/documentation/configuration/device-tree.md.
您可以尝试按照该文章中所述加载叠加层:
$ sudo dtoverlay mcp23017.dtbo
或者你可以尝试使用Capemgr http://elinux.org/Capemgr以此目的。就我个人而言,我没有尝试过其中任何一个,所以你应该看看哪一个最适合你。
Update
在评论中回复您的问题。
但是当我尝试i2cdetect
命令显示UU。
See 人 i2c 检测 http://linux.die.net/man/8/i2cdetect。所以“UU”的意思是i2cdetect
跳过探测,因为您指定的地址处的设备已被驱动程序使用。我猜这就是你的意图,所以没关系。
With a rmmod mcp23017
命令我看到设备仍在设备下,但是i2cdetect
shows 0x20
所以你卸载了驱动程序,现在i2cdetect
显示有某个设备正在运行0x20
地址。我想这是正确的行为。另外,如果您想完全摆脱您的设备,请尝试卸载 DT 覆盖以及驱动程序。
我还连接了两个MCP23017芯片。但我只能看到该设备0x20
在设备下。 I2C芯片位于0x21
仍然没有检测到,尽管驱动程序说它支持最多 8 个芯片
我可以看到这个问题的两个可能原因。
- DT 覆盖仅具有设备描述
0x20
地址,但缺少设备的描述0x21
地址。如果是这种情况,您应该找到 DT 覆盖的源,添加其余设备的描述,编译修改后的 DT 覆盖,然后加载它而不是预构建的。
- 所有设备都可以配置为使用
0x20
地址。参见部分1.4
Hardware Address Decoder
in MCP23017 https://cdn-shop.adafruit.com/datasheets/mcp23017.pdf数据表了解详细信息。查看A0
, A1
, A2
芯片上的引脚。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)