在 Beaglebone Black 上配置 GPIO 的不同方法有哪些 pluses/minuses?

What are the pluses/minuses of different ways to configure GPIOs on the Beaglebone Black?

我正在使用 Beaglebone Black 创建一个新应用程序。我需要为不同的功能配置 GPIO。我会有一些 GPIO,一些 PWM,可能还有一些其他功能。

我注意到有不同的方法可以做到这一点。这些按优先顺序排列:

我最需要的是可复制性。我不需要高性能。我只需要能够以相同的方式设置一堆 Beaglebone Black,并让它们可靠地运行。

做设备树覆盖和所有这些有什么我没有看到的优势吗?什么时候有人会选择一种方法而不是另一种方法?

引脚多路复用器通过 AM335x 处理器的控制模块子系统中的寄存器进行配置。当 运行 GNU/Linux 时,控制模块寄存器只能从内核 space 访问,因此必须由内核驱动程序完成。

在 BeagleBone 上,有一个名为 bone-pinmux-helper 的驱动程序,它允许用户在不同的 pinmux 配置之间进行运行时更改space。这些配置需要预先设置并通过设备树覆盖传递给驱动程序。例如,在 PyBBIO I have a script which generates overlays for each of the GPIO pins. They setup the different possible modes (in, out, pullup, pulldown, etc.), then pass those all to the bone-pinmux-helper driver as different modes. Then when the pinMode() functino is called, PyBBIO uses the capemgr 驱动程序中加载为引脚生成的覆盖层,然后使用它为该引脚创建的 sysfs 条目将其设置为请求的模式。

Bonescript 使用与 PyBBIO 相同的方法,IIRC Adafruit_BBIO 没有用于 pinmuxing 的覆盖,需要用户单独进行。

所以,长话短说,设备树覆盖是进行 pinmuxing 的唯一方法,而 PyBBIO 和 bonescript 等用户space 库只是将其抽象化。如果您想拥有完全控制权,请编写和编译您自己的叠加层。如果您不想处理编写 DT 覆盖或担心兼容性,因为事情可能会随着时间的推移而改变,请使用像 PyBBIO 或 Bonescript 这样的库,它们抽象出该级别并相信它们会确保一切正常。