浏览OpenWrt时看到的,感觉不错,整理装载于此,https://openwrt.org/docs/guide-developer/add.new.device
# 一、说明
基于gpiolib子系统,sys文件系统,还需要选中板级的gpio驱动。
Device Drivers --->
-*- GPIO Support --->
--- GPIO Support
[*] /sys/class/gpio/... (sysfs interface)
关于gpiolib子系统相关的内容,建议阅读内核相关介绍文档
Documentation/gpio.txt
Documentation/pinctrl.txt
Documentation/zh_CN/gpio.txt
推荐一个源码浏览网站:https://elixir.bootlin.com/linux/v3.10.108/source/Documentation
# 二、单个GPIO测试
**注意**:要确保当前引脚的功能为gpio,而不是其它的功能。
cd /sys/class/gpio
# 导出gpio3
echo 3 > export
# 设置gpio3为输出
echo "out" > gpio3/direction
# gpio3输出低电平
echo 0 > gpio3/value
# gpio3输出高电平
echo 1 > gpio3/value
# 设置gpio3为输入
echo "in" > gpio3/direction
# 读取当前的引脚值
cat gpio3/value
# 释放gpio3引脚
echo 3 > unexport
# 三、查看系统当前使用的gpio资源
选中debugfs,
Kernel hacking --->
[*] Debug Filesystem
挂载debugfs,查看gpio使用状况,
mount -t debugfs none /sys/kernel/debug
cat /sys/kernel/debug/gpio
# 三、GPIO LEDs(gpio输出批量测试)
为了快速的一个一个的检测所有的gpio led。执行下面的脚本程序,注意看LED的状态和终端的输出。如果USB LED亮了,而且最后的一句终端信息是`[GPIO12] Trying value 0`
,那么USB LED用的是GPIO12,低电平有效。
GPIOCHIP=0:测试gpio0~gpio31
GPIOCHIP=32:测试gpio32~gpio63
以此类推
#!/bin/sh
GPIOCHIP=0
BASE=$(cat /sys/class/gpio/gpiochip${GPIOCHIP}/base)
NGPIO=$(cat /sys/class/gpio/gpiochip${GPIOCHIP}/ngpio)
max=$(($BASE+$NGPIO))
gpio=$BASE
while [ $gpio -lt $max ] ; do
echo $gpio > /sys/class/gpio/export
[ -d /sys/class/gpio/gpio${gpio} ] && {
echo out > /sys/class/gpio/gpio$gpio/direction
echo "[GPIO$gpio] Trying value 0"
echo 0 > /sys/class/gpio/gpio$gpio/value
sleep 3s
echo "[GPIO$gpio] Trying value 1"
echo 1 > /sys/class/gpio/gpio$gpio/value
sleep 3s
echo $gpio > /sys/class/gpio/unexport
}
gpio=$((gpio+1))
done
# 四、GPIO buttons(gpio输入批量测试)
按键按下时,连接的GPIO的获取的值会变化,所以,找出按键与GPIO的对应关系步骤为:
1. 打印所有GPIO的值
2. 按下按键并保持
3. 打印所有GPIO的值
4. 找出值有变化的GPIO
打印所有GPIO的值可用如下脚本:
#!/bin/sh
GPIOCHIP=0
BASE=$(cat /sys/class/gpio/gpiochip${GPIOCHIP}/base)
NGPIO=$(cat /sys/class/gpio/gpiochip${GPIOCHIP}/ngpio)
max=$(($BASE+$NGPIO))
gpio=$BASE
while [ $gpio -lt $max ] ; do
echo $gpio > /sys/class/gpio/export
[ -d /sys/class/gpio/gpio${gpio} ] && {
echo in > /sys/class/gpio/gpio${gpio}/direction
echo "[GPIO${gpio}] value $(cat /sys/class/gpio/gpio${gpio}/value)"
echo ${gpio} > /sys/class/gpio/unexport
}
gpio=$((gpio+1))
done