一种控制gpio的脚本

93 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

记录一种设置gpio的相关的脚本,方便以后设置gpio

一、拷贝文件

因为设置的是一种脚本,要在板子里面使用,所以我们首先就是先把文件拷贝到对应的目录下 首先找到对应的BoardConfig.mk文件,通过PRODUCT_COPY_FILES += 将文件拷贝到开发板的目录下

PRODUCT_COPY_FILES += \
    device/nxp/custom/gpio:/system/bin/gpio

把自己的device对应目录下的gpio文件拷贝到对应的/system/bin/目录下

二、gpio脚本

#!/system/bin/sh
# GPIO1_IO00, GPIO1_IO01, GPIO1_IO02, GPIO1_IO03, GPIO1_IO04, GPIO1_IO05, GPIO1_IO06, GPIO1_IO07
MY_EXPORT_GPIO="0 1 2 3 4 5 6 7"
GPIOlist=$MY_EXPORT_GPIO
MaxNum=$(echo $GPIOlist|busybox wc -w)
Cond=0-$MaxNum
Help="gpio [ set | clear | get | dirout | dirin | unex ] [ 1-$MaxNum | all ]\n \
ie: gpio set 1\n "
Erro1="Can not export GPIO "
TgtDir=/sys/class/gpio
Exp=$TgtDir/export
Unexp=$TgtDir/unexport


[ -z "$1" ] && echo -e $Help && exit 1
[ -z "$2" ] && echo -e $Help && exit 1

Arg1=$2
Arg2=$1
GpioNum=""
Opt=""
case "$Arg1" in
	"all" )
	GpioNum=$GPIOlist
	;;
	#[1-8] )
	[$Cond] )
	TmpArr=($GPIOlist)
	Num=$(($Arg1))-1
	GpioNum=${TmpArr[$Num]}
	;;
	* )
	echo $Help
	;;
esac

case "$Arg2" in
	"set" )
	for TgtGpio in $GpioNum
	do
		[ ! -e $TgtDir/gpio$TgtGpio ] && echo $TgtGpio > $Exp
		[ ! -e $TgtDir/gpio$TgtGpio ] && echo $Erro1 $TgtGpio && continue 
		# echo "out" > $TgtDir/gpio$TgtGpio/direction
		echo 1 > $TgtDir/gpio$TgtGpio/value
	done
	;;
	"clear" )
	for TgtGpio in $GpioNum
	do
		[ ! -e $TgtDir/gpio$TgtGpio ] && echo $TgtGpio > $Exp
		[ ! -e $TgtDir/gpio$TgtGpio ] && echo $Erro1 $TgtGpio  && continue
		# echo "out" > $TgtDir/gpio$TgtGpio/direction
		echo 0 > $TgtDir/gpio$TgtGpio/value
	done
	;;
	"dirout" )
	for TgtGpio in $GpioNum
	do
		[ ! -e $TgtDir/gpio$TgtGpio ] && echo $TgtGpio > $Exp
		[ ! -e $TgtDir/gpio$TgtGpio ] && echo $Erro1 $TgtGpio && continue
		echo "out" > $TgtDir/gpio$TgtGpio/direction
	done
	;;
	"dirin" )
	for TgtGpio in $GpioNum
	do
		[ ! -e $TgtDir/gpio$TgtGpio ] && echo $TgtGpio > $Exp
		[ ! -e $TgtDir/gpio$TgtGpio ] && echo $Erro1 $TgtGpio && continue
		echo "in" > $TgtDir/gpio$TgtGpio/direction
	done
	;;
	"unex" )
	for TgtGpio in $GpioNum
	do
		[ -e $TgtDir/gpio$TgtGpio ] && echo $TgtGpio > $Unexp
	done
	;;
	"get" )
	for TgtGpio in $GpioNum
	do
		[ ! -e $TgtDir/gpio$TgtGpio ] && echo $TgtGpio > $Exp
		[ ! -e $TgtDir/gpio$TgtGpio ] && echo $Erro1 $TgtGpio && continue
		echo "GPIO $Arg2($TgtGpio) : $(cat $TgtDir/gpio$TgtGpio/direction) $(cat $TgtDir/gpio$TgtGpio/value)"
	done
	;;
	* )
	echo $Help
esac

exit 0

我们只需要修改前面两行就ok

# GPIO1_IO00, GPIO1_IO01, GPIO1_IO02, GPIO1_IO03, GPIO1_IO04, GPIO1_IO05, GPIO1_IO06, GPIO1_IO07
MY_EXPORT_GPIO="0 1 2 3 4 5 6 7"

一行注释和一行对应的gpio号(gpio号需要自己去算算)

三、脚本使用

申请所有的gpio

vt_ipc_rk88:/ # gpio dirout all

申请单独的gpio

vt_ipc_rk88:/ # gpio dirout 0 gpio1
//0 gpio1 代表的是 GPIO0——IO01的意思

后面设置的单独的gpio与之类似 ..................... 设置所有的gpio输出为高

vt_ipc_rk88:/ # gpio set all

设置所有的gpio输入

vt_ipc_rk88:/ # gpio dirin all

将所设置为高的gpio清除

vt_ipc_rk88:/ # gpio clear all

注销所有的gpio

vt_ipc_rk88:/ # gpio unex all

四、脚本原理

其实就相当于直接把对应的gpio给你export出来,你想要控制那个就控制那个

evk_8mp:/sys/class/gpio # ls
export  gpio1  gpio3  gpio5  gpio7      gpiochip128  gpiochip64  unexport
gpio0   gpio2  gpio4  gpio6  gpiochip0  gpiochip32   gpiochip96