这是我在 stackoverflow 上的第一篇文章,希望这个问题是合适的。
我正在为一个虚拟 GPIO 芯片编写一个 Linux 设备驱动程序,该芯片配置了一些用于输入和输出的引脚,其中一些是物理引脚的别名,而另一些是虚拟的。对于虚拟引脚,我有一个用户空间应用程序,它打算通过芯片设备和导出引脚的后门提供另一半虚拟化。例如,芯片将 GPIO 224 配置为可中断输入,目的是阻止来自用户空间的调用,例如cat /sys/class/gpio/gpiochip224/Virtual Input/value
. 为此,我的方法是在名为“virtual”的“Virtual Input”中添加一个特殊的文件属性(例如)。对“cat”的调用将调用“gpio_chip.get”回调并在队列中等待。我的用户空间应用程序稍后将决定值何时更改,并将更新后的值写入“.../Virtual Input/virtual”,它会在内部更新值并解除等待。
我遇到的问题是将设备属性添加到导出的引脚。从命令行使用 导出引脚echo "224" > /sys/class/gpio/export
,然后调用我的“gpio_chip.request”回调。这是我发现的唯一可能以同步方式添加属性的地方。但是,查看 GPIO 类驱动程序,我看到调用“request”回调,然后调用“gpio_export”,然后调用“device_add”,将设备(即引脚)添加到系统。换句话说,设备在请求处理程序的上下文中还不存在,我无法添加该属性。
我注意到似乎没有与导出的 pin 设备(也不是芯片)相关联的总线,并且试图创建我自己的总线,以便通过gpio_export
调用接收通知device_add
但没有任何运气。
任何将我指向正确方向的想法都值得赞赏。