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错误代码中描述。