单独控制GPIO某个引脚的电平(附脚本)

内容分享12小时前发布
0 0 0

一 、直接上代码, 从来不废话

使用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 1 or gpio_pio_open.sh 362 1
高电平: 1 、 低电平: 0

  • ./gpio_pio_open.sh PL10 1 //直接输入引脚名称 和 控制的电平
  • ./gpio_pio_open.sh 362 1 //输入自己计算后的引脚编号 和电平
© 版权声明

相关文章

暂无评论

none
暂无评论...