Application launching with GPIO trigger on Android

You must install the Android release V2.9(C2)/V4.5(XU4) or higher to launch app via GPIO.
In that case you can skip step 1 ~ 7 for your easier life LOL

If you installed higher version of the Android Marshmallow version v2.9, Please do just step 3 and 4, and skip to 7
Please check the revision of PCB. This page is based on the board revision 0.2.(C2)

This page explains how to launch an app via GPIO input.
All of software stuff(Step 1 to 7) was included from Android image Ver2.9 to Ver3.4 and Marshmallow Ver2.4 released.

1. Enable the GPIO key driver as a built-in.

...
CONFIG_KEYBOARD_GPIO_POLLED=y
...

2. Add gpio key mapping to device tree blob.

ODROID-C2
(path: arch/arm64/boot/dts/meson64_odroidc2.dts)
GPIO Pin description
commit

gpio_keys_polled {
   status = "disabled";
   compatible =
    "gpio-keys-polled";
   #address-cells = <1>;
   #size-cells = <0>;
   poll-interval = <100>;
   autorepeat;
   button@1 {
    label = "GPIO Key F7";
    linux,code = <65>;
    gpios = <&gpio GPIOX_19 1>;
   };
   button@2 {
    label = "GPIO Key F8";
    linux,code = <66>;
    gpios = <&gpio GPIOX_11 1>;
   };
   button@3 {
    label = "GPIO Key F9";
    linux,code = <67>;
    gpios = <&gpio GPIOX_9 1>;
   };
   button@4 {
    label = "GPIO Key F10";
    linux,code = <68>;
    gpios = <&gpio GPIOX_7 1>;
   };
 };


ODROID-XU3/XU4
(path: arch/arm/boot/dts/exynos5422-odroidxu3.dts)
GPIO Pin description
Shift shield GPIO map
commit1
commit2

gpio_keys_polled {
   status = "disabled";
   compatible =
    "gpio-keys-polled";
   #address-cells = <1>;
   #size-cells = <0>;
   poll-interval = <100>;
   autorepeat;
   button@1 {
    label = "GPIO Key F7";
    linux,code = <65>;
    gpios = <&gpx1 2 0xf>;
   };
   button@2 {
    label = "GPIO Key F8";
    linux,code = <66>;
    gpios = <&gpx1 5 0xf>;
   };
   button@3 {
    label = "GPIO Key F9";
    linux,code = <67>;
    gpios = <&gpx1 6 0xf>;
   };
   button@4 {
    label = "GPIO Key F10";
    linux,code = <68>;
    gpios = <&gpx1 3 0xf>;
   };
 };

3. Enable GPIO Key map.

gpio_keys_polled {
   status = "okay";
   .
   .
};

4. Build the kernel source. and flash the kernel image to the board.(C2)

$ cd kernel
$ export ARCH=arm64
$ export CROSS_COMPILE=aarch64-linux-gnu-
$ make odroidc2_i2c_defconfig  #(or make odroidc2_defconfig)
$ make -j8
$ adb reboot fastboot
$ fastboot flash dtb arch/arm64/boot/dts/meson64_odroidc2.dtb
$ fastboot flash boot arch/arm64/boot/uImage
$ fastboot reboot

5. Add key event keycode to system/usr/keylayout/Vendor_0001_Product_0001.kl file.
You can find keycode table from reference
ODROID-C2
commit
ODROID-XU3/XU4
commit

...
key 65 F7
key 66 F8
key 67 F9
key 68 F10
...

6. Apply the patch that intercept key event to frameworks/base & ODROID Utility App.
ODROID-C2
frameworks/base commit
ODROID Utility commit
ODROID-XU3/XU4
frameworks/base commit
ODROID Utility commit
7. Build the Android image and flash it.
ODROID-C2 build method ODROID-XU3/4 install method

$ cd <PATH_TO_ANDROID_ROOT>
$ cd out/target/product/odroidc2/
$ adb reboot fastboot
$ fastboot flash system rootsystem.img
$ fastboot reboot



8. Connect a few buttons to the GPIOs with 10KOhm pull-up resistors. Click images to enlarge it.

ODROID-C2

ODROID-XU3/XU4

9. Set the launch app by using ODROID Utility app.