1. 程式人生 > >OpenWRT新增物理按鍵(procd,ar71xx)

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
[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新增物理按鍵procdar71xx

路由器配備的實體按鈕太少了,還好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的物理外來鍵CONSTRAINTREFERENCES

背景 用django自帶的admin和auth搭建了內部網站,使用了django的使用者和許可權分組系統,但是在移到生產環境時發現公司把REFERENCES這種命令禁止了,DBA說影響效能不給開許可權,所以不得不嘗試把外來鍵從db層移到應用層。 第一次嘗

Listview給item新增動畫效果位移漸變旋轉等

Listview佈局檔案加入動畫屬性: android:layoutAnimation=”@anim/listviewtranslate2” <ListView

Python可迭代物件中的新增和刪除addappend,pop,remove,insert

 學習python的list,tuple,dict,set的時候被插入和刪除的用法弄得有點暈,所以進行歸納,以便記憶 對於List: classmates = ['Michael', 'Bob', 'Tracy'] classmates.append('Adam')

文件讀取草稿excelcsv

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

歸並排序&&逆序對codves16884163

如果 排序 範圍 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經典gcdab=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:容器/集合MapHashMapTreeMap

常用 接口 blog ava keyset 常用方法 system entryset 方法 HashMap: *Map接口:采用是鍵值對的方式存放數據。無序 *常見的實現類: *--HashMap:基於哈希表的 Map 接口的實現。 *常用的構造方法: * HashMap(

js 通過瀏覽器直接打開應用程序IOSAndroid並判斷瀏覽器內核

agent rtt 程序 javascrip ref java lock roi col 本功能主要用於手機端,如果手機未安裝該APP,則跳轉至下載頁面;否則,直接打開手機中的APP。 <div style="position:absolute; top:84%;

js源碼 模仿 jquery的ajax的獲取數據getpost 的請求封裝

{} 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壓縮解壓縮unziptar

哪些 family top -s dir 處理 根目錄 cti font unzip tar 常用解壓縮命令: tar -zxvpf:解壓縮 tar -zcvpf: 壓縮