diff --git a/payloads/libpayload/drivers/i8042/keyboard.c b/payloads/libpayload/drivers/i8042/keyboard.c index 48d35a07f7..f9932ed4ed 100644 --- a/payloads/libpayload/drivers/i8042/keyboard.c +++ b/payloads/libpayload/drivers/i8042/keyboard.c @@ -35,6 +35,7 @@ #include "i8042.h" #define POWER_BUTTON 0x90 +#define MEDIA_KEY_PREFIX 0xE0 struct layout_maps { const char *country; @@ -43,6 +44,7 @@ struct layout_maps { static struct layout_maps *map; static int modifier = 0; +int (*media_key_mapping_callback)(char ch); static struct layout_maps keyboard_layouts[] = { #if CONFIG(LP_PC_KEYBOARD_LAYOUT_US) @@ -230,6 +232,11 @@ int keyboard_getmodifier(void) return modifier; } +void initialize_keyboard_media_key_mapping_callback(int (*media_key_mapper)(char)) +{ + media_key_mapping_callback = media_key_mapper; +} + int keyboard_getchar(void) { unsigned char ch; @@ -239,6 +246,10 @@ int keyboard_getchar(void) while (!keyboard_havechar()) ; ch = keyboard_get_scancode(); + if ((media_key_mapping_callback != NULL) && (ch == MEDIA_KEY_PREFIX)) { + ch = keyboard_get_scancode(); + return media_key_mapping_callback(ch); + } if (!(ch & 0x80) && ch < 0x59) { shift = diff --git a/payloads/libpayload/include/libpayload.h b/payloads/libpayload/include/libpayload.h index 80bfaae6bf..bfe9da5f40 100644 --- a/payloads/libpayload/include/libpayload.h +++ b/payloads/libpayload/include/libpayload.h @@ -187,6 +187,7 @@ unsigned char keyboard_get_scancode(void); int keyboard_getchar(void); int keyboard_set_layout(char *country); int keyboard_getmodifier(void); +void initialize_keyboard_media_key_mapping_callback(int (*media_key_mapper)(char)); enum KEYBOARD_MODIFIERS { KB_MOD_SHIFT = (1 << 0),