OpenWRT添加物理按键(procd,ar71xx)

路由器配备的实体按钮太少了,还好GL-iNet开发板上预留了4个GPIO给用户,省事多了,现按需要手动添加一个。

思路:通过修改特定位置源码新增按键触发操作,并尽量不安装其他软件,在原有基础上做修改(调用reset按键实现方法)。

相关参考材料:
http://www.mamicode.com/info-detail-424452.html
OpenWRT中的按键和灯的GPIO控制实现
(基础而直接的思路,有它才有下一步)
http://wiki.openwrt.org/doc/howto/hardware.button
Attach functions to a push button
这份wiki里列举了4种办法,我用第一种:buttons using procd,即reset按键的实现方法。
1.查看空闲、可用的gpio,

GL-iNet电路图

当前使用情况:

root@2012-2013:~# cat /sys/kernel/debug/gpio
GPIOs 0-29, ath79:
 gpio-0   (gl-connect:red:wlan ) out hi
 gpio-11  (reset               ) in  lo
 gpio-13  (gl-connect:green:lan) out hi
 gpio-18  (sda                 ) in  lo
 gpio-19  (scl                 ) in  lo
2.系统预定义了哪些按钮?
root@2012-2013:~# ls /etc/rc.button/
failsafe  power     reset     rfkill
root@2012-2013:~# cat /etc/rc.button/power
#!/bin/sh

[ "${ACTION}" = "released" ] || exit 0

exec /sbin/poweroff

除reset外,虽有可供procd调用的配置文件但没有链接上。

3.驱动定义了哪些按钮?

~/barrier_breaker/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c

#define BH_MAP(_code, _name)        \
    {               \
        .code = (_code),    \
        .name = (_name),    \
    }

static struct bh_map button_map[] = {
    BH_MAP(BTN_0,       "BTN_0"),
    BH_MAP(BTN_1,       "BTN_1"),
    BH_MAP(BTN_2,       "BTN_2"),
    BH_MAP(BTN_3,       "BTN_3"),
    BH_MAP(BTN_4,       "BTN_4"),
    BH_MAP(BTN_5,       "BTN_5"),
    BH_MAP(BTN_6,       "BTN_6"),
    BH_MAP(BTN_7,       "BTN_7"),
    BH_MAP(BTN_8,       "BTN_8"),
    BH_MAP(BTN_9,       "BTN_9"),
    BH_MAP(KEY_POWER,   "power"),
    BH_MAP(KEY_RESTART, "reset"),
    BH_MAP(KEY_RFKILL,  "rfkill"),
    BH_MAP(KEY_WPS_BUTTON,  "wps"),
    BH_MAP(KEY_WIMAX,   "wwan"),
};
4.改源码,添按键

源码路径:
~/barrier_breaker/target/linux/ar71xx/files/arch/mips/ath79/mach-gl-inet.c
(每种机器内容都不太一样,有的还会写上内核分区)

mach-gl-inet.c,选gpio22作按键用,配置文件为power,模仿reset来写:

#define GL_INET_GPIO_LED_WLAN       0
#define GL_INET_GPIO_LED_LAN        13
#define GL_INET_GPIO_BTN_RESET      11

#define GL_INET_GPIO_BTN_POWER      22 /* DIY */

#define GL_INET_KEYS_POLL_INTERVAL  20  /* msecs */
#define GL_INET_KEYS_DEBOUNCE_INTERVAL  (3 * GL_INET_KEYS_POLL_INTERVAL)
static struct gpio_keys_button gl_inet_gpio_keys[] __initdata = {
    {
        .desc = "reset",
        .type = EV_KEY,
        .code = KEY_RESTART,
        .debounce_interval = GL_INET_KEYS_DEBOUNCE_INTERVAL,
        .gpio = GL_INET_GPIO_BTN_RESET,
        .active_low = 0,
    }, {
        .desc = "power", 
        .type = EV_KEY,
        .code = KEY_POWER,
        .debounce_interval = GL_INET_KEYS_DEBOUNCE_INTERVAL,
        .gpio = GL_INET_GPIO_BTN_POWER,
        .active_low = 0,
    }
};
5.make menuconfig && make V=99

base system->procd
kernel modules->other modules->kmod-button-hotplug
kernel modules->other modules->kmod-gpio-button-hotplug

6.问题

使用*sysupgrade.bin升级系统,并未发现新功能;
解决:
1.如果机器性能不错且其它改动较多,可以来个make clean,或者删掉build_dir目录,再重新编译一次;
2.系统改动少且机器性能不佳(编译速度慢),可以将build_dir目录下对应的
mach-gl-inet.c删掉,再重新编译时,系统会重新复制并读取~/barrier_breaker/target/linux/ar71xx/files/arch/mips/ath79/mach-gl-inet.c。

7.测试指南

http://wiki.openwrt.org/doc/hardware/port.gpio?s[]=button&s[]=gpio

这里写图片描述
函数中有这么一段:

static struct gpio_keys_button gl_inet_gpio_keys[] __initdata = {
    {
        ......
        .active_low = 0, /*高电平触发*/
    }, 

默认为低电平,触发为高电平,用active high电路。
(有些机器此处不一样)

鸣谢~

http://www.mamicode.com/info-detail-424452.html
OpenWRT中的按键和灯的GPIO控制实现(关键)
http://wiki.openwrt.org/doc/howto/hardware.button
Attach functions to a push button
http://wiki.openwrt.org/doc/hardware/port.gpio?s[]=button&s[]=gpio
GPIO

openwrt-RG100A-DB120 按钮 LED完美 网络收音机 网络摄像头 dreambox版: dreambox-RG100A_DB120.bin openwrt标准版: openwrt-RG100A_DB120-squashfs.bin 2012-2-5 添加按键脚本,控制mplayer换台 DB120在终端下运行mplayer,按wlan 0-1秒为 暂停,2-5秒为下一首或换台,按住6秒以上关闭mplayer DB120 WLAN键控制mplayer示例 /etc/config/system添加如下内容 config 'button' option 'button' 'BTN_1' option 'action' 'released' option 'handler' 'echo pause > /tmp/fifofile' option 'min' '0' option 'max' '1' config 'button' option 'button' 'BTN_1' option 'action' 'released' option 'handler' 'echo pt_step 1 > /tmp/fifofile' option 'min' '2' option 'max' '5' config 'button' option 'button' 'BTN_1' option 'action' 'released' option 'handler' 'echo quit > /tmp/fifofile' option 'min' '6' option 'max' '10' RG100A请修改/etc/config/system,把BTN_1改成BTN_2或BTN_3 BTN_0 RESET(DB120,RG100A均有效) BTN_1 DB120:WLAN BTN_2 WPS(DB120,RG100A均有效) BTN_3 RG100A:WLAN /usr/share/mplayer/playlist为网络电台地址或播放列表 好像比难懂,不清楚的请移步openwrt wiki 下周开始上班,不再折腾了,更新到此为止 http://115.com/file/dp2xpvc4# openwrt-RG100A_DB120-squashfs.bin 基于官方 OpenWrt Backfire 10.03.1 编译而成 刷了很多固件不是无线客户端不能用,就是N2N不能用,要不就是摄像头有问题 总是不能完美,只能自己动手,丰衣足食,所以集成的软件都是我自己要用的, 另外塞了个别人编译好的mplayer在/usr/bin 下面,因为mplayer有近3M,所以固件有点大 power和internet为双色LED,触发用time, 调整红色和绿色分量,可以显示绿色,橙色,红色等, 美中不足的是红灯太亮了,绿灯太弱,有条件的换下LED限流电阻 3个按钮定义 BTN_0 RESET 按住8秒后放开,系统复位 BTN_1 WLAN 无线开关 BTN_2 WPS umount 以后不要手贱,随便捅菊花了,你懂的 基本完美了,发挥你的想象吧 网盘附件 DB120-WG-squashfs.binhttp://115.com/file/be4t921t# 集成软件列表: 软件包名称 版本 alsa-lib 1.0.24.1-1 alsa-utils 1.0.24.2-1 base-files 43.32-r29685 block-mount 0.1.0-2.2 bridge 1.4-1 busybox 1.15.3-3.4 bzip2 1.0.6-1 crda 1.1.1-1 dnsmasq 2.55-6.1 dropbear 0.53.1-5 firewall 2-34.8 gpioctl 1.0-1 hd-idle 1.03-1 hotplug2 1.0-beta-3 iptables 1.4.6-3.1 iptables-mod-conntrack 1.4.6-3.1 iptables-mod-conntrack-extra 1.4.6-3.1 iptables-mod-filter 1.4.6-3.1 iptables-mod-imq 1.4.6-3.1 iptables-mod-ipopt 1.4.6-3.1 iptables-mod-nat 1.4.6-3.1 iw 0.9.22-2 kernel 2.6.32.27-1 kmod-b43 2.6.32.27+2011-12-01-1 kmod-button-hotplug 2.6.32.27-1 kmod-cfg80211 2.6.32.27+2011-12-01-1 kmod-crc-ccitt 2.6.32.27-1 kmod-crypto-aes 2.6.32.27-1 kmod-crypto-arc4 2.6.32.27-1 kmod-crypto-core 2.6.32.27-1 kmod-fs-ext2 2.6.32.27-1 kmod-fs-ext3 2.6.32.27-1 kmod-fuse 2.6.32.27-1 kmod-i2c-core 2.6.32.27-1 kmod-input-core 2.6.32.27-1 kmod-input-gpio-buttons 2.6.32.27-1 kmod-input-polldev 2.6.32.27-1 kmod-ipt-conntrack 2.6.32.27-1 kmod-ipt-conntrack-extra 2.6.32.27-1 kmod-ipt-core 2.6.32.27-1 kmod-ipt-filter 2.6.32.27-1 kmod-ipt-imq 2.6.32.27-1 kmod-ipt-ipopt 2.6.32.27-1 kmod-ipt-nat 2.6.32.27-1 kmod-mac80211 2.6.32.27+2011-12-01-1 kmod-nls-cp437 2.6.32.27-1 kmod-nls-iso8859-1 2.6.32.27-1 kmod-nls-utf8 2.6.32.27-1 kmod-ppp 2.6.32.27-1 kmod-sched 2.6.32.27-1 kmod-scsi-core 2.6.32.27-1 kmod-sound-core 2.6.32.27-1 kmod-switch 2.6.32.27-4 kmod-textsearch 2.6.32.27-1 kmod-tun 2.6.32.27-1 kmod-usb-audio 2.6.32.27-1 kmod-usb-core 2.6.32.27-1 kmod-usb-ohci 2.6.32.27-1 kmod-usb-printer 2.6.32.27-1 kmod-usb-storage 2.6.32.27-1 kmod-usb-uhci 2.6.32.27-1 kmod-usb2 2.6.32.27-1 kmod-video-core 2.6.32.27-1 kmod-video-uvc 2.6.32.27-1 kmod-zd1211rw 2.6.32.27+2011-12-01-1 lame-lib 398-2-3 libao 1.1.0-1 libc 0.9.30.1-43.32 libevent 1.4.14b-1 libfaad2 2.7-1 libffmpeg 0.5.4-2 libfuse 2.8.3-1 libgcc 4.3.3+cs-43.32 libgsm 1.0.13-1 libiconv 5 libiconv-full 1.11.1-1 libid3tag 0.15.1b-3 libip4tc 1.4.6-3.1 libiwinfo 18 libiwinfo-lua 18 libjpeg 6b-1 libltdl 2.4-1 liblua 5.1.4-7 liblzo 2.04-1 libmad 0.15.1b-3 libncurses 5.7-2 libnl-tiny 0.1-1 libogg 1.1.4-2 libopenssl 0.9.8s-1 libpthread 0.9.30.1-43.32 librrd1 1.0.50-1 librt 0.9.30.1-43.32 libsamplerate 0.1.7-1 libsndfile 1.0.21-1 libuci 12012009.7-4 libuci-lua 12012009.7-4 libusb-1.0 1.0.8-1 libv4l 0.6.1-1 libvorbis 1.2.3-1 libvorbisidec 1.0.2+svn14261-1 libxtables 1.4.6-3.1 lua 5.1.4-7 luci 0.10.0-1 luci-app-firewall 0.10.0-1 luci-app-hd-idle 0.10.0-1 luci-app-ntpc 0.10.0-1 luci-app-qos 0.10.0-1 luci-app-samba 0.10.0-1 luci-app-voice-core 0.10.0-1 luci-i18n-chinese 0.10.0-1 luci-i18n-english 0.10.0-1 luci-lib-core 0.10.0-1 luci-lib-ipkg 0.10.0-1 luci-lib-lmo 0.10.0-1 luci-lib-lucid 0.10.0-1 luci-lib-lucid-http 0.10.0-1 luci-lib-nixio 0.10.0-1 luci-lib-px5g 0.10.0-1 luci-lib-sys 0.10.0-1 luci-lib-web 0.10.0-1 luci-mod-admin-core 0.10.0-1 luci-mod-admin-full 0.10.0-1 luci-proto-core 0.10.0-1 luci-proto-ppp 0.10.0-1 luci-sgi-cgi 0.10.0-1 luci-theme-base 0.10.0-1 luci-theme-openwrt 0.10.0-1 mjpg-streamer r136-1 motion 3.2.11.1-1 mtd 13 mutt 1.5.21-1 n2n 3875-1 ntfs-3g 2011.4.12-1-fuseext ntpclient 2007_365-4 openssl-util 0.9.8s-1 opkg 576-2 qos-scripts 1.2.1-3.2 resolveip 1 samba3 3.0.24-8 screen 4.0.3-2 sox 14.0.1-3 ssmtp 2.64-3 tc 2.6.29-1-2 uci 12012009.7-4 udevtrigger 106-1 uhttpd 28 usbutils 003-1 wireless-tools 29-4 wpad-mini 20111103-2 zlib 1.2.3-5
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值