周末我在玩我的树莓派。我使用了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 行。
gpiochip0 - 54 lines:
line 0: unnamed unused output active-high
line 1: unnamed unused output active-high
line 2: unnamed unused output active-high
line 3: unnamed unused output active-high
line 4: unnamed unused output active-high
line 5: unnamed unused output active-high
line 6: unnamed unused output active-high
line 7: unnamed unused output active-high
line 8: unnamed unused output active-high
line 9: unnamed unused input active-high
line 10: unnamed unused input active-high
[...]
我发现了一个关于缺少 GPIO 行名称的问题,它讨论了这个问题,但我不明白答案或它为什么被关闭。
我应该如何根据引脚名称查找芯片的行号,例如GPIO17
?我通过反复试验发现GPIO17
映射到线17
,但例如CE0
映射到线8
和SCL1
映射到线3
,这是我通过反复试验了解到的gpioset
。
我不确定将这个映射硬编码到我的应用程序中是否是一个好主意,或者我是否应该以某种方式以编程方式发现这些值以使程序更具可移植性?
我尝试使用gpiod_ctxless_find_line
:
gpiod_ctxless_find_line ("SCL1", configuration->chipname, configuration->chipname_length, &offset);
但即使返回0
(OK) 的值,结果偏移量66796
也不是正确的值。我认为它不会返回任何东西,因为gpioinfo
这些行没有名称。
如果我使用 编写 C 程序libgpiod
,我可以(应该?)在运行时发现这些映射,还是可以简单地对它们进行硬编码?是否有可能在未来的 Raspberry 上SCL1
不会位于物理引脚 5 或映射到第 3 行?