linux gpio c api

5

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


尝试使用这个或者这个 - Piotr Praszmo
你尝试过这里任何一个推荐使用libgpiod或者gpioset“用户工具”的答案吗?只是好奇,因为我在我的树莓派上尝试过了,结果非常糟糕 - 至少在gpioset方面是如此。 - user5395338
4个回答

2

编辑:sysfs直接访问GPIO已经不再使用,新的方式是通过libgpiod进行编程。

在最近的内核中,sysfs是您能够操作GPIO的最低级别。它可能有点繁琐,但与旧式API相比,它提供了几个优点:

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

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

从那时起,实现过程非常简单。


2
请注意,自Linux 4.8以来,通过sysfs访问GPIO已被弃用。 - Jetski S-type

2

自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


请阅读您引用链接中的第二个示例,并解释其含义。我认为文档和代码一样糟糕。您是否真的尝试过使用它?如果是,请告诉我您成功运行命令的平台(意味着“USR-LED-2”行保持HI/1)。如果它像您说的那样在您的平台上工作,我会转换到您的平台。 - user5395338
@Seamus,虽然晚了一些,但我确实已经让它工作了。可能会有多个GPIO组/硬件,因此有gpiochip0、gpiochip1等等。在每个组内,都有一组线路,从0到n。因此,GPIO线路的地址为“gpiochip1 23”。您可以使用gpiodetect和gpioinfo进行试验,以获取GPIO硬件的概述。 - Jetski S-type

1

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


-2
每个GPIO都被映射为一个寄存器,因此您可以通过/dev/mem访问它。请参见这里。如果您想直接访问GPIO,则必须在内核空间级别工作。

3
抱歉:那是错误的!Linux为所有输入/输出提供了明确定义的驱动程序接口。它还提供了访问未通过核心芯片寄存器访问的IO的方式。这也使您能够访问“扩展器”芯片上的引脚。如果您阅读我的问题,您会发现有一个驱动程序接口。问题不是如何从内核驱动程序访问映射到文件系统的寄存器引脚,而是如何在没有文件系统映射的情况下访问驱动程序。 - Klaus
1
内存映射是访问GPIO的一种替代方法,而不是使用sysfs。 - b0b0b
1
物理内存访问既不是访问任何硬件组件的好方法,也不是可容忍的方式,它依赖于代码对其运行目标做出非常强烈的假设。 如果代码存在漏洞或必须进行移植,会发生什么? - Léo Germond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接