Linux kernel 当GPIO改变状态时,如何更新sysfs?

Linux kernel 当GPIO改变状态时,如何更新sysfs?,linux-kernel,interrupt,gpio,sysfs,Linux Kernel,Interrupt,Gpio,Sysfs,假设gpioX可以作为输入pin导出到sysfs中,然后将名为gpioX的目录创建到/sys/class/gpio/。gpioX/包含的文件很少,例如表示gpioX当前状态(高或低)的“值” 当应用于管脚X的信号改变其状态(例如从低到高)时(在内核空间),会发生什么情况 我的意思是,在转换之前,gpioX/值包含“低”,但在转换之后,它将包含“高”值。操作系统如何更新此文件 我认为需要一个中断机制。它是否使用中断机制来更新sysfs 操作系统如何更新此文件?我认为需要一个中断机制 它不需要中断机

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

当应用于管脚X的信号改变其状态(例如从低到高)时(在内核空间),会发生什么情况

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

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

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

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

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


似乎是当前的实现。你所描述的中断是可能的。可以通过
sysfs\u set\u active\u low()函数或sysfs文件/sys/class/gpio/gpioN/edge来完成。如果GPIO不支持中断,写入文件可能会返回错误。有关更多信息,请参阅(特别是针对特定版本的Linux)。

指向gpio.txt的链接不再有效。你的意思是?是的,OP七年前的问题是指sysfs gpio(文档已经移动;thx)。关于它是一个虚拟文件系统的文字仍然是相关的,特别是关于是否需要中断的原始问题。我正在尝试做一些类似的事情,除了我在DragonBoard 410C上使用Android下的Kotlin。本文档介绍了在设置
/sys/class/gpio/gpionn/value
伪文件后,使用Linux的
轮询(2)
系统服务监视事件的
/sys/class/gpio/gpionn/value
伪文件。你有
edge
文件吗?如果不是,则不支持
poll()
。硬件必须能够在gpio更改时生成中断。所有硬件都允许读取当前gpio值,但只有部分硬件支持中断(以及
edge
poll()
)。如果
edge
不存在,则在
value
上运行
poll()
将不起任何作用。是的,GPIO引脚的
edge
伪文件确实存在。我一直在想如何使用Kotlin源代码中的
poll(2)
服务调用。今晚晚些时候我发现了一些可以尝试的东西,如果它有效的话,我将为我发布的问题创建一个答案。我只是想你能给我指出正确的方向。在回答这个问题时,我整理了一些关于sysfs和伪文件的笔记。它并没有完全回答您的问题,但是对于底层的sysfs功能,有些人可能会觉得有些帮助。