【问题标题】:How is sysfs updated when a GPIO changes state?GPIO 更改状态时如何更新 sysfs?
【发布时间】:2020-09-24 02:15:39
【问题描述】:

假设 gpio X 可以作为输入引脚在 sysfs 中导出,之后将在 /sys/class/gpio/ 中创建一个名为 gpioX 的目录。 gpioX/ 包含很少的文件,例如表示 gpio X 的当前状态(高或低)的“值”。

当施加到引脚 X 的信号改变其状态(例如从低到高)时(在内核空间中)会发生什么?

我的意思是,在转换之前 gpioX/value 包含“low”,但之后它将包含“high”值。操作系统如何更新此文件?

我认为需要中断机制。是否使用中断机制来更新sysfs?

【问题讨论】:

标签: linux-kernel interrupt gpio sysfs


【解决方案1】:

操作系统如何更新此文件?我认为需要一个中断机制。

它不需要中断机制,除非它支持轮询 (man poll) 或备用 异步 通知。至少在大多数版本中,/sys/class/gpio/ 仅在有人读取文件时才读取 GPIO 级别。

sysfsdebugfsconfigfsprocfs 等都是虚拟文件系统。当您访问该文件时,Linux 内核中的代码会运行以提供该值。 sysfs 只提供类似文件的接口;这并不意味着它以实际状态支持。状态是可以随时读取的GPIO级别。

gpio_value_show() 似乎是当前的实现。您用中断描述的内容是可能的。可以通过sysfs_set_active_low() 函数或sysfs 文件/sys/class/gpio/gpioN/edge 来完成。如果 GPIO 不支持中断,写入文件可能会返回错误。请参阅gpio.txt 了解更多信息(尤其是针对您的特定 Linux 版本)。

【讨论】:

  • 我正在尝试做类似的事情,除了我在 DragonBoard 410C 上的 Android 下使用 Kotlin。文档讲述了在设置/sys/class/gpio/gpionn/edge伪文件后,使用Linux的poll(2)系统服务来监控/sys/class/gpio/gpionn/value伪文件的事件。 how to use poll(2) or select(2) service call to watch a pseudo file for changes with Kotlin
  • 您有edge 文件吗?如果不是,则不支持 poll()。硬件必须能够在 gpio 更改时生成中断。所有硬件都允许读取当前的 gpio 值,但只有部分硬件支持中断(以及edgepoll())。如果edge 不存在,则在value 上运行poll() 将无济于事。
  • 是的,GPIO 引脚确实存在edge 伪文件。我一直试图弄清楚如何使用 Kotlin 源代码中的 poll(2) 服务调用。今晚晚些时候我发现了一些可以尝试的东西,如果它有效,那么我将为我发布的问题创建一个答案。我只是想你也许能指出我正确的方向。照顾好你的一天。
猜你喜欢
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2018-02-19
  • 1970-01-01
  • 2018-03-17
  • 2022-11-29
相关资源
最近更新 更多