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_IOCTLrequest.fd 中返回。

buf

用于包含 events 的缓冲区。

count

buf 中可用的字节数,必须至少是一个 gpioevent_data 的大小。

描述

从行事件中读取线的边沿检测事件。

必须使用 GPIOEVENT_REQUEST_RISING_EDGEGPIOEVENT_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 错误代码 中描述。