linux gpio c api

时间:2012-06-15 13:12:49

标签: linux gpio

我有一个运行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);

由于  克劳斯

4 个答案:

答案 0 :(得分:2)

编辑:不推荐使用对GPIO的sysfs直接访问,新方法是通过libgpiod编程的

sysfs是您可以在最近的内核中操作GPIO的最低级别。它可能有点乏味但它提供了几个优于旧式API的优势:

  • 没有丑陋的ioctl
  • 可以非常轻松地编写脚本(想想启动脚本)
  • 对于输入,“值”文件可以很容易地轮询上升/下降/两个边沿,并且它对硬件中断非常敏感

我目前没有示例代码,但是当通过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);

从那时起,实施非常简单。

答案 1 :(得分:1)

在vfs树中创建设备之后,您可以像典型文件一样打开它们,假设您已经编写了驱动程序,并且在makedev文件中分配了正确的主要和次要编号,这些编号在vfs树上创建了gpio引脚。

答案 2 :(得分:1)

从Linux 4.8开始,不建议通过sysfs访问GPIO。

访问用户空间的新方法是通过libgpiod,它包括一个(显然是)要链接的库,以及一些可以从命令行运行的工具(为了方便编写脚本)。值得注意的是,GPIO行是使用行名字符串而不是整数标识符(例如sysfs)来引用的。例如

> -dontwarn com.github.siyamed.**
> -keep class com.github.siyamed.shapeimageview.**{ *; }
> -keep public class * implements com.bumptech.glide.module.GlideModule
> -keep public class * extends com.bumptech.glide.module.AppGlideModule
> -keep public enum com.bumptech.glide.load.ImageHeaderParser$** {   **[] $VALUES;   public *; }

https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/tree/README

答案 3 :(得分:-2)

每个GPIO都被存储器映射为寄存器,因此您可以通过/ dev / mem访问它。见here。如果要直接访问GPIO,则必须在内核空间级别工作