路由器配备的实体按钮太少了,还好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,
当前使用情况:
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