GPIO_LINEEVENT_DATA_READ¶
警告
此 ioctl 是 GPIO 字符设备用户空间 API (v1) 的一部分,已被 GPIO_V2_LINE_EVENT_READ 所取代。
名称¶
GPIO_LINEEVENT_DATA_READ - 从线路事件读取边沿检测事件。
概要¶
int read(int event_fd, void *buf, size_t count)
参数¶
event_fd
GPIO 字符设备的文件描述符,由 GPIO_GET_LINEEVENT_IOCTL 通过
request.fd
返回。buf
包含
events
的缓冲区。count
buf
中可用的字节数,必须至少是一个gpioevent_data
的大小。
描述¶
从线路事件读取线路的边沿检测事件。
必须使用 GPIOEVENT_REQUEST_RISING_EDGE
或 GPIOEVENT_REQUEST_FALLING_EDGE
或两者都启用输入线路的边沿检测。然后在输入线路上检测到边沿中断时生成边沿事件。
边沿是根据逻辑线路值的变化来定义的,因此从非活动到活动的转换是上升沿。如果设置了 GPIOHANDLE_REQUEST_ACTIVE_LOW
,则逻辑极性与物理极性相反,GPIOEVENT_REQUEST_RISING_EDGE
则对应于下降的物理边沿。
内核尽可能接近事件发生的时间捕获并加盖时间戳,并将它们存储在缓冲区中,用户空间可以在其方便时使用 read() 从中读取。
event.timestamp
的时钟源是 CLOCK_MONOTONIC
,除非是 Linux 5.7 之前的内核,那时是 CLOCK_REALTIME
。gpioevent_data
中没有指示使用哪个时钟源,必须从内核版本或时间戳本身的健全性检查中确定。
从缓冲区读取的事件始终按照内核检测到的顺序排列。
内核事件缓冲区的大小固定为 16 个事件。
如果事件爆发的速度快于用户空间读取的速度,则缓冲区可能会溢出。如果发生溢出,则会丢弃最近的事件。无法从用户空间检测到溢出。
为了最大限度地减少将事件从内核复制到用户空间所需的调用次数,read() 支持复制多个事件。复制的事件数是内核缓冲区中可用的数量和用户空间缓冲区 (buf
) 中可以容纳的数量的最小值。
如果没有可用的事件,并且 event_fd
未设置为 O_NONBLOCK,则 read() 将阻塞。
可以使用 poll() 或等效项检查 event_fd
是否可读,以此来测试是否存在事件。
返回值¶
成功时,读取的字节数,这将是 gpio_lineevent_data
事件大小的倍数。
如果出错,则返回 -1 并且会适当地设置 errno
变量。常见的错误代码在 GPIO 错误代码 中描述。