Linux编程-GPIO操作

本文最后更新于:1 年前

/sys/class/gpio/export

文件用于通知系统需要导出控制的GPIO引脚编号

/sys/class/gpio/unexport

用于通知系统取消导出

/sys/class/gpio/gpiochipX

目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号base,寄存器名称,引脚总数

导出一个引脚的步骤:

(1) 计算此引脚编号,引脚编号=控制寄存器的寄存器基数+控制引脚寄存器位数。在 rk3399 中,GPIO_number的计算方法为:n*32 + (K-A)*8 + x;

比如 GPIO1_B1 = 1 * 32 + (B-A)*8 + 1 = 32 + 8 + 1 = 41;

GPIO1_B2 = 1 * 32 + (B-A)*8 + 2 = 32 + 8 + 2 = 42;

GPIO0_A3= 0 * 32 + (A-A)*8 + 3 = 0 + 0 + 3 = 3

括号里面的 A、B、C、D 分别代表数值 0、1、2、3,在计算时候分别对应即可。

(2) 向/sys/class/gpio/export 写入此编号,比如引脚编号是 3,在 shell 中可以通过以下命令实现,命令成功后生成/sys/class/gpio/gpio3 目录,如果没有出现相应的目录,说明此引脚不可导出:

echo 3 > /sys/class/gpio/export

如果在执行第一步的时候即 echo 3 > /sys/class/gpio/export 时出现了以下问题:

sh: write error: Device or resource busy

出现这个问题的原因是你将要使用的这个 gpio 口之前已经申请过了,包括内核申请或者使用上述方法申请过。释放相应的 GPIO,相应的节点会被删掉,如下所示:

echo 3 > /sys/class/gpio/unexport

(3) direction 文件,定义输入输出方向,可以通过下面的命令定义为输出,如下图所示:

/sys/class/gpio/gpio3/direction

/sys/class/gpio/gpio3/value

注意:direction 接受的参数:in(输入), out(输出), high, low。high/low 同时设置方向为输出,并将 value设置为相应的 1(高电平)或 0(低电平)。

(4) edge 文件可以监听对应引脚的事件,需要把 direction 设置为输入。参数可设置为”none”(无中断触发), “rising”(上升沿触发), “falling”(下降沿触发),“both”(上升、下降都沿触发)。

/sys/class/gpio/gpio3/edge

(5) active_low:此值可以反转 value 中的值。

/sys/class/gpio/gpio3/active_low