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。