Hi Caleb,

On 7/14/24 9:49 PM, Caleb Connolly wrote:
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.


Are those event codes properly defined in the DT already?

e.g. https://elixir.bootlin.com/linux/latest/source/arch/arm64/boot/dts/rockchip/px30-ringneck-haikou.dts#L31

If so, what prevents us from simply patching the U-Boot DT to change that code? No additional code required anywhere, no need to maintain a list of mapping, etc...

If that isn't possible, .........

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;
+       }
+}
+

....... I suggest to make this a weak function that can be overridden by boards (should it maybe be only defined in boards C file?) so that it's easy for people to come up with their own mapping without having to deal with two people/the maintainer disagreeing with what should be the one and true mapping for that key.

Cheers,
Quentin

Reply via email to