一 、直接上代码, 从来不废话
使用gpio命令直接控制引脚电平
-内核配置make kernel_menuconfig
Device Drivers --->
GPIO Support --->
<*> /sys/class/gpio/...(sysfs interface)
-以下用管脚PL10为例:
1. cd sys/class/gpio
2. echo 362 > export //(PL10计算公式 L为第11位(A为0所以L即为11),11 x32 + 10 (为偏移量) = 362)
3. cd gpio362 // 进入目录
4. echo out > direction // 设置方向位输出
5. echo 1 > value // 设置value值为1拉高电压
-脚本 如下
#!/system/bin/sh
############################################################
# gpio_pin_control.sh
#
# 操作gpio 指定引脚
#
############################################################
# 限定参数个数
if [ $# -lt 2 ]; then
echo "less arams"
echo "example: gpio_pio_open.sh 362 1 or gpio_pio_open.sh 362 0"
echo "prompt arams 1:gpio引脚号"
echo "prompt arams 2:高电平: 1 、 低电平: 0"
echo "prompt arams :active-high (高电平有效), active-low (低电平有效), 默认active-high"
echo "prompt arams :input (输入), 0 (低电平), 1 (高电平), 默认output (输出)"
exit
fi
logger() {
echo "$1" > /dev/console 2>&1
}
gpio_number=
sysfs_ldir=
# 处理第一个参数,如果是类似PL10这样的字符串,则计算出gpio_number
if echo "$1" | grep -q ^[0-9]+$ ; then
gpio_number=$1
else
# 去掉字母部分,保留偏移量
letter=$(echo $1 | tr -d A-Z )
# 获取第二个大写字母
second_letter=$(echo "$1" | cut -c 2)
# 计算第二个大写字母在字母表中的位置
letter_position=$(($(printf "%d" " $second_letter") - $(printf "%d" " A")))
gpio_number=$(((${letter_position} * 32) + $letter))
fi
SYSFS=$(grep -w sysfs /proc/mounts | cut -f2 -d )
[ -d "$SYSFS" ] || logger "sysfs is not mounted"
GPIO_SYSFS="${SYSFS}/class/gpio"
[ -d "$GPIO_SYSFS" ] || logger "CONFIG_GPIO_SYSFS is not selected"
get_line() {
[ -e "$sysfs_ldir/value" ] && logger "value of gpio: $(< "$sysfs_ldir/value")"
}
set_line() {
if [ ! -d "$GPIO_SYSFS/gpio$gpio_number" ]; then
echo "$gpio_number" > "$GPIO_SYSFS/export"
fi
sysfs_ldir="$GPIO_SYSFS/gpio$gpio_number"
for option in "$@"; do
case $option in
active-high)
echo 0 > "$sysfs_ldir/active_low"
;;
active-low)
echo 1 > "$sysfs_ldir/active_low"
;;
input)
echo in > "$sysfs_ldir/direction"
;;
0)
echo out > "$sysfs_ldir/direction"
echo 0 > "$sysfs_ldir/value"
;;
1)
echo out > "$sysfs_ldir/direction"
echo 1 > "$sysfs_ldir/value"
;;
esac
done
}
# 定义函数来关闭GPIO
close_gpio() {
[ "$gpio_number" ] || return 0
# 关闭GPIO
echo 0 > value
# 释放GPIO
echo "$gpio_number" > "$GPIO_SYSFS/unexport"
}
shift 1
set_line $*
get_line
exit
脚本使用
有两种使用方式, 注释中已经提及到了。使用管脚名(PL10)称来控制的方法不具有通用性,目前在allwinner可以正常使用。直接使用管脚号(362)来控制的方式为通用方式。
example:
gpio_pio_open.sh PL10 1orgpio_pio_open.sh 362 1
高电平: 1 、 低电平: 0
-
./gpio_pio_open.sh PL10 1//直接输入引脚名称 和 控制的电平 -
./gpio_pio_open.sh 362 1//输入自己计算后的引脚编号 和电平
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...


