转载自http://blog.csdn.net/huayucong/article/details/51735966 。但原文有几处疏漏,进行了优化修改。
在嵌入式设备中对
GPIO
的操作,一般的做法是写一个单独驱动程序。其实
linux
下面有一个通用的
GPIO
操作接口,那就是
“/sys/class/gpio”
方式。使用这种方法,你不需要写驱动,便可直接使用
GPIO
引脚,更方便开发,内核更小。
- GPIO管脚定义
-
-
Pin# Name Pin# Name 1 SYS_3.3V 2 VDD_5V 3 I2C0_SDA 4 VDD_5V 5 I2C0_SCL 6 DGND 7 GPIOD8/PPM 8 UART3_TXD/GPIOD21 9 DGND 10 UART3_RXD/GPIOD17 11 UART4_TX/GPIOB29 12 GPIOD1/PWM0 13 GPIOB30 14 DGND 15 GPIOB31 16 GPIOC14/PWM2 17 SYS_3.3V 18 GPIOB27 19 SPI0_MOSI/GPIOC31 20 DGND 21 SPI0_MISO/GPIOD0 22 UART4_RX/GPIOB28 23 SPI0_CLK/GPIOC29 24 SPI0_CS/GPIOC30 25 DGND 26 GPIOB26 27 I2C1_SDA 28 I2C1_SCL 29 GPIOC8 30 DGND 31 GPIOC7 32 GPIOC28 33 GPIOC13/PWM1 34 DGND 35 SPI2_MISO/GPIOC11 36 SPI2_CS/GPIOC10 37 AliveGPIO3 38 SPI2_MOSI/GPIOC12 39 DGND 40 SPI2_CLK/GPIOC9
-
下面是以友善之臂的
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. 进入产生的gpio12 文件夹,
cd gpio12
echo out > direction;
11
:
direction
接受的参数:
in, out, high, low
。
high/low
同时设置方向为输出,并将
value
设置为相应的
1/0
;
12
:
value
文件是端口的数值,为
1
或
0
;
13
:
echo 1 & > value
。
测试:
由于我们需要通过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引脚,想在应用程序使用,我们可以表示为:
32+30=62也就是说我们使用的是第62根GPIO。