在 Linux 中使用 GPIO 线¶
Linux 内核的存在是为了抽象和向用户呈现硬件。因此,GPIO 线通常不是面向用户的抽象。使用 GPIO 线最明显、自然和首选的方法是让内核硬件驱动程序来处理它们。
有关现有通用驱动程序的示例,这些驱动程序也将成为您想要编写的任何其他内核驱动程序的好示例,请参阅使用 GPIO 的子系统驱动程序
对于您想要支持的任何类型的批量生产系统,例如服务器、笔记本电脑、手机、平板电脑、路由器以及任何消费品或办公或商业产品,使用适当的内核驱动程序至关重要。当您觉得您的代码足够成熟时,请提交代码以包含在上游 Linux 内核中,您将获得帮助来改进它,请参阅提交补丁:将您的代码放入内核的必要指南。
在 Linux 中,GPIO 线也有用户空间 ABI。
用户空间 ABI 适用于一次性部署。示例包括原型、工厂生产线、创客社区项目、车间样本、生产工具、工业自动化、PLC 型用例、门控制器,简而言之,就是一种不按数字生产的专用设备,需要操作员对设备有深入的了解,并且知道要设置的软硬件接口。它们不应自然地适合任何现有的内核子系统,并且由于不够可重用或不够抽象,或者涉及大量与非计算机硬件相关的策略,因此不适合操作系统。
有充分理由从用户空间使用工业 I/O (IIO) 子系统的应用程序也可能非常适合从用户空间使用 GPIO 线。
在任何产品开发项目中,绝不要在任何情况下滥用 GPIO 用户空间 ABI 来偷工减料。如果您将其用于原型设计,则不要将原型产品化:使用适当的内核驱动程序重写它。绝不要在任何情况下使用来自用户空间的 GPIO 部署任何统一的产品。
用户空间 ABI 是每个 GPIO 硬件单元(GPIO 芯片)的字符设备。这些设备将在系统上显示为 /dev/gpiochip0
到 /dev/gpiochipN
。有关如何直接使用用户空间 ABI 的示例,可以在内核树的 tools/gpio
子目录中找到。
对于结构化和托管的应用程序,我们建议您使用 libgpiod 库。这为同一 GPIO 芯片上的多个并发使用者提供了辅助抽象、命令行实用程序和仲裁。