我有一个运行3.2内核的PowerPC板。使用sysfs访问GPIO的效果如预期一样。
> echo 242 > /sys/class/gpio/export
> cat /sys/class/gpio/gpio242/value
> 1
在用户空间中没有直接访问gpio引脚的API吗?我必须处理基于文本的sysfs接口吗?
我正在寻找类似以下的内容: gpio_set(int no, int val);
谢谢 Klaus
编辑: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);
从那时起,实现过程非常简单。
自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
一旦您在vfs树中创建了设备,假设您编写了驱动程序并在创建gpio引脚的makedev文件中分配了正确的主要和次要编号,那么您可以像打开典型文件一样打开它们。
libgpiod
或者gpioset
“用户工具”的答案吗?只是好奇,因为我在我的树莓派上尝试过了,结果非常糟糕 - 至少在gpioset
方面是如此。 - user5395338