在sysfs中访问GPIO的方法
(a)kernel/arch/arm/boot/dts/芯片厂名字(比如rockchip,imx)/xxxx-pinctrl.dtsi
GPIOA : 0 -31
GPIOB: 32-60
GPIOC: 61-90
GPIOD: 91-112
GPIOE: : 113-132
GPIOF: 133-164
GPIOG 165:-175
GPIOH: 176-187
GPIOK: 188-206
GPIOMA: 207-236
GPSD0: 237-251
GPSD1: 252-262
GPSD2: 263-272
(b).从板子中获取GPIO的信息:在板子的串口输入 ls /sys/class/gpio
# ls -l sys/class/gpio/
--w------- 1 root root 4096 Apr 23 03:43 export
lrwxrwxrwx 1 root root 0 Apr 23 03:43 gpiochip0 -> ../../devices/platform/14200000.pinctrl/gpio/gpiochip0
lrwxrwxrwx 1 root root 0 Apr 23 03:43 gpiochip113 -> ../../devices/platform/14200000.pinctrl/gpio/gpiochip113
lrwxrwxrwx 1 root root 0 Apr 23 03:43 gpiochip133 -> ../../devices/platform/14200000.pinctrl/gpio/gpiochip133
lrwxrwxrwx 1 root root 0 Apr 23 03:43 gpiochip165 -> ../../devices/platform/14200000.pinctrl/gpio/gpiochip165
lrwxrwxrwx 1 root root 0 Apr 23 03:43 gpiochip176 -> ../../devices/platform/14200000.pinctrl/gpio/gpiochip176
lrwxrwxrwx 1 root root 0 Apr 23 03:43 gpiochip188 -> ../../devices/platform/14200000.pinctrl/gpio/gpiochip188
lrwxrwxrwx 1 root root 0 Apr 23 03:43 gpiochip207 -> ../../devices/platform/14200000.pinctrl/gpio/gpiochip207
lrwxrwxrwx 1 root root 0 Apr 23 03:43 gpiochip237 -> ../../devices/platform/14200000.pinctrl/gpio/gpiochip237
lrwxrwxrwx 1 root root 0 Apr 23 03:43 gpiochip252 -> ../../devices/platform/14200000.pinctrl/gpio/gpiochip252
lrwxrwxrwx 1 root root 0 Apr 23 03:43 gpiochip263 -> ../../devices/platform/14200000.pinctrl/gpio/gpiochip263
lrwxrwxrwx 1 root root 0 Apr 23 03:43 gpiochip32 -> ../../devices/platform/14200000.pinctrl/gpio/gpiochip32
lrwxrwxrwx 1 root root 0 Apr 23 03:43 gpiochip61 -> ../../devices/platform/14200000.pinctrl/gpio/gpiochip61
lrwxrwxrwx 1 root root 0 Apr 23 03:43 gpiochip91 -> ../../devices/platform/14200000.pinctrl/gpio/gpiochip91
--w------- 1 root root 4096 Apr 23 03:43 unexport
可以看出以上结果从/sys/devices/platform/14200000.pinctrl/gpio链接过来的。0x14200000是GPIO的基地址。
/sys/devices/platform/14200000.pinctrl/gpio# ls -l
drwxr-xr-x 3 root root 0 Apr 23 03:43 gpiochip0
drwxr-xr-x 3 root root 0 Apr 23 03:43 gpiochip113
drwxr-xr-x 3 root root 0 Apr 23 03:43 gpiochip133
drwxr-xr-x 3 root root 0 Apr 23 03:43 gpiochip165
drwxr-xr-x 3 root root 0 Apr 23 03:43 gpiochip176
drwxr-xr-x 3 root root 0 Apr 23 03:43 gpiochip188
drwxr-xr-x 3 root root 0 Apr 23 03:43 gpiochip207
drwxr-xr-x 3 root root 0 Apr 23 03:43 gpiochip237
drwxr-xr-x 3 root root 0 Apr 23 03:43 gpiochip252
drwxr-xr-x 3 root root 0 Apr 23 03:43 gpiochip263
drwxr-xr-x 3 root root 0 Apr 23 03:43 gpiochip32
drwxr-xr-x 3 root root 0 Apr 23 03:43 gpiochip61
drwxr-xr-x 3 root root 0 Apr 23 03:43 gpiochip91
在每个文件下面都有下面的内容:
base device label ngpio power subsystem uevent
/sys/devices/platform/14200000.pinctrl/gpio/gpiochip32# cat lable
gpb
/sys/devices/platform/14200000.pinctrl/gpio/gpiochip32# cat base
32
/sys/devices/platform/14200000.pinctrl/gpio/gpiochip32# cat ngpio
29
gpiochip32所在的GPIO组名为gpb。base的表明gpb这组GPIO的基准引脚号是32(从32号开始)。ngpio表示gpb这组GPIO的总数量为29.(这样,gpb的下一组GPIO基准引脚号就是61)
通过上面的步骤,可以得到每一组GPIO包含所少个GPIO pin数目,对某一具体的GPIO也可以知道它的GPIO号码是多少。
(c). 通过串口读取GPIO的状态:
读取GPIO91的状态:
#echo 91 > /sys/class/gpio/export //向export文件写入GPIO编号,暴露该GPIO的操作接口到用户空间
# echo in > /sys/class/gpio/gpio91/direction //设置方向
# cat /sys/class/gpio/gpio91/value //查看GPIO的值
0
#echo "rising" > /sys/class/gpio/gpio91/edge 或者 echo "falling" > /sys/class/gpio/gpio77/edge //当GPIO被设置为输入时,可以配置中断的触发方式,rising或falling edge
echo 91 > /sys/class/gpio/unexport
(d). 假设引脚号为191,可以用如下方法设置其为输出、值为1:
#echo 191 > /sys/class/gpio/export
#echo out > /sys/class/gpio/gpio191/direction
#echo 1 > /sys/class/gpio/gpio191/value
#echo 191 > /sys/class/gpio/unexport