We don't have audio support in U-Boot, but we do have boot menus. Add an option to re-map the volume and power buttons to up/down/enter so that in situations where these are the only available buttons (such as on mobile phones) it's still possible to navigate menus built in U-Boot or an external EFI app like GRUB or systemd-boot.
Signed-off-by: Caleb Connolly <caleb.conno...@linaro.org> --- Cc: u-boot-q...@groups.io --- drivers/button/Kconfig | 11 +++++++++++ drivers/button/button-uclass.c | 22 +++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/drivers/button/Kconfig b/drivers/button/Kconfig index 3918b05ae03e..6cae16fcc8bf 100644 --- a/drivers/button/Kconfig +++ b/drivers/button/Kconfig @@ -8,8 +8,19 @@ config BUTTON U-Boot provides a uclass API to implement this feature. Button drivers can provide access to board-specific buttons. Use of the device tree for configuration is encouraged. +config BUTTON_REMAP_PHONE_KEYS + bool "Remap phone keys for navigation" + depends on BUTTON + help + Enable remapping of phone keys to navigation keys. This is useful for + devices with phone keys that are not used in U-Boot. The phone keys + are remapped to the following navigation keys: + - Volume up: Up + - Volume down: Down + - Power: Enter + config BUTTON_ADC bool "Button adc" depends on BUTTON depends on ADC diff --git a/drivers/button/button-uclass.c b/drivers/button/button-uclass.c index cda243389df3..729983d58701 100644 --- a/drivers/button/button-uclass.c +++ b/drivers/button/button-uclass.c @@ -9,8 +9,9 @@ #include <button.h> #include <dm.h> #include <dm/uclass-internal.h> +#include <dt-bindings/input/linux-event-codes.h> int button_get_by_label(const char *label, struct udevice **devp) { struct udevice *dev; @@ -36,16 +37,35 @@ enum button_state_t button_get_state(struct udevice *dev) return ops->get_state(dev); } +static int button_remap_phone_keys(int code) +{ + switch (code) { + case KEY_VOLUMEUP: + return KEY_UP; + case KEY_VOLUMEDOWN: + return KEY_DOWN; + case KEY_POWER: + return KEY_ENTER; + default: + return code; + } +} + int button_get_code(struct udevice *dev) { struct button_ops *ops = button_get_ops(dev); + int code; if (!ops->get_code) return -ENOSYS; - return ops->get_code(dev); + code = ops->get_code(dev); + if (CONFIG_IS_ENABLED(BUTTON_REMAP_PHONE_KEYS)) + return button_remap_phone_keys(code); + else + return code; } UCLASS_DRIVER(button) = { .id = UCLASS_BUTTON, -- 2.45.2