User Tools

Site Tools


doc:howto:hardware.button

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
doc:howto:hardware.button [2013/01/17 20:02]
veoxwmt
doc:howto:hardware.button [2014/07/06 12:49] (current)
theoradicus del redundancy
Line 1: Line 1:
-====== Attach functions to the hardware ​button ====== +====== Attach functions to a push button ====== 
-FIXME part of this article is not done.+There several ways for controlling buttons in OpenWrt. 
 +  * buttons using procd 
 +  * [[#​Hotplug.Buttons|Hotplug buttons]], using the hotplug daemon (phased out with r36003). 
 +  * [[#​HID.buttons|HID buttons]], using ///​dev/​input/​event//​ with an application like triggerhappy.
  
-  * Check the article [[doc/​howto/​wifitoggle]]. If you want, you can rewrite this. 
-  * Some more inspiration:​ [[/​toh/​tp-link/​tl-wr741nd#​buttons]] TODO 
-  * [[toh/​linksys/​nslu2/​nslu2.hardware.button]] for the NSLU2 
  
  
-====== Configuring ​buttons ​======+| {{:​meta:​icons:​tango:​dialog-information.png?​nolink}} | **Kernel configuration**\\ If a target platform is known to support ​buttons, appropriate kernel modules are selected by default.\\ If a platform is not known to support buttons, you are required to install various kernel modules yourself such as ''​diag'',​ ''​input-gpio-buttons'',​ ''​gpio-button-hotplug'',​ and others.\\ However, installing various modules will not necessarily yield a successful result. |
  
-===== Kernel configuration ===== 
  
-Depending on platform, kernel modules ​''​input-gpio-buttons'' ​and ''​gpio-button-hotplug'' ​might be required.+===== Hotplug Buttons ===== 
 +|  {{:​meta:​icons:​tango:​48px-outdated.svg.png?​nolink}} | Please note the introduction of **''​[[doc:​techref:​procd]]''​** into OpenWrt; In [[https://​dev.openwrt.org/​changeset/​37132|r37132]] the package ​''​hotplug2'' ​was removed from the default packages; this howto may need to be updated.\\ [[https://​dev.openwrt.org/​changeset/​37336|r37336:​ procd: make old button hotplug rules work until all packages are migrated]] | 
 +| FIXME | Please read the articles [[doc/​howto/​wifitoggle]],​ [[/​toh/​tp-link/​tl-wr741nd#​buttons]] and [[toh/​linksys/​nslu2/​nslu2.hardware.button]] and eventually merge them into this one article ​ |
  
-===== Preliminary steps =====+==== Preliminary steps ====
 The first step is to make Hotplug execute scripts in /​etc/​hotplug.d/​button when a button is clicked. Modify /​etc/​hotplug2.rules --- remove '​^'​ before '​button'​ as follow: The first step is to make Hotplug execute scripts in /​etc/​hotplug.d/​button when a button is clicked. Modify /​etc/​hotplug2.rules --- remove '​^'​ before '​button'​ as follow:
  
-<​code>​+<​code ​bash>
 $include /​etc/​hotplug2-common.rules $include /​etc/​hotplug2-common.rules
  
Line 31: Line 32:
 The second step is to find out the internal name of the button you want to use: some images use generic names such as ''​BTN_1'',​ ''​BTN_2'',​ others have more specific ones like ''​reset'',​ ''​wps'',​ etc. Run the following: The second step is to find out the internal name of the button you want to use: some images use generic names such as ''​BTN_1'',​ ''​BTN_2'',​ others have more specific ones like ''​reset'',​ ''​wps'',​ etc. Run the following:
  
-<​code>​+<​code ​bash>
 # mkdir -p /​etc/​hotplug.d/​button # mkdir -p /​etc/​hotplug.d/​button
 </​code>​ </​code>​
Line 37: Line 38:
 Create the file ''/​etc/​hotplug.d/​button/​buttons''​ with your favorite text editor, paste the following: Create the file ''/​etc/​hotplug.d/​button/​buttons''​ with your favorite text editor, paste the following:
  
-<​code>​+<​code ​bash>
 #!/bin/sh #!/bin/sh
 logger $BUTTON logger $BUTTON
Line 45: Line 46:
 Save and exit. Now press the button you want to use, then run ''​logread''​. Save and exit. Now press the button you want to use, then run ''​logread''​.
  
-<​code>​+<​code ​bash>
 Jan 1 00:01:15 OpenWrt user.notice root: BTN_1    Jan 1 00:01:15 OpenWrt user.notice root: BTN_1   
 Jan 1 00:01:15 OpenWrt user.notice root: pressed ​   Jan 1 00:01:15 OpenWrt user.notice root: pressed ​  
Line 54: Line 55:
 ''​BTN_1''​ is the name of the button you want to use. If you want or need to use another button, replace every instance of ''​BTN_1''​ in the rest of this document with the correct text. From now on, there are several possible approaches: the first uses the ''​00-button''​ script from the ''​atheros''​ target, the other a simpler shell script. ''​BTN_1''​ is the name of the button you want to use. If you want or need to use another button, replace every instance of ''​BTN_1''​ in the rest of this document with the correct text. From now on, there are several possible approaches: the first uses the ''​00-button''​ script from the ''​atheros''​ target, the other a simpler shell script.
  
-===== Using Atheros'​ 00-button + UCI =====+**notice** 
 + 
 +If you want to run programs from hotplug'​s scripts you need to be sure ''​PATH''​ and the like are initialized properly, scripts invoked by hotplug only have a default env. Especially if you install stuff into nonstandard locations like /​opt/​usr/​bin. It's possible by adding ''​. /​etc/​profile''​ after ''#​!/​bin/​sh''​ 
 + 
 +<code bash> 
 +#!/bin/sh 
 +. /​etc/​profile 
 +</​code>​ 
 + 
 +==== Using Atheros'​ 00-button + UCI ====
 If you've installed the full version of ''​wget'',​ run the following: If you've installed the full version of ''​wget'',​ run the following:
  
-<​code>​ +<​code ​bash
-# wget -O /​etc/​hotplug.d/​button/​00-button https://​dev.openwrt.org/​browser/​trunk/​target/​linux/​atheros/​base-files/​etc/​hotplug.d/​button/​00-button ​+# wget -O /​etc/​hotplug.d/​button/​00-button https://​dev.openwrt.org/​export/​36332/​trunk/​target/​linux/​atheros/​base-files/​etc/​hotplug.d/​button/​00-button
 </​code>​ </​code>​
  
 If you only have ''​wget-nossl''​ and don't want to or can't upgrade, create ''/​etc/​hotplug.d/​button/​00-button''​ with your favorite editor, then paste the following: If you only have ''​wget-nossl''​ and don't want to or can't upgrade, create ''/​etc/​hotplug.d/​button/​00-button''​ with your favorite editor, then paste the following:
  
-<​code>​+<​code ​bash>
 #!/bin/sh #!/bin/sh
 . /​lib/​functions.sh . /​lib/​functions.sh
Line 95: Line 105:
 Save and exit, then issue these commands: Save and exit, then issue these commands:
  
-<​code>​+<​code ​bash>
 uci add system button ​   ​ uci add system button ​   ​
 uci set system.@button[-1].button=BTN_1 uci set system.@button[-1].button=BTN_1
Line 107: Line 117:
 You may need to reboot the router the make the change effective (mine would work with the simple shell script just fine but wouldn'​t budge when using the 00-button script --- //Frex 2011/03/25 22:29//). If this works, you can change the handler to something more useful, and add more button handlers. You may need to reboot the router the make the change effective (mine would work with the simple shell script just fine but wouldn'​t budge when using the 00-button script --- //Frex 2011/03/25 22:29//). If this works, you can change the handler to something more useful, and add more button handlers.
  
-==== Examples ​====+=== Examples ===
  
 **Example 1:** //Toggle Wi-Fi radio with a button press// **Example 1:** //Toggle Wi-Fi radio with a button press//
  
-<​code>​+<​code ​bash>
 uci add system button ​   ​ uci add system button ​   ​
 uci set system.@button[-1].button=wps ​   ​ uci set system.@button[-1].button=wps ​   ​
Line 121: Line 131:
 **Example 2:** //Assign two different functions to the same button: short press VS long press. This relies on tracking the //​released//​ event rather than the //pressed// event.// **Example 2:** //Assign two different functions to the same button: short press VS long press. This relies on tracking the //​released//​ event rather than the //pressed// event.//
  
-<​code>​+<​code ​bash>
 uci add system button uci add system button
 uci set system.@button[-1].button=BTN_1 uci set system.@button[-1].button=BTN_1
Line 138: Line 148:
  
 **Example 3:** //Unmount USB storage using a long-ish press// **Example 3:** //Unmount USB storage using a long-ish press//
-<​code>​+<​code ​bash>
 uci add system button uci add system button
 uci set system.@button[-1].button=BTN_1 uci set system.@button[-1].button=BTN_1
Line 149: Line 159:
  
 **Example 4:** //Restore defaults// **Example 4:** //Restore defaults//
-<​code>​+<​code ​bash>
 config button config button
         option button ​  reset         option button ​  reset
Line 159: Line 169:
  
 **Example 5:** //Toggle Wi-Fi using a script// **Example 5:** //Toggle Wi-Fi using a script//
-<​code>​+<​code ​bash>
 config button config button
         option button ​  wps         option button ​  wps
Line 169: Line 179:
  
 You'll have to create the file ''/​usr/​bin/​wifionoff''​ and paste this: You'll have to create the file ''/​usr/​bin/​wifionoff''​ and paste this:
-<​code>​+<​code ​bash>
 #!/bin/sh #!/bin/sh
 SW=$(uci -q get wireless.@wifi-device[0].disabled) SW=$(uci -q get wireless.@wifi-device[0].disabled)
Line 179: Line 189:
 Another option for wifionoff is this script (doesn'​t store the state in uci, so it remains what is set in the configuration) Another option for wifionoff is this script (doesn'​t store the state in uci, so it remains what is set in the configuration)
 You can also call this script eg. from cron, to switch off your wifi at night. You can also call this script eg. from cron, to switch off your wifi at night.
-<​code>​+<​code ​bash>
 #!/bin/sh #!/bin/sh
 STATEFILE="/​tmp/​wifionoff.state"​ STATEFILE="/​tmp/​wifionoff.state"​
Line 217: Line 227:
  
 Edit your alt-speed limits from transmission-daemon , //​settings.json//​ file.To execute script, you need to install //​transmission-remote//​ package from opkg. Edit your alt-speed limits from transmission-daemon , //​settings.json//​ file.To execute script, you need to install //​transmission-remote//​ package from opkg.
-<​code>​+<​code ​bash>
 uci add system button ​   ​ uci add system button ​   ​
 uci set system.@button[-1].button=BTN_1 uci set system.@button[-1].button=BTN_1
Line 241: Line 251:
 </​code>​ </​code>​
  
-=====Leftovers from a previous version=====+==== Leftovers from a previous version ====
  
 FIXME FIXME
  
-<​code>​+<​code ​bash>
 mkdir -p /​etc/​hotplug.d/​button mkdir -p /​etc/​hotplug.d/​button
 touch /​etc/​hotplug.d/​button/​00-button touch /​etc/​hotplug.d/​button/​00-button
 </​code>​ </​code>​
  
-<​code>​+<​code ​bash>
 if [ "​$ACTION"​ = "​pressed"​ ]; then if [ "​$ACTION"​ = "​pressed"​ ]; then
     if [ "​$BUTTON"​ = "​BTN_0"​ ]; then BTN_0     if [ "​$BUTTON"​ = "​BTN_0"​ ]; then BTN_0
Line 258: Line 268:
 </​code>​ </​code>​
  
-<​code>​+<​code ​bash>
 mkdir -p /​etc/​hotplug.d/​button mkdir -p /​etc/​hotplug.d/​button
 wget -O /​etc/​hotplug.d/​button/​00-button http://​dev.openwrt.org/​export/​21216/​trunk/​target/​linux/​atheros/​base-files/​etc/​hotplug.d/​button/​00-button ​ wget -O /​etc/​hotplug.d/​button/​00-button http://​dev.openwrt.org/​export/​21216/​trunk/​target/​linux/​atheros/​base-files/​etc/​hotplug.d/​button/​00-button ​
Line 264: Line 274:
 </​code>​ </​code>​
  
-<​code>​+<​code ​bash>
 #!/bin/sh #!/bin/sh
 [ "​$BUTTON"​ = "​BTN_1"​ ] && [ "​$ACTION"​ = "​pressed"​ ] && { [ "​$BUTTON"​ = "​BTN_1"​ ] && [ "​$ACTION"​ = "​pressed"​ ] && {
Line 274: Line 284:
 </​code>​ </​code>​
  
-===== WR1043ND ​=====+==== WR1043ND ====
 If you decide to use the ''​wifitoggle''​ package, you will need to change a few things on the default configuration. The following will work and make the QSS led blink "​slowly"​ when wifi is on: If you decide to use the ''​wifitoggle''​ package, you will need to change a few things on the default configuration. The following will work and make the QSS led blink "​slowly"​ when wifi is on:
  
-<​code>​+<​code ​bash>
 uci show wifitoggle uci show wifitoggle
 uci set wifitoggle.@wifitoggle[0]=wifitoggle uci set wifitoggle.@wifitoggle[0]=wifitoggle
Line 291: Line 301:
  
 :!: //You can probably get similar behaviour with [[doc:​uci:​system#​wifi.activity|phy0tpt]] trigger.// :!: //You can probably get similar behaviour with [[doc:​uci:​system#​wifi.activity|phy0tpt]] trigger.//
 +===== HID buttons =====
  
-===== triggerhappy ​===== +==== triggerhappy ==== 
-To manage the router buttons and also other HID buttons (i.e pad buttons of an usb device) we can use an application like triggerhappy. +To manage the router buttons and also other **HID buttons** (i.e pad buttons ​or keys of an usb device) we can use an application like triggerhappy. 
- +=== Installation === 
-First list your available buttons: +  - Install the **triggerhappy** package and the **kmod-hid** kernel module 
-<​code>​thd --dump /​dev/​input/​event*</​code>​ +  - list your available buttons: ​execute<​code ​bash>thd --dump /​dev/​input/​event*</​code>​press your buttons \\ ''​EV_KEY ​ KEY_WPS_BUTTON ​ 1       /​dev/​input/​event0
-press your buttons \\ +
-''​EV_KEY ​ KEY_WPS_BUTTON ​ 1       /​dev/​input/​event0+
 # KEY_WPS_BUTTON ​       1       ​command # KEY_WPS_BUTTON ​       1       ​command
 EV_KEY ​ KEY_WPS_BUTTON ​ 0       /​dev/​input/​event0 EV_KEY ​ KEY_WPS_BUTTON ​ 0       /​dev/​input/​event0
Line 306: Line 315:
 EV_KEY ​ KEY_VOLUMEDOWN ​ 0       /​dev/​input/​event1 EV_KEY ​ KEY_VOLUMEDOWN ​ 0       /​dev/​input/​event1
 # KEY_VOLUMEDOWN ​       0       ​command''​ # KEY_VOLUMEDOWN ​       0       ​command''​
- +  - Now associate your buttons to commands or scripts \\ //path /​etc/​triggerhappy/​triggers.d/​example.conf//​ <​code ​bash>​KEY_WPS_BUTTON 1 /​etc/​mywifiscript.sh
-Now associate your buttons to commands or scripts \\ +
-//path /​etc/​triggerhappy/​triggers.d/​example.conf// ​\\ +
-<​code>​KEY_WPS_BUTTON 1 /​etc/​mywifiscript.sh+
 KEY_VOLUMEUP 1 amixer -q set Speaker 3%+ KEY_VOLUMEUP 1 amixer -q set Speaker 3%+
 KEY_VOLUMEDOWN 1 amixer -q set Speaker 3%-</​code>​ KEY_VOLUMEDOWN 1 amixer -q set Speaker 3%-</​code>​
-and run triggerhappy \\ +  - run triggerhappy \\ <​code ​bash>/​etc/​init.d/​triggerhappy start</​code>​ 
-<​code>/​etc/​init.d/​triggerhappy start</​code>​+  - enable triggerhappy permanently\\ <code bash>/​etc/​init.d/​triggerhappy enable</​code>​ 
 + 
 +==== Notes ==== 
 +  * triggerhappy repeats commands twice: see bug https://​dev.openwrt.org/​ticket/​14995 
 +  * kernel modules: ​ **kmod-hid** and **kmod-hid-generic** both should be installed\\ The kmod-hid-generic kernel module must be installed for buttons on USB devices such as USB sound cards to work in OpenWrt trunk. Only then the /​dev/​input/​event0 node for the buttons was created on the DIR-505 router with attached USB sound card. <​code>​ 
 +[   ​31.720000] input: C-Media USB Headphone Set   as /​devices/​platform/​ehci-platform/​usb1/​1-1/​1-1:​1.3/​input/​input0 
 +[   ​31.760000] hid-generic 0003:​0D8C:​000C.0001:​ input,​hidraw0:​ USB HID v1.00 Device [C-Media USB Headphone Set  ] on usb-ehci-platform-1/​input3 
 +[   ​31.800000] usbcore: registered new interface driver usbhid 
 +[   ​31.800000] usbhid: USB HID core driver 
 +</​code>​This is also noted in https://​dev.openwrt.org/​ticket/​12631
  
-**cmdpad** is another ​simpler application to manage buttons.+==== cmdpad ​==== 
 +Another ​simpler application to manage buttons.
doc/howto/hardware.button.1358449356.txt.bz2 · Last modified: 2013/01/17 20:02 by veoxwmt