在 Linux 中使用 GPIO 线

Linux 内核的存在是为了抽象化硬件并将其呈现给用户。 GPIO 线通常不是面向用户的抽象。使用 GPIO 线最明显、最自然和首选的方式是让内核硬件驱动程序处理它们。

有关已经存在的通用驱动程序的示例,这些示例对于您想要编写的任何其他内核驱动程序也都是很好的示例,请参阅使用 GPIO 的子系统驱动程序

对于您想要支持的任何批量生产的系统,例如服务器、笔记本电脑、手机、平板电脑、路由器以及使用适当内核驱动程序的任何消费品、办公用品或商业产品,这一点至关重要。 当您认为您的代码足够成熟时,请提交您的代码以包含在 upstream 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 芯片上的多个并发使用者提供帮助程序抽象、命令行实用程序和仲裁。