GPIO_V2_LINE_EVENT_READ¶
名称¶
GPIO_V2_LINE_EVENT_READ - 从请求中读取线路的边沿检测事件。
概要¶
int read(int req_fd, void *buf, size_t count)
参数¶
req_fd
GPIO 字符设备的文件描述符,由
request.fd
在 GPIO_V2_GET_LINE_IOCTL 中返回。buf
用于包含
events
的缓冲区。count
buf
中可用的字节数,必须至少为gpio_v2_line_event
的大小。
描述¶
从请求中读取线路的边沿检测事件。
必须使用 GPIO_V2_LINE_FLAG_EDGE_RISING
或 GPIO_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 错误代码 中描述。