* [[#​Hotplug.Buttons|Hotplug buttons]], using the hotplug daemon or procd in compatibility mode (hotplug itself was 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. |

-

===== 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:

+

-

<​code>​

+

===== procd buttons =====

-

$include ​/etc/hotplug2-common.rules

+

native button handling in procd is handled by scripts in '''​/etc/rc.button/​*'''​

These scripts receive the **same** environment as older style hotplug buttons received. ​ However, the script files have to be named after the button. I am unaware of a way of getting the button name. (Other than using hotplug ​compatible scripts with procd ;)

-

exec /sbin/hotplug-call %SUBSYSTEM%

+

-

}

+

-

DEVICENAME == watchdog {

-

exec /​sbin/​watchdog -t 5 /​dev/​watchdog

-

next-event

-

}

-

</​code>​

-

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:

+

===== Hotplug Buttons =====

+

| {{:​meta:​icons:​tango:​48px-outdated.svg.png?​nolink}} | Note that after the introduction ​of **''​[[doc:​techref:​procd]]''​** into OpenWrt in [[https://​dev.openwrt.org/​changeset/​37132|r37132]] the package ​''​hotplug2'' ​has been removed from the default packages. ​However at the time of writing, [[https://​dev.openwrt.org/​changeset/​37336|r37336:​ procd: make old button hotplug rules work until all packages are migrated]] is still in effect. ​ See also [[#​procd.buttons]] |

+

| 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 ​ |

-

<​code>​

+

==== Preliminary steps ====

+

+

The first 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:​

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 49:

Line 45:

''​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:

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

-

. /etc/​functions.sh

+

. /lib/​functions.sh

do_button () {

do_button () {

local button

local button

Line 85:

Line 90:

config_foreach do_button button

config_foreach do_button button

</​code>​

</​code>​

+

+

Please note that after r34793 /​etc/​functions.sh -> /​lib/​functions.sh so if you are using an old version change it!

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 100:

Line 107:

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 114:

Line 121:

**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 131:

Line 138:

**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 142:

Line 149:

**Example 4:** //Restore defaults//

**Example 4:** //Restore defaults//

-

<​code>​

+

<​code ​bash>

config button

config button

option button ​ reset

option button ​ reset

Line 152:

Line 159:

**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 162:

Line 169:

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 172:

Line 179:

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.

* 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>​