参考: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 中发现的一些缺陷以及如何修复这些缺陷。
标签:函数,int,request,unsigned,各类,GPIO,gpio From: https://www.cnblogs.com/TysonXiao/p/17668237.html