Я нашел намного лучшее решение, чем мой предыдущий ответ. Я оставляю свой предыдущий ответ как пост, так как это рабочее решение (хотя это не самое идеальное решение).
В любом случае, вам нужно создать (или изменить) файл раскладки . Чтобы этот файл раскладки клавиш регистрировался на определенном устройстве, имя файла раскладки клавиш должно соответствовать определенному соглашению об именах, соответствующему сведениям об устройстве, которое вы хотите использовать ( gpio- ключи в моем случае). Подробнее об этом здесь: https://source.android.com/devices/input/key-layout-files. В моем случае я решил, что мое расположение клавиш имя файла должно совпадать с именем устройства. Имя устройства в моем случае было gpio-keys , которое вы определяете в файле наложения дерева устройств. Вы также можете найти имя устройства, если у вас есть доступ к локальному терминалу Android, введя в командной строке cat /proc/bus/input/devices
. Фрагмент моего файла оверлея gpio-keys показан ниже:
fragment@1 {
target-path = "/";
__overlay__ {
keypad: gpio-keys {
compatible = "gpio-keys";
#address-cells = <1>;
#size-cells = <0>;
key: proximity {
label = "proximity-detection";
linux,code = <29>; // KEY_LEFTCTRL
linux,input-type = <1>; // EV_KEY
gpios = <&gpio 17 0>; // GPIO 17
wakeup-source;
};
};
};
};
Как вы можете видеть выше рядом с клавиатурой: , имя устройства gpio-keys установлено. Вы можете написать и другие имена здесь. Поэтому я назвал свой файл раскладки ключей gpio-keys.kl . Я поместил свой файл gpio-keys.kl в каталог / system / usr / keylayout / в Android. Файл gpio-keys.kl показан ниже:
# Key layout used for gpio-keys
key 29 CTRL_LEFT WAKE
Поскольку мой gpio-ключ ( GPIO17 ) привязан к Linux keycode 29 или KEY_LEFTCTRL , мой файл компоновки ключей связан с код Linux 29 (или KEY_LEFTCTRL ) с соответствующим кодом Android-клавиатуры CTRL_LEFT . Затем я добавляю термин WAKE в той же строке, как показано выше. Коды клавиш Linux и соответствующие им коды клавиш Android можно найти здесь: https://source.android.com/devices/input/keyboard-devices.
Это позволяет моему экрану проснуться, когда GPIO17 получает прерывание по желанию. Это лучшее решение, чем просто использование ключевого кода Linux для WAKEUP , так как вы можете захотеть написать приложение для Android, где у вас есть несколько различных gpio-keys , которые вы хотите обрабатывать по-разному. Если каждый gpio-ключ привязан к отдельному коду, вы сможете отличить их друг от друга. Если бы они все имели один и тот же код ключа, я думаю, что различить эти разные ключи было бы гораздо сложнее.