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,
當前使用情況:
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
[email protected]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.測試指南
函式中有這麼一段:
static struct gpio_keys_button gl_inet_gpio_keys[] __initdata = {
{
......
.active_low = 0, /*高電平觸發*/
},
預設為低電平,觸發為高電平,用active high電路。
(有些機器此處不一樣)
鳴謝~
相關推薦
OpenWRT新增物理按鍵(procd,ar71xx)
路由器配備的實體按鈕太少了,還好GL-iNet開發板上預留了4個GPIO給使用者,省事多了,現按需要手動新增一個。 思路:通過修改特定位置原始碼新增按鍵觸發操作,並儘量不安裝其他軟體,在原有基礎上做修改(呼叫reset按鍵實現方法)。 相關參考材料: htt
RT5350 openwrt新增Reset按鍵,實現短按重啟系統,長按復位系統
新增Reset按鍵,實現短按重啟系統,長按復位系統 1、檢視目前的gpio cat /sys/kernel/debug/gpio GPIOs 0-21, platform/10000600.gpio, 10000600.gpio: gpio-0 (S1
openwrt 新增4G撥號(qmi驅動)
openwrt版本:15.05 4G模組:SIM7100C 首先配置SIM7100C模組的驅動,及核心配置 https://wiki.openwrt.org/doc/howtobuild/wireless-router-with-a-3g-dongle 這個指南中將所有的選項
unity物理引擎--Join(關節,聯結器)
Joint連結器的功能:字面意思連線接兩個物體 下面介紹幾個常用的Joint: 1.Higne Joint(鉸鏈關節,合葉關節) 鉸鏈關
禁用django的物理外來鍵(CONSTRAINT,REFERENCES)
背景 用django自帶的admin和auth搭建了內部網站,使用了django的使用者和許可權分組系統,但是在移到生產環境時發現公司把REFERENCES這種命令禁止了,DBA說影響效能不給開許可權,所以不得不嘗試把外來鍵從db層移到應用層。 第一次嘗
Listview給item新增動畫效果(位移,漸變,旋轉等)
Listview佈局檔案加入動畫屬性: android:layoutAnimation=”@anim/listviewtranslate2” <ListView
Python可迭代物件中的新增和刪除(add,append,pop,remove,insert)
學習python的list,tuple,dict,set的時候被插入和刪除的用法弄得有點暈,所以進行歸納,以便記憶 對於List: classmates = ['Michael', 'Bob', 'Tracy'] classmates.append('Adam')
文件讀取草稿(excel,csv)
string guid dwr lda clas isn urn datarow arraylist using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using Syst
[51NOD1524] 可除圖的最大團(組合,dp)
鏈接 ble spa 組合 sin ons .html color 出現的次數 題目鏈接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1524 題意:略。 這個題相當於是找出現最長的整除鏈。
information_schema系列八(鎖,事物)
開啟 mysql 獲取 排它 lin tin 查詢 pre join 這個系列的文章主要是為了能夠讓自己了解MySQL5.7的一些系統表,統一做一下備註和使用,也希望分享出來讓大家能夠有一點點的受益。 第八篇主要看一下一下幾系統表: 今天我們主要看一下MySQL inf
歸並排序&&逆序對(codves1688,4163)
如果 排序 範圍 eight 註意 sam def 序列 pad 歸並排序 歸並排序采用的是分治的思想 1、劃分問題:把序列分為元素個數盡量相等的兩半 2、遞歸求解:把兩半分別排序 3、合並問題:把兩個有序的序列合並為一個 對於第三個問題,我們可以從兩個序列中最小的元素開始
[2017浙工大之江學院決賽 L] qwb與整數對(離線,篩)
online con ons print include main amp i++ max 題目鏈接:http://115.231.222.240:8081/JudgeOnline/problem.php?cid=1005&pid=11 這題不會,看了檸檬巨的題解才
CO-PRIME(初探 莫比烏斯)NYOJ1066(經典)gcd(a,b)=1
put size 兩個 test hat ott == clas otto CO-PRIME 時間限制:1000 ms | 內存限制:65535 KB 難度:3 描寫敘述 This problem is so easy! Can you solve it
java:容器/集合(Map(HashMap,TreeMap))
常用 接口 blog ava keyset 常用方法 system entryset 方法 HashMap: *Map接口:采用是鍵值對的方式存放數據。無序 *常見的實現類: *--HashMap:基於哈希表的 Map 接口的實現。 *常用的構造方法: * HashMap(
js 通過瀏覽器直接打開應用程序(IOS,Android)並判斷瀏覽器內核
agent rtt 程序 javascrip ref java lock roi col 本功能主要用於手機端,如果手機未安裝該APP,則跳轉至下載頁面;否則,直接打開手機中的APP。 <div style="position:absolute; top:84%;
js源碼 模仿 jquery的ajax的獲取數據(get,post )的請求封裝
{} req turn eva syn 動作 取字符串 func ring function ajax(obj){ // 默認參數 var defaults = { type : ‘get‘, data : {}, url : ‘#‘, dataType : ‘text‘,
JS面向對象(封裝,繼承)
通過 ray 混合 字母 顯示 彈出 pan rip http 在六月份找工作中,被問的最多的問題就是: js面向對象,繼承,封裝,原型鏈這些,你了解多少? 額,,,我怎麽回答呢, 只能說,了解一些,不多不少,哈哈哈哈,當然,這是玩笑話。 不過之前學過java,來理解這些還
HDU 1308 What Day Is It?(模擬,日期)
else 天數 pre names 一點 val return can 星期幾 解題報告:輸入一個年月日,讓你求出那一天是星期幾,但是做這題之前必須先了解一點歷史。首先在1582年之前,判斷是否是閏年的標準是只要能被四整除就是閏年, 然後在1752年9月2號的後的11天被
獲取應用程序根目錄物理路徑(Web and Windows)
cto info 環境 上下文 blog tdi 間接 sse ref 這兩個計劃寫一個小類庫,需要在不同項目下任意調用。該類庫需要對磁盤文件進行讀寫,所以就需要獲取程序執行的磁盤路徑,就簡單的對獲取磁盤路徑的方法進行研究。 借助搜索引擎,我從網上搜羅來多種方法,
Linux壓縮解壓縮(unzip,tar)
哪些 family top -s dir 處理 根目錄 cti font unzip tar 常用解壓縮命令: tar -zxvpf:解壓縮 tar -zcvpf: 壓縮