如何解决如何在 Linux 中以编程方式使用 GPIO Expander 驱动程序?
我正在尝试配置我的 Yocto Linux 发行版以设置两个板载 I2C GPIO 扩展器并记录如何以编程方式(即从 C 用户应用程序)访问它们。 GPIO 扩展器均为 NXP PCA9557,受 gpio-pca953x.c 内核驱动程序支持。
我了解如何将此驱动程序编译到内核中(使用 CONFIG_GPIO_PCA953X
配置选项)并加载它(使用 modprobe
)。我也明白我可以在设备树中实例化这两个 I2C 设备(这是一个嵌入式设备,所以 GPIO 扩展器是静态的和不变的):
gpio@20 {
compatible = "nxp,pca9557";
reg = <0x1a>;
gpio-controller;
#gpio-cells = <2>;
};
我缺少的信息是如何将 gpio-pca953x 驱动程序用于这些实例化设备?我是否需要将这些设备与该特定驱动程序相关联?在用 C 编写的用户应用程序中,我使用哪些 API 来访问它们?一旦我正确配置了它们,它们是否就像普通的 GPIO 一样?
我非常乐意阅读有关如何执行此操作的任何相关文档,无论是冗长的还是其他的。我只是 Linux 设备驱动程序的初学者,尽管使用了大量谷歌搜索,但不知道该从何下手。
解决方法
有几种方法可以从用户空间控制 GPIO,但是你想控制什么? Linux 能够将 GPIO 用作 LED、按键、中断等。
sysfs 是控制 GPIO 的“旧”方式。它有效并且仍在维护中。本质上,您在 /sys 目录中编写节点。写入文件是 C 语言中的直接过程。如果需要,您可以先在 Shell 中测试写入文件。
$ echo 7 > /sys/class/gpio/export
$ echo "out" > /sys/class/gpio/gpio7/direction
$ echo 1 > /sys/class/gpio/gpio7/value #turn on
$ echo 0 > /sys/class/gpio/gpio7/value #turn off
有一种更新的方式来访问 GPIO。您可以打开 /dev/chip 并进行一些 IOCTL 调用。包括 #include <linux/gpio.h>
然后
-
GPIO_GET_LINEHANDLE_IOCTL
,查看当前状态 -
GPIOHANDLE_GET_LINE_VALUES_IOCTL
然后阅读 -
GPIOHANDLE_SET_LINE_VALUES_IOCTL
写
您可以使用使用相同接口的 Shell 程序对其进行测试。
$ gpiodetect
$ gpioinfo
$ gpioset
我从未这样做过,但这里有一个 example tool 可以做到这一点。同样在 5.9 之后的内核上,您可以使用 #include "gpio-utils.h"
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。