Linux 内核GPIO的学习

来源:互联网 发布:闪客是什么意思网络语 编辑:程序博客网 时间:2024/04/29 01:15
GPIO是嵌入式开发中最常见的接口,之前自己就有写过小的GPIO驱动,提供ioctl接口给用户空间操作。但直到最近才发现Linux自身就有完善的GPIO驱动框架,并且通过sysfs向用户空间提供操作接口。

Linux的GPIO驱动框架层次及数据结构如下:最上层是用来向向用户空间提供接口,用户可以通过该接口方去控制GPIO PIN脚。GPIO通用接口层主要是维护了一个GPIO PIN的数组gpio_desc[ARCH_NR_GPIOS],每注册一个GPIO控制器,该控制器上所有的PIN都会添加到这个全局数组里面,这样就有了一个统一的GPIO管理接口。GPIO硬件抽象层主要是对GPIO控制器的描述,内核里面用了一个gpio_chip的结构体来描述一个GPIO控制器,结构体里面定义了GPIO操作的函数集。硬件部分跟具体的硬件平台相关,都会提供特定的寄存器组来控制GPIO口。 

要想通过/sys/class/gpio操作GPIO口,需要在编译内核的时候打开CONFIG_GPIO_SYSFS标志,系统起来之后就可以在/sys下面看到对应的目录。以手上的项目为例:

      sh-3.2# ls /sys/class/gpio/

export  gpiochip0  unexport

可以看到在/sys/class/gpio/目录下面有两个文件和一个目录,目录gpiochip0表示当前有注册一个GPIO控制器,文件export是用来把某个GPIO PIN导出到用户空间,而unexport起相反的作用。比如用以下命令把GPIO-35导出到用户空间,

sh-3.2# echo 35 > export 

sh-3.2# ls

export  gpio35  gpiochip0  unexport

sh-3.2# ls gpio35/

active_low  direction  edge  subsystem  uevent  value

在/sys/class/gpio目录下多了个gpio35的目录,该目录里面的文件就是用来对改GPIO PIN进行设置的,direction是用来设置GPIO的方向,GPIO设成output时可以通过value来设定high/low,当GPIO PIN被用来做中断线时,可以利用edge设置中断触发的方式。

sh-3.2# cat gpio35/direction 

in
sh-3.2# cat gpio35/value 

1

sh-3.2# cat gpio35/edge 

none

从上面的log看出,GPIO-35目前是input PIN,值为1。

0 0