问题标签 [libgpiod]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 如何在 Linux 中以编程方式使用 GPIO Expander 驱动程序?
我正在尝试配置我的 Yocto Linux 发行版以设置两个板载 I2C GPIO 扩展器并记录如何以编程方式访问它们(即从 C 用户应用程序)。GPIO 扩展器都是 NXP PCA9557,由gpio-pca953x.c内核驱动程序支持。
我了解如何将此驱动程序编译到内核中(使用CONFIG_GPIO_PCA953X
配置选项)并加载它(使用modprobe
)。我也明白我可以在设备树中实例化这两个 I2C 设备(这是一个嵌入式设备,所以 GPIO 扩展器是静态的且不变的):
我缺少的信息是如何将 gpio-pca953x 驱动程序与这些实例化设备一起使用?我是否需要将这些设备与该特定驱动程序相关联?在用 C 编写的用户应用程序中,我使用哪些 API 来访问它们?一旦我正确配置它们,它们是否就像普通的 GPIO 一样?
我非常乐意阅读有关如何执行此操作的任何相关文档,无论是否冗长。我只是 Linux 设备驱动程序的初学者,不知道从哪里开始,尽管进行了大量的谷歌搜索。
gpio - 将 Raspberry 硬件 GPIO 引脚映射到 gpiod 芯片行号
周末我在玩我的树莓派。我使用了Freenove 的教程来实现一些简单的电路,这些电路由树莓上的 GPIO 引脚控制。
Freenove 教程使用了一个已弃用的名为 WiringPi 的库。除了它已被弃用的事实之外,我的理解是 WiringPi 添加了额外的抽象和简化,以允许用户专注于他们的电路,而不是编写样板代码来集成低级 (C) 库。
现在我想更好地了解用户空间应用程序如何与硬件 GPIO 引脚接口,并且我不担心编写样板代码。所以我开始使用libgpiod,它有一个 C API,可用于读取和设置 GPIO 引脚并且效果很好。
我不清楚的一件事是如何将 40pin 连接器(编号从 1 到 40)上的物理硬件 GPIO 引脚映射到我使用gpioinfo
命令时 gpiod 报告的 54 个内部行号之一。
在我的带有 Raspbian 10 的 Raspberry 3b+ 上,该gpioinfo
命令打印以下内容,所有行名显示为unnamed
. 列表像这样继续,但我将其截断为 10 行。
我发现了一个关于缺少 GPIO 行名称的问题,它讨论了这个问题,但我不明白答案或它为什么被关闭。
我应该如何根据引脚名称查找芯片的行号,例如GPIO17
?我通过反复试验发现GPIO17
映射到线17
,但例如CE0
映射到线8
和SCL1
映射到线3
,这是我通过反复试验了解到的gpioset
。
我不确定将这个映射硬编码到我的应用程序中是否是一个好主意,或者我是否应该以某种方式以编程方式发现这些值以使程序更具可移植性?
我尝试使用gpiod_ctxless_find_line
:
但即使返回0
(OK) 的值,结果偏移量66796
也不是正确的值。我认为它不会返回任何东西,因为gpioinfo
这些行没有名称。
如果我使用 编写 C 程序libgpiod
,我可以(应该?)在运行时发现这些映射,还是可以简单地对它们进行硬编码?是否有可能在未来的 Raspberry 上SCL1
不会位于物理引脚 5 或映射到第 3 行?
libgpiod - 在 Linux 中使用 libgpiod 获取 gpio 输出的值
我在嵌入式定制板上使用 Linux(内核 5.8.17),并有一个脚本使用 libgpiod 包执行一些 gpioget 和 gpioset 操作。使用 gpioset 设置输出引脚效果很好,使用 gpioget 获取输入引脚的值也是如此。但是当我需要知道输出引脚的当前值时,使用 gpioget 会更改引脚值和方向。
这是一个例子:
将引脚设置为“1”有效。但随后使用 gpioget 检查同一引脚的当前值,该值变为“0”,方向变为输入。甚至可以使用 libgpiod 获取 gpio 输出的值吗?
linux-kernel - 没有边缘 sysfs 的 gpio 引脚的用户空间中断
在我的平台中,有一个 PCA9555 CMOS 设备,它有 16 个 GPIO 引脚和一个用于中断的单独 INT 引脚。这么久了,我的应用程序会定期读取特定的 gpio pin。我需要将其更改为中断驱动的方式。根据规范: 它有一个开漏中断引脚,当 16 个端口引脚之一改变状态并且该引脚被配置为输入时,该引脚被激活。配置为输出的引脚不会引起中断。
16 个引脚本身都没有中断支持,我edge
在 /sys/class/gpio/gpio/[pin_no] 中看不到 sysfs。所以文件poll()
上value
没有阻塞。我从规范中推断,如果任何输入引脚的状态发生变化,都会向 CPU 触发中断。如何在用户空间中捕获此中断?
我看到gpiolib-cdev.c
关于线事件。
static irqreturn_t lineevent_irq_handler(int irq, void *p)
我可以使用/dev/gpiochip<n>
字符设备和poll()
中断吗?还是仅支持支持中断的 gpio 引脚?
linux - Sysfs 无法识别任何 GPIO 芯片 - Ubuntu 18.04
我正在尝试将带有 Ubuntu 18.04 的嵌入式 Mini PC 的 GPIO 设置为输入或输出,以处理多个子项目。我的电脑是Supermicro SYS E100-9W-E,它通过 DB9 提供 1 个 8 位 GPIO。系统的内核版本是 5.4.0-74-generic。现在我已经阅读了很多关于 sysfs 和字符设备的内容,并且在过去,我有过使用 Raspberry Pi 的 GPIO 的经验。在我的系统中,我找不到任何 gpiochip:
此外,chardev 接口(例如 /dev/gpiochip0)没有任何内容,/sys/kernel/debug/gpio 没有任何内容。libgpiod
也检测不到任何芯片。此外,在 BIOS 菜单中没有什么可配置的,例如将 I/O 引脚预设为输入或输出。以下引用是我在 MOBO/PC 手册中唯一能找到的内容:
通用 I/O 接头:JGP1(通用输入/输出)接头是通过 SMBus 在引脚接头上的通用 I/O 扩展器。每个引脚都可以配置为输入引脚或输出引脚。GPIO 通过 PCH SMBus 的 PCA9554APW 8 位 GPIO 扩展来控制。基地址为 0xF040。对于 WRITE 和 READ,扩展器从地址为 0x4C。请参阅下表了解引脚定义。
引脚 - 定义
- 1 - P3V3SB
- 2 - 接地
- 3 - GP_P3V3_GP0
- 4 - GP_P3V3_GP4
- 5 - GP_P3V3_GP1
- 6 - GP_P3V3_GP5
- 7 - GP_P3V3_GP2
- 8 - GP_P3V3_GP6
- 9 - GP_P3V3_GP3
- 10 - GP_P3V3_GP7
我还尝试在 /sys/class/gpio 的导出文件中回显几个数字,但什么也没发生。
您对我应该遵循的内核配置或驱动程序有什么建议吗?
go - Golang 中是否有 ioctl 等价物有助于控制 GPIO
我正在为 golang 中的 raspberryPi 编写一个类似 Arduino 的库。与 GPIO linux 内核 ABI 接口有两种主要方法,一种使用/sys/class/gpio/*
(不推荐)或/dev/gpiochip[0-9]*
. 我想使用后者,因为前者已被弃用。
我查看了一个名为 libgpiod 的库。代码很容易理解,但它的使用ioctl
使得移植到 Golang 变得困难(尤其是因为我是初学者)。
我希望能够移植这条线:
c - gpiod 库事件和同一 gpio 行的输入请求不起作用
我在两个不同的应用程序中尝试了 gpiod_line_request_rising_edge_events() 和 gpiod_line_request_input() 调用相同的 gpio 线,但它返回 -1。
我使用了下面的代码,如果我先调用 Application-1,那么 gpiod_line_request_rising_edge_events 会以 -1 失败。如果我先调用 Application-2,则 gpiod_line_request_inputgets 以 -1 失败。
//应用程序-1
//Application-2
我们是否可以选择使其工作或使用 libgpiod 库的任何其他替代解决方案。
谢谢。
openwrt - 从openwrt中的c访问洋葱Omega2 wifi led
我一直在尝试使用板载 wifi 琥珀色 LED 来显示我的程序的状态。在版本 15.x 上,可以使用 mraa 库来执行此操作。最新的 mraa 库似乎太难使用,而且似乎仍在使用已弃用的 sysfs 方法。现在 libgpiod 似乎是 21.x 版本和首选字符设备方法的替代品。我曾尝试同时使用 sysfs 和 libgpiod 来访问驻留在 gpiochip1 第 12 行上的这个设备,但我的资源很忙——假设内核正在占用它。我不想仅仅为了做到这一点而求助于创建自定义内核。希望有经验的人处理这个问题。提前致谢。
c - 为 libgpiod 模拟 gpios
我有一个现有的 C++ 代码,它定期从/sys/class/gpio
. 由于这是折旧的,我想更改它并使用libgpiod
.
我有独立于实际硬件运行的组件测试。它在我没有这些的开发机器上运行gpios
。我的代码读取具有不同路径的环境变量,然后使用那里的文件而不是/sys/class/gpio
. 我在那里创建了简单的文本文件。我现在可以更改这些文件以操纵我的代码读取的内容并测试其行为。
是否有类似的可能性libgpiod
?
c++ - 符号查找错误:未定义符号:gpiod_line_set_direction_input
我正在尝试用 Eclipse 编译 libgpiod 教程。该程序编译正常,但是当我运行它时,出现以下错误:
gcc 编译器和链接器参数如下:
运行时错误:
libgpiod 的其他功能运行良好,例如:gpiod_chip_open、gpiod_chip_get_line 我也尝试在目标操作系统中编译相同的代码,这是成功的,但是当我运行代码时,我遇到了相同的错误输出。
library(libgpiod.so) 和 gpiod.h 也有函数的原型和符号被导出:
你有什么建议来解决这个问题?
谢谢你。