GPIO_V2_LINE_EVENT_READ

名称

GPIO_V2_LINE_EVENT_READ - 从请求中读取线的边沿检测事件。

概要

int read(int req_fd, void *buf, size_t count)

参数

req_fd

GPIO 字符设备的 文件描述符,由 GPIO_V2_GET_LINE_IOCTL 返回,其值在 request.fd 中。

buf

用于包含 事件 的缓冲区。

count

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

描述

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

必须使用 GPIO_V2_LINE_FLAG_EDGE_RISINGGPIO_V2_LINE_FLAG_EDGE_FALLING,或两者,为输入线启用边沿检测。当输入线检测到边沿中断时,就会生成边沿事件。

边沿是根据逻辑线值的变化来定义的,因此从非活动到活动的转换是上升沿。如果设置了 GPIO_V2_LINE_FLAG_ACTIVE_LOW,则逻辑极性与物理极性相反,此时 GPIO_V2_LINE_FLAG_EDGE_RISING 对应于一个下降的物理边沿。

内核尽可能接近其发生时捕获并时间戳边沿事件,并将其存储在缓冲区中,用户空间可以方便地使用 read() 从中读取。

从缓冲区读取的事件始终与内核检测到的顺序相同,即使单个请求正在监视多条线也是如此。

内核事件缓冲区的大小在创建线请求时固定,并且可以受 request.event_buffer_size 的影响。默认大小是请求行数的 16 倍。

如果事件突发发生的速度快于用户空间读取的速度,则缓冲区可能会溢出。如果发生溢出,则最旧的缓冲事件将被丢弃。可以通过监视事件序列号从用户空间检测到溢出。

为了最小化将事件从内核复制到用户空间所需的调用次数,read() 支持复制多个事件。复制的事件数量是内核缓冲区中可用事件数量与用户空间缓冲区 (buf) 中可容纳事件数量中的较小值。

使用 GPIO_V2_LINE_SET_CONFIG_IOCTL 更改边沿检测标志不会删除或修改已包含在内核事件缓冲区中的事件。

如果事件不可用且 req_fd 未设置为 O_NONBLOCK,则 read() 将会阻塞。

可以通过使用 poll() 或类似函数检查 req_fd 是否可读来测试事件的存在。

返回值

成功时,返回读取的字节数,该字节数将是 gpio_v2_line_event 事件大小的倍数。

错误时,返回 -1 并适当设置 errno 变量。常见错误代码在 GPIO 错误代码 中描述。