【问题标题】:linux gpio c apilinux gpio c api
【发布时间】:2012-06-15 13:12:48
【问题描述】:

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

谢谢 克劳斯

【问题讨论】:

  • 试试thisthis
  • 您是否尝试过此处推荐libgpiodgpioset“用户工具”的任何答案?只是好奇,因为我已经在我的 Raspberry Pi 上尝试过它,它非常糟糕 - 进入了可怕的范围 - 至少 wrt gpioset

标签: linux gpio


【解决方案1】:

编辑:不推荐使用 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);

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

【讨论】:

  • 请注意,自 Linux 4.8 起,通过 sysfs 进行 GPIO 访问已被弃用。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    自 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。如果它像您所说的那样在您的 pltform 上工作,我将切换到您的平台。
    【解决方案4】:

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

    【讨论】:

    • 对不起:那是错误的! Linux 为所有 IO 提供了一个定义良好的驱动程序接口。它还提供对未通过核心芯片上的寄存器访问的 IO 的访问。这使您还可以访问“扩展器”芯片上的引脚。如果您阅读我的问题,您会看到有一个驱动程序接口。问题不在于如何从内核驱动程序访问寄存器映射引脚。相反,问题是如何在没有文件系统映射的情况下访问驱动程序。
    • 内存映射是访问 gpio 而不是 sysfs 的替代方法
    • 物理内存访问既不是访问任何硬件组件的好方法,也不是可以容忍的方法,它依赖于代码对其运行的目标做出非常强的假设。如果代码有问题或必须移植怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2017-10-05
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多