http://book.2cto.com/201304/20887.html
在Linux的应用层程序中,可以使用系统中的GPIOLIB模块在用户空间提供的sysfs接口,实现应用层对GPIO的独立控制。本节介绍的GPIO的这种操作方式是在Linux 2.6.35内核之后引入的一种GPIOLIB的管理机制,GPIOLIB提供了很好的用户接口封装,为用户提供了一个动态导出的接口。
在实验箱中运行的Linux系统的/sys/class/gpio目录下,共有5个文件,其中有3个文件为符号链接(gpiochip0、gpiochip5、gpiochip244),指向管理对应设备的目录。这3个符号链接分别对应实验箱中能够分别控制对应GPIO的3个管理芯片。上一节中涉及的GPIO都是从与gpiochip244对应的芯片中引出的。因此,本节主要讨论gpiochip244对应芯片的GPIO管理,但是此处介绍的操作方法同样也适用于gpiochip0和gpiochip5。
在/sys/class/gpio/gpiochip244目录下,共有3个文件和3个文件夹,主要作用见表4-2。
表4-2 gphichip244目录下文件的作用
文 件 名 | 类 型 | 属 性 | 作 用 |
---|---|---|---|
label | 文件 | 只读 | 设备信息 |
base | 文件 | 只读 | 设备所管理的GPIO初始编号 |
ngpio | 文件 | 只读 | 设备所管理的GPIO总数 |
power | 目录 | 设备供电方面的相关信息 | |
subsystem | 目录 | 符号链接,指向父目录 | |
uevent | 文件 | 读写 | 内核与udev(自动设备发现程序)之间的通信接口 |
对其中某个GPIO接口的控制主要需要进行如下包含3个步骤的操作:
(1) 导出GPIO接口
在/sys/class/gpio目录中有两个只具有写属性的文件:export和unexport。通过对这两个文件进行操作可以实现对GPIO接口的导出。
下面举例说明,为了对255号GPIO接口进行导出,可以在终端中通过下面的操作来完成:
cd /sys/class/gpio //进入相应的目录
echo 255 > export //将“255”(字符串类型)写入文件export
将“255”写入export文件后,系统会自动在/sys/class/gpio下创建gpio255目录。这说明对编号为255的GPIO接口导出成功。
(2) 设置GPIO属性
在gpio255目录下,系统会自动产生6个文件。其中,power、subsystem和uevent这3个文件的功能与表4-2中描述的功能相同。
其他的3个文件——value、direction和active_low都具有读写属性,用于完成对GPIO接口的控制。
value:具有读写属性,表示当前GPIO接口的电平状态。当GPIO的方向为输入时,可以通过value读出当前GPIO接口的电平状态高低(“1”/“0”,均以ASCII码表示);当GPIO方向为输出时,可以向该文件写入“1”/“0”,控制当前GPIO接口的高/低电平。
direction:具有读写属性,控制GPIO接口的输入输出方向。如果将“out”写入该文件,该GPIO接口为输出状态;如果将“in”写入该文件,该GPIO接口为输入状态;如果将“high”写入该文件,那么在将GPIO接口置为输出状态的同时,也将value的值置为“1”;如果将“low”写入value文件,那么在将GPIO接口置为输出状态的同时,将“0”写入value文件。通过对direction文件的读操作还可以判断当前GPIO接口的输入/输出状态(“in”/“out”)。
active_low:具有读写属性,值为“0”或“1”,用于决定value中的值是否进行翻转。当值为“0”时,value中的“0”表示低电平,“1”表示高电平;当值为“1”时,value中的“1”表示低电平,“0”表示高电平。
(3) GPIO接口导出的取消
将取消导出的GPIO编号写入文件unexport中,对应的GPIO接口将会被取消导出。相对的,在文件系统中创建的目录也会消失。
例如,取消255号GPIO接口的导出:
echo 255 > unexport //将“255”(字符串类型)写入文件unexport