Linux chardev gpio:有没有办法在设置线路配置时保留当前gpio输出值?

问题描述 投票:0回答:2

(我直接使用新的 V2 系统调用,而不是使用已弃用的 V1 调用的

libgpiod
)。

我使用 ioctl

GPIO_V2_GET_LINE_IOCTL
获取了设备 fd,并在
req.config
结构中定义了一条 GPIO 线作为输出线。

一旦我调用 ioctl

GPIO_V2_LINE_SET_CONFIG_IOCTL
,输出线的输出就会变为零 - 我希望它保留之前的值 1。

我可以立即在 set config 调用之后使用

GPIO_V2_LINE_SET_VALUES_IOCTL
ioctl 调用来显式设置该值,但这似乎很蹩脚,并且我认为会导致线路上出现短暂的闪点。

有没有办法在不改变线路状态的情况下配置 GPIO 输出(我致力于 chardev GPIO 模型)?

我想我可以做一些黑客的事情,将输出驱动配置为带有偏置上拉的开源驱动,但这非常丑陋,并且可能不安全,具体取决于 GPIO 驱动的内容(我不会这样做它)。

c linux gpio ioctl libgpiod
2个回答
0
投票

评论(尤其是我的)没有帮助。这是我的想法,以及对我有用的方法。

问题的出现是由于对 GPIO 线路输出值的设置方式感到困惑。有两种不同的机制,用于两种不同的情况,并且(恕我直言)文档还很不清楚。

要在配置时设置输出值(即将线路配置为输出时),必须使用 request->config.attrs (request 是 gpio_v2_line_request 结构体指针)。像这样的东西:

struct gpio_v2_line_config *config = &(request->config);
int attr_idx = <get index of slot for output values in config.attrs>;
int line_idx = <get index of line in request->offsets>

config->attrs[attr_idx].attr_id = GPIO_V2_LINE_ATTR_ID_OUTPUT_VALUES;
setbit(config->attrs[attr_idx].mask, line_idx);
if (output_value == 1) {
    setbit(config->attrs[attr_idx].mask, line_idx);
}
else {
    clearbit(config->attrs[attr_idx].mask, line_idx);
}

然后您可以使用 GPIO_V2_LINE_SET_CONFIG_IOCTL ioctl 调用将您的配置发送到 GPIO 线路。

配置线路后,将使用 gpio_v2_line_values 结构更改其输出值。像这样:

struct gpio_v2_line_values values = {0, 0};
int line_idx = <get index of line in request->offsets>

setbit(values.mask, line_idx);
if (output_value == 1) {
    setbit(values.bits, line_idx);
}

使用 GPIO_V2_LINE_SET_VALUES_IOCTL ioctl 调用来设置值结构中的输出线。


0
投票

如果您的意思是可以显式请求一行作为输出,但不指定应设置的值,那么这是不可能的。您必须指定该值。如果您没有显式指定值,则假定默认值 0。这适用于 GPIO_V2_GET_LINE_IOCTL 和 GPIO_V2_LINE_SET_CONFIG_IOCTL,两者都需要指定线路的完整状态,包括线路为输出时的值。

但是,根据您的设备驱动程序和硬件,您可以使用 GPIO_V2_GET_LINE_IOCTL 请求已“按原样”配置为输出的线路,而不设置 GPIO_V2_LINE_FLAG_INPUT 或 GPIO_V2_LINE_FLAG_OUTPUT,然后使用 GPIO_V2_LINE_GET_VALUES_IOCTL 读取当前值。这种情况下的行为没有明确定义,一些驱动程序将返回输出缓冲区值,其他驱动程序将返回输入缓冲区值,如果线路配置为输出时它们可能断开电气连接,则这些值可能会有所不同。 YMMV.

© www.soinside.com 2019 - 2024. All rights reserved.