Adding buttons on the Linkit Smart
Here’s what I found out while trying to add buttons to the OpenWrt based Linkit Smart.
The flow is:
- Keys are defined in
target/linux/ramips/dts/LINKIT7688.dts
gpio-button-hotplug
emulatesgpio-keys-polled
and generates uevents.- The uevent is received onver netlink by procd in
plug/hotplug.c
The event is dispatched via
/etc/hotplug.json
The standard dispatch rule calls
/etc/rc.buttons/$BUTTON
gpio-keys-polled {
… btn2 { label = “btn2”; gpios = <&gpio0 2 1>; linux,code = <0x102>; };
where the `<&gpio0 2 1>` picks the second pin from the zeroth port i.e. GPIO 2 and maps it to BTN_2. See [`uapi/linux/input.h`][6] for the other key codes. gpio-button-hotplug supports a limited number of keys. See the source for the current list, which is `BTN_0` to `BTN_9`, `power`, `reset`, `rfkill`, `wps`, and `wwan`. Also, the LinkIt uses a binary wifi driver which seems to be _very_ sensitive to the kernel version. I ended up reverting [`363508bcabd8e9205f5fffc8ff282439e61d618f`][7] to bring OpenWrt back to 3.18.21 to stop it crashing when the interface comes up.
- The uevent is received onver netlink by procd in