1

我在嵌入式定制板上使用 Linux(内核 5.8.17),并有一个脚本使用 libgpiod 包执行一些 gpioget 和 gpioset 操作。使用 gpioset 设置输出引脚效果很好,使用 gpioget 获取输入引脚的值也是如此。但是当我需要知道输出引脚的当前值时,使用 gpioget 会更改引脚值和方向。

这是一个例子:

~# gpioinfo |grep MB_AC_ON
        line 230:   "MB_AC_ON"       unused  output  active-high
~# gpioset $(gpiofind "MB_AC_ON")=1
~# gpioget $(gpiofind "MB_AC_ON")
   0
~# gpioinfo |grep MB_AC_ON
        line 230:   "MB_AC_ON"       unused   input  active-high

将引脚设置为“1”有效。但随后使用 gpioget 检查同一引脚的当前值,该值变为“0”,方向变为输入。甚至可以使用 libgpiod 获取 gpio 输出的值吗?

4

1 回答 1

0

当我检查详细信息时,gpioset -h 有一条注释:我认为这是您问题的答案。

注意:当最后一个引用代表设备文件的文件描述符的进程退出时,由字符设备控制的 GPIO 线的状态恢复为默认值。这意味着运行 gpioset 是错误的,让它退出并期望线路继续被驱动为高或低。如果给定的引脚悬空,则可能会发生这种情况,但必须将其解释为未定义的行为。

另外,如果我们更详细地查看代码(gpioset: ../libgpiod/tools/gpioset.c)。我们可以看到下面的这些代码块,这导致该行获得默认值(您不能保留您使用 gpioset 设置的值)。

    gpiod_line_release_bulk(lines);
    gpiod_chip_unref(chip);
    gpiod_line_bulk_free(lines);
    free(offsets);
    free(values);
于 2022-01-05T03:57:12.573 回答