在嵌入式设备中对 GPIO 的操作,一般的做法是写一个单独驱动程序。其实 linux 下面有一个通用的 GPIO 操作接口,那就是 “/sys/class/gpio” 方式。使用这种方法,你不需要写驱动,便可直接使用 GPIO 引脚,更方便开发,内核更小。
下面是以友善之臂的 NanoPi2 为例,简单的写一下 GPIO 的使用方法。
首先,进入根文件系统,查看系统中有没有 “/sys/class/gpio” 这个文件夹。如果没有请在编译内核的时候通过 make menuconfig 加入
Device Drivers —>
GPIO Support —> /sys/class/gpio/… (sysfs interface) 。
1 : gpio_operation 通过 /sys/ 文件接口操作 IO 端口 GPIO 到文件系统的映射;
2 :控制 GPIO 的目录位于 /sys/class/gpio 中;
3 : /sys/class/gpio/export 文件用于通知系统需要导出控制的 GPIO 引脚编号;
4 : /sys/class/gpio/unexport 用于通知系统取消导出;
5 : /sys/class/gpio/gpiochipX 目录保存系统中 GPIO 寄存器的信息,包括每个寄存器控制引脚的起始编号 base ,寄存器名称,引脚总数 导出一个引脚的操作步骤;( X 表示数字)
6 :首先计算此引脚编号,引脚编号 = 控制引脚的寄存器基数 + 控制引脚寄存器位数;
7 : 向 /sys/class/gpio/export 写入此编号,比如 12 号引脚,在 shell 中可以通过以下命令实现,命令成功后生成 /sys/class/gpio/gpio12 目录,如果没有出现相应的目录,说明此引脚不可导出;
8 : echo 12 > /sys/class/gpio/export;
9 : direction 文件,定义输入输出方向,可以通过下面命令定义为输出;
10 : echo out > direction;
11 : direction 接受的参数: in, out, high, low 。 high/low 同时设置方向为输出,并将 value 设置为相应的 1/0 ;
12 : value 文件是端口的数值,为 1 或 0 ;
13 : echo 1 & > value 。
/sys/class/gpio 的使用说明:
测试: 由于我们需要通过sysfs的方式来操作GPIO, 因此,我们还需要找到这组引脚在内核中所对应的编号(每一个GPIO引脚,内核都会赋于它一个编号), 查询内核编号的方法如下 :
1 ) NanoPi 2 开机后,进入根文件系统;
2 )在超级终端中输入以下命令(因命令比较长,建议直接复制运行):
# cd /sys/class/gpio
# for i in gpiochip* ; do echo `cat $i/label`: `cat $i/base` ; done
nxp-gpio.0:0
nxp-gpio.4:128
nxp-gpio.5:160
nxp-gpio.1:32
nxp-gpio.2:64
nxp-gpio.3:96
其实这里的gpio.0表示的是GPIOA,gpio.1表示GPIOB,其他是也是这样计算。
假如,我们需要使用NanoPi 2的GPIOB30引脚,想在应用程序使用,我们可以表示为:
64+30=94 也就是说我们使用的是第94根GPIO。
版权声明:本文为huayucong原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。