GPIO_V2_GET_LINE_IOCTL

名称

GPIO_V2_GET_LINE_IOCTL - 从内核请求一个或多个线路。

概要

GPIO_V2_GET_LINE_IOCTL

int ioctl(int chip_fd, GPIO_V2_GET_LINE_IOCTL, struct gpio_v2_line_request *request)

参数

chip_fd

open() 返回的 GPIO 字符设备的文件描述符。

request

指定要请求的线路及其配置的 line_request

描述

成功后,请求进程将被授予对线路值的独占访问权,对线路配置的写入访问权,并且可以在线路上检测到边沿时接收事件,所有这些都在 线路请求 中进行了更详细的描述。

可以在一个线路请求中请求多个线路,并且内核尽可能原子地对请求的线路执行请求操作。例如,GPIO_V2_LINE_GET_VALUES_IOCTL 将一次读取所有请求的线路。

线路的状态,包括输出线路的值,保证保持在请求的状态,直到返回的文件描述符被关闭。一旦文件描述符被关闭,从用户空间的视角来看,线路的状态变得不受控制,并且可能恢复到其默认状态。

请求已在使用的线路是一个错误 (EBUSY)。

关闭 chip_fd 对现有线路请求没有影响。

配置规则

对于任何给定的请求线路,以下配置规则适用

方向标志 GPIO_V2_LINE_FLAG_INPUTGPIO_V2_LINE_FLAG_OUTPUT 不能组合。如果两者都没有设置,则唯一可以设置的另一个标志是 GPIO_V2_LINE_FLAG_ACTIVE_LOW,并且线路被请求为“原样”,以便允许读取线路值而不改变电气配置。

驱动标志 GPIO_V2_LINE_FLAG_OPEN_xxx 要求设置 GPIO_V2_LINE_FLAG_OUTPUT。只能设置一个驱动标志。如果未设置任何标志,则假定线路为推挽。

只能设置一个偏置标志 GPIO_V2_LINE_FLAG_BIAS_xxx,并且它需要同时设置一个方向标志。如果未设置任何偏置标志,则偏置配置不会更改。

边沿标志 GPIO_V2_LINE_FLAG_EDGE_xxx 要求设置 GPIO_V2_LINE_FLAG_INPUT,并且可以组合以检测上升沿和下降沿。从不支持的线路上请求边沿检测是一个错误 (ENXIO)。

只能设置一个事件时钟标志 GPIO_V2_LINE_FLAG_EVENT_CLOCK_xxx。如果未设置任何标志,则事件时钟默认为 CLOCK_MONOTONICGPIO_V2_LINE_FLAG_EVENT_CLOCK_HTE 标志需要支持的硬件和设置了 CONFIG_HTE 的内核。从不支持它的设备请求 HTE 是一个错误 (EOPNOTSUPP)。

debounce_period_us 属性只能应用于设置了 GPIO_V2_LINE_FLAG_INPUT 的线路。设置后,消抖适用于 GPIO_V2_LINE_GET_VALUES_IOCTL 返回的值和 GPIO_V2_LINE_EVENT_READ 返回的边沿。如果硬件不支持直接消抖,则内核会在软件中模拟消抖。在硬件不支持消抖或软件模拟所需的硬件中断的线路上请求消抖是一个错误 (ENXIO)。

请求无效配置是一个错误 (EINVAL)。

配置支持

如果底层硬件和驱动程序不直接支持请求的配置,则内核会应用以下方法之一

  • 拒绝请求

  • 在软件中模拟该功能

  • 将该功能视为尽力而为

应用的方法取决于是否可以在软件中合理地模拟该功能,以及如果不支持该功能对硬件和用户空间的影响。 应用于每个功能的方法如下

功能

方法

偏置

尽力而为

消抖

模拟

方向

拒绝

驱动

模拟

边沿检测

拒绝

偏置被视为尽力而为,以允许用户空间为支持内部偏置的平台应用与需要外部偏置的平台相同的配置。最坏的情况是线路浮动,而不是按预期偏置。

通过将滤波器应用于线路上的硬件中断来模拟消抖。在检测到边沿并且线路在消抖期间保持稳定后,会生成一个边沿事件。事件时间戳对应于消抖期间的结束。

通过在不应主动驱动线路时将线路切换到输入来模拟驱动。

边沿检测需要中断支持,如果不支持则拒绝。仍然可以从用户空间执行轮询模拟。

在所有情况下,GPIO_V2_GET_LINEINFO_IOCTL 报告的配置都是请求的配置,而不是生成的硬件配置。用户空间无法确定硬件是否支持该功能,是模拟的,还是尽力而为的。

返回值

成功时返回 0,并且 request.fd 包含请求的文件描述符。

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