GPIO各类函数的使用

发布时间 2023-08-30 20:39:29作者: Tyson~Xiao

参考:https://lwn.net/Articles/532714/

内核中,系统中的每个 GPIO 都由一个简单的无符号整数表示。一般板子上有几百个GPIO引脚

 

GPIO 必须在使用前进行分配,但当前的实现并未强制执行此要求。基本分配函数为:

    int gpio_request(unsigned int gpio, const char *label);

gpio 参数指示需要哪个 GPIO,而label 则将一个字符串与其关联起来,该字符串稍后会出现在 sysfs 中。通常的约定适用:零返回代码表示成功;否则返回值将为负错误号。

 

GPIO 可以通过以下方式返回到系统:

    void gpio_free(unsigned int gpio); 

这些函数有一些变体;gpio_request_one()可用于设置 GPIO 的初始配置, gpio_request_array()可以通过一次调用请求和配置一整套 ​​GPIO。还有一些“托管”版本(例如 devm_gpio_request() ),可以在开发人员忘记时自动处理清理工作。

 

一些 GPIO 用于输出,其他用于输入。适当接线的 GPIO 可以在任一模式下使用,但在任何给定时间只有一个方向处于活动状态。内核代码必须告知 GPIO 核心如何使用线路;这是通过这些函数完成的:

    int gpio_direction_input( unsigned int gpio); int gpio_direction_output( unsigned int gpio, int );

无论哪种情况,gpio都是 GPIO 编号。在输出情况下,还必须指定 GPIO 的值(零或一);作为调用的一部分,GPIO 将进行相应设置。对于这两个函数,返回值同样为零或负错误数。(具有适当功能的)GPIO 的方向可以随时更改。

对于输入 GPIO,可以通过以下方式读取当前值:

    int gpio_get_value( unsigned int gpio); 

该函数返回所提供的gpio 的值它没有返回错误代码的规定。假设(在几乎所有情况下都是正确的) 调用 gpio_direction_input()时会发现任何错误,因此检查该函数的返回值非常重要。

设置输出 GPIO 的值始终可以使用gpio_direction_output() 完成 ,但是,如果已知 GPIO 已处于输出模式,则gpio_set_value()可能会更有效一些:

 

    void gpio_set_value(unsigned int gpio, int value);

当输入 GPIO 更改值时,某些 GPIO 控制器可以生成中断。在这种情况下,希望处理此类中断的代码应首先确定与给定 GPIO 线关联的 IRQ 号:

    int gpio_to_irq( unsigned int gpio); 

给定的gpio必须已通过 gpio_request()获得并首先置于输入模式。如果有关联的中断号,它将作为gpio_to_irq()的返回值传回;否则将返回负错误号。一旦以这种方式获得,中断号就可以传递给request_irq()以设置中断的处理。

最后,GPIO 子系统能够通过 sysfs 层次结构表示 GPIO 线,允许用户空间查询(并可能修改)它们。内核代码可以导致特定的 GPIO 出现在 sysfs 中:

 

    int gpio_export(unsigned int gpio, bool Direction_may_change);

Direction_may_change参数控制是否允许用户空间改变GPIO的方向在许多情况下,允许这种控制会导致整个系统发生不好的事情。可以使用gpio_unexport()从 sysfs 中删除 GPIO ,或者使用gpio_export_link()指定另一个名称。

这就是内核低级 GPIO 接口的概述。许多细节自然被省略了;有关更详细的说明,请参阅Documentation/gpio.txt 。还省略了 API 的低级驱动程序端,通过它可以将 GPIO 线提供给 GPIO 子系统;涵盖该 API 可能是未来文章的主题。不过,下一部分将探讨上述 API 中发现的一些缺陷以及如何修复这些缺陷。