[GPIO] FireWRT-GPIO之按键----1


GPIO-KEY
Openwrt 使用的按键驱动为 gpio-button-hotplug,源码为:package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c
menuconfig 配置如下:
Kernel modules --->
             Other modules --->
                     <*> kmod-gpio-button-hotplug
在 target/linux/ramips/dts/FIREWRT.dts 配置了按键
 
这里配置了一个按键其名称为 WPS,POWER,对应的 GPIO 为 gpio18、23,键值为 0x198、116(对应内核头文件 include/uapi/linux/input.h
中的 KEY_WPS,KEY_POWER)。
在开发板上执行如下操作,监测该按键的操作结果
 

hi 表示高电平, lo 表示低电平


[GPIO] FireWRT-GPIO电源按键----2


在按键驱动 gpio-button-hotplug.c 中对按键的键值和名称进行了映射,如下所示:
 
比如 电源键 按键,键值为 116,对应的名称为“power”,当按下或释放该按键时,驱动会向用户层发送事件,最终执行
/etc/rc.button/目录下所对应的脚本 power,其内容如下:

  1. #!/bin/sh
  2. mnt="/mnt"
  3. kill_all() {
  4.     PIDS=`fuser -m $1`
  5.     if [ ! -z "$PIDS"  ];then
  6.         for line in $PIDS
  7.         do
  8.             if [ "$line" -eq "1"  ]; then
  9.                 break
  10.             fi
  11.             kill -9 $line 
  12.         done
  13.     fi

  14. }
  15. foreachd(){
  16.         for file in $mnt/*
  17.         do
  18.             if [ -d $file ]
  19.             then
  20.                 kill_all $file 1>/dev/null 2>&1
  21.                        umount_device_ret=$(umount $file 2>&1) 
  22.                        umount_device_ret_erro=`echo $umount_device_ret | grep "can't"`
  23.             fi
  24.            
  25.                if [ -z "$umount_device_ret_erro" ];then
  26.                        rm -r $file 1>/dev/null 2>&1
  27.                        echo "Success"
  28.                else
  29.                    echo "Error umout"
  30.                fi
  31.         done
  32. }
  33. countfile=0

  34. for file in $mnt/*
  35. do
  36.     if [ -d $file ]
  37.     then
  38.         countfile=$countfile+1
  39.         break;
  40.     fi
  41. done

  42. if [ $countfile -eq 0 ]#如果没有设备挂在就直接关机
  43. then
  44.     echo 0 > /sys/class/gpio/gpio24/value 
  45. else#卸载设备再休眠1s关机
  46.     foreachd $mnt
  47.     sleep 1
  48.     echo 0 > /sys/class/gpio/gpio24/value 
  49. fi
复制代码
在此前必须先执行
  1. GPIO24=24
  2. echo $GPIO24 > /sys/class/gpio/export
  3. echo out > /sys/class/gpio/gpio${GPIO24}/direction
  4. echo 1 > /sys/class/gpio/gpio${GPIO24}/value
复制代码
原因时GPIO 24时控制电源
所以我们让上面的这个脚本自动启动
  1. #!/bin/sh /etc/rc.common
  2. # Copyright (C) 2006 OpenWrt.org

  3. START=65
  4. start() {
  5.     /sbin/mkpowerio.sh
  6. }
复制代码




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值