[SeaBIOS] [PATCH 02/10] kbd: Implement extended keycode mappings for keypad-enter and keypad-/

Kevin O'Connor kevin at koconnor.net
Mon Sep 5 20:36:03 CEST 2016


On a 101-key keyboard the keypad enter and keypad '/' keys have unique
BIOS keycodes that are distinct from the main keyboard enter and '/'
keys.

Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 src/kbd.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/src/kbd.c b/src/kbd.c
index 2e43e71..b7b34ee 100644
--- a/src/kbd.c
+++ b/src/kbd.c
@@ -98,6 +98,14 @@ dequeue_key(struct bregs *regs, int incr, int extended)
         // Translate extended keys
         if (ascii == 0xe0)
             keycode &=0xff00;
+        else if ((keycode & 0xff00) == 0xe000) {
+            if (ascii == 0x2f)
+                // Extended '/' key
+                keycode = 0x352f;
+            else
+                // Extended enter key
+                keycode = 0x1c00 | (keycode & 0x00ff);
+        }
         // Technically, if the ascii value is 0xf0 or if the
         // 'scancode' is greater than 0x84 then the key should be
         // discarded.  However, there seems no harm in passing on the
@@ -385,6 +393,13 @@ static struct scaninfo {
     { 0x8600, 0x8800, 0x8a00, 0x8c00 }, /* F12 */
 };
 
+struct scaninfo key_ext_enter VAR16 = {
+    0xe00d, 0xe00d, 0xe00a, 0xa600
+};
+struct scaninfo key_ext_slash VAR16 = {
+    0xe02f, 0xe02f, 0x9500, 0xa400
+};
+
 // Handle a ps2 style scancode read from the keyboard.
 static void
 __process_key(u8 scancode)
@@ -515,6 +530,8 @@ __process_key(u8 scancode)
         }
         u16 keycode;
         struct scaninfo *info = &scan_to_keycode[scancode];
+        if (flags2 & KF2_LAST_E0 && (scancode == 0x1c || scancode == 0x35))
+            info = (scancode == 0x1c ? &key_ext_enter : &key_ext_slash);
         if (flags0 & KF0_ALTACTIVE) {
             keycode = GET_GLOBAL(info->alt);
         } else if (flags0 & KF0_CTRLACTIVE) {
-- 
2.5.5




More information about the SeaBIOS mailing list