一、应用层如何控制GPIO
与LED 设备一样,GPIO 通用也是通过sysfs 方式进行操控,进入到/sys/class/gpio 目录下,如下所示:
1.1 gpiochipX:
当前SOC 一共包含5 个 GPIO 控制器,分别是:GPIO1,GPIO2,GPIO3,GPIO4,GPIO5。在这里,分别是gpiochip0 、gpiochip32 、gpiochip64 、gpiochip96 、gpiochip128 这5个文件夹,每个gpiochipX 文件夹用来管理一组GPIO。
1.2 export
用于将指定编号的GPIO 引脚导出。在使用GPIO 引脚之前,需要将其导出,导出成功之后才能使用它。注意export 文件是只写文件,不能读取,将一个指定的编号写入到export 文件中即可将对应的GPIO 引脚导出,例如:
echo 0 > export #导出编号为0的GPIO 引脚。对应当前SOC,也就是GPIO1_IO0。
导出成功之后会发现在/sys/class/gpio 目录下生成了一个名为gpio0 的文件夹(gpioX, X 表示对应的编号)。这个文件夹就是导出来的GPIO 引脚对应的文件夹,用于管理、控制该GPIO 引脚。
并不是所有的GPIO 引脚都可以成功导出,如果对应的GPIO 已经在内核中被使用了,那就无法成功导出,打印如下信息:
Device or resource busy
1.3 unexport
将导出的GPIO 引脚删除。当使用完GPIO 引脚之后,我们需要将导出的引脚删除,同样该文件也是只写、不可读的。例如:
echo 0 > unexport # 删除导出的编号为0的GPIO 引脚
删除成功之后,之前生产的gpio0 文件夹就会消失。
二、GPIO 控制器:gpiochipX
每一个gpiochipX 文件夹用来管理一组GPIO 。进入gpiochip0 ,显示如下:
2.1 base
与gpiochipX 中的X 相同,表示该控制器所管理的这组GPIO 引脚的最小编号。
2.2 label
该组GPIO 对应的标签,也就是名字。
2.3 ngpio
该控制器所管理的GPIO 引脚的数量。引脚编号的范围是:base ~ base + ngpio- 1
三、引脚控制: gpioX
以前面所生产的gpio0 为例,进入到gpio0 目录,文件如下:
我们主要关心的文件是:active_low 、 direction 、edge 、value 这四个属性文件。
3.1 direction
配置GPIO 引脚为输入或输出模式。该文件可读、可写。
echo "out" > direction # 配置gpio 为输出模式
echo "in" > direction # 配置gpio 为输入模式
3.2 value
- 在gpio 配置为输出模式下,向value 文件写入0,控制gpio 引脚输出低电平;写入1,则控制gpio 输出高电平。
- 在gpio 配置为输入模式下,读取value 文件获取gpio 引脚的输入电平状态。
3.3 active_low
这个属性文件用于控制极性,可读可写,默认情况下为0 。 例如:
active_low 等于0时
echo "0" > active_low
echo "out" > direction
echo "1" > value # 输出高
echo“0” > value # 输出低
active_low 等于1 时
echo "1" > active_low
echo "out" > direction
echo "1" > value # 输出低
echo“0” > value # 输出高
3.4 edge
控制中断的触发模式,该文件可读可写。在配置GPIO 引脚的中断触发模式之前,需将其设置为输入模式:
- 非中断引脚:
echo "none" > edge
- 上升沿触发:
echo "rising" > edge
- 下降沿触发:
echo "falling" > edge
- 边沿触发:
echo "both" > edge
当引脚被配置为中断后可以使用poll() 函数监听引脚的电平状态变化。