我有一块运行 3.2 内核的 powerpc 板。使用 sysfs 访问 gpio 可以按预期工作,例如
> echo 242 > /sys/class/gpio/export
> cat /sys/class/gpio/gpio242/value
> 1
是否没有 API 可以直接从用户空间访问 gpio 引脚?我必须处理基于文本的 sysfs 界面吗?
我寻找类似的东西: gpio_set(int no, int val);
谢谢克劳斯
编辑:不推荐使用 sysfs 直接访问 GPIO,新方法是通过 libgpiod 编程
sysfs 是您能够在最近的内核中操作 GPIO 的最低级别。它可能有点乏味,但与旧式 API 相比,它提供了几个优点:
目前我没有示例代码,但是当通过 C 代码访问它们时,我经常实现一个非常简单的包装器来操作文件描述符并具有以下接口的变体:
int gpio_open(int number, int out); /* returns handle (fd) */
int gpio_close(int gpio);
int gpio_set(int gpio, int up);
int gpio_get(int gpio, int *up);
int gpio_poll(int gpio, int rising_edge, int timeout);
从那时起,实施就非常简单了。
在 vfs 树中创建设备后,您可以像典型文件一样打开它们,假设您编写了驱动程序并且在 makedev 文件中分配了正确的主要和次要编号,该文件在 vfs 树上创建了 gpio 引脚。
自 Linux 4.8 起,通过 sysfs 访问 GPIO 已被弃用。
用户空间访问的新方法是通过 libgpiod,它包括一个链接库(显然),以及一些可以从命令行运行的工具(为了方便编写脚本)。值得注意的是,GPIO 线是用线名字符串而不是整数标识符来引用的,就像 sysfs 一样。例如
gpioset $(gpiofind "USR-LED-2")=1
https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/tree/README
每个 GPIO 都被内存映射为寄存器,因此您可以通过 /dev/mem 访问它。见这里。如果您想直接访问 GPIO,您必须在内核空间级别工作