summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorToomas Soome <tsoome@me.com>2016-12-24 12:50:14 +0200
committerRobert Mustacchi <rm@joyent.com>2019-01-16 23:17:32 +0000
commitead1aeb99fc825309962c1dc2f20333bdd5898f6 (patch)
tree23d6c159a113a0a9219d2afdd4a5dae3e1965ed5 /usr/src
parent9f17ecf0b8fdc59cfa903ceb6a96046b0f2d8201 (diff)
downloadillumos-joyent-ead1aeb99fc825309962c1dc2f20333bdd5898f6.tar.gz
10195 uts: boot_keyboard should emit esc sequences for arrow keys
Reviewed by: John Levon <john.levon@joyent.com> Reviewed by: Gergő Mihály Doma <domag02@gmail.com> Approved by: Robert Mustacchi <rm@joyent.com>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/i86pc/boot/boot_keyboard.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/usr/src/uts/i86pc/boot/boot_keyboard.c b/usr/src/uts/i86pc/boot/boot_keyboard.c
index 220e254f47..3bf27243aa 100644
--- a/usr/src/uts/i86pc/boot/boot_keyboard.c
+++ b/usr/src/uts/i86pc/boot/boot_keyboard.c
@@ -23,8 +23,6 @@
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* Miniature keyboard driver for bootstrap. This allows keyboard
* support to continue after we take over interrupts and disable
@@ -144,6 +142,10 @@ static struct {
-1, /* pending */
};
+#define KTAB_STRLEN 3
+static char keystringtab[KTAB_STRLEN] = {'\033', '[', ' '};
+static int keystring = -1;
+
static int kb_translate(unsigned char code);
static void kb_send(unsigned char cmd);
static void kb_update_leds(void);
@@ -157,6 +159,15 @@ kb_getchar(void)
while (!kb_ischar())
/* LOOP */;
+ if (keystring >= 0) {
+ ret = keystringtab[keystring++];
+ if (keystring == KTAB_STRLEN) {
+ keystring = -1;
+ kb.pending = -1;
+ }
+ return (ret);
+ }
+
/*
* kb_ischar() doesn't succeed without leaving kb.pending
* set.
@@ -164,8 +175,27 @@ kb_getchar(void)
ASSERT(kb.pending >= 0);
if (kb.pending & 0x100) {
- ret = 0;
kb.pending &= 0xff;
+ switch (kb.pending) {
+ case 'H': /* Up */
+ keystringtab[2] = 'A';
+ keystring = 0;
+ return (kb_getchar());
+ case 'P': /* Down */
+ keystringtab[2] = 'B';
+ keystring = 0;
+ return (kb_getchar());
+ case 'M': /* Right */
+ keystringtab[2] = 'C';
+ keystring = 0;
+ return (kb_getchar());
+ case 'K': /* Left */
+ keystringtab[2] = 'D';
+ keystring = 0;
+ return (kb_getchar());
+ default:
+ ret = 0;
+ }
} else {
ret = kb.pending;
kb.pending = -1;