summaryrefslogtreecommitdiffstats
path: root/arch/ppc/boot/kbd.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1998-03-17 22:05:47 +0000
committerRalf Baechle <ralf@linux-mips.org>1998-03-17 22:05:47 +0000
commit27cfca1ec98e91261b1a5355d10a8996464b63af (patch)
tree8e895a53e372fa682b4c0a585b9377d67ed70d0e /arch/ppc/boot/kbd.c
parent6a76fb7214c477ccf6582bd79c5b4ccc4f9c41b1 (diff)
Look Ma' what I found on my harddisk ...
o New faster syscalls for 2.1.x, too o Upgrade to 2.1.89. Don't try to run this. It's flaky as hell. But feel free to debug ...
Diffstat (limited to 'arch/ppc/boot/kbd.c')
-rw-r--r--arch/ppc/boot/kbd.c205
1 files changed, 102 insertions, 103 deletions
diff --git a/arch/ppc/boot/kbd.c b/arch/ppc/boot/kbd.c
index 6c0065b00..9f5cd330b 100644
--- a/arch/ppc/boot/kbd.c
+++ b/arch/ppc/boot/kbd.c
@@ -1,19 +1,10 @@
-/* Keyboard handler */
-#include <../drivers/char/defkeymap.c> /* yeah I know it's bad */
+#include <linux/keyboard.h>
-#define L 0x0001 /* locking function */
-#define SHF 0x0002 /* keyboard shift */
-#define ALT 0x0004 /* alternate shift -- alternate chars */
-#define NUM 0x0008 /* numeric shift cursors vs. numeric */
-#define CTL 0x0010 /* control shift -- allows ctl function */
-#define CPS 0x0020 /* caps shift -- swaps case of letter */
-#define ASCII 0x0040 /* ascii code for this key */
-#define STP 0x0080 /* stop output */
-#define FUNC 0x0100 /* function key */
-#define SCROLL 0x0200 /* scroll lock key */
+#include <../drivers/char/defkeymap.c> /* yeah I know it's bad */
-unsigned char shfts, ctls, alts, caps, num, stp;
+
+unsigned char shfts, ctls, alts, caps;
#define KBDATAP 0x60 /* kbd data port */
#define KBSTATUSPORT 0x61 /* kbd status */
@@ -21,37 +12,15 @@ unsigned char shfts, ctls, alts, caps, num, stp;
#define KBINRDY 0x01
#define KBOUTRDY 0x02
-#define _x__ 0x00 /* Unknown / unmapped */
-
-const unsigned short action[] = {
- 0, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, /* scan 0- 7 */
- ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, /* scan 8-15 */
- ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, /* scan 16-23 */
- ASCII, ASCII, ASCII, ASCII, ASCII, CTL, ASCII, ASCII, /* scan 24-31 */
- ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, /* scan 32-39 */
- ASCII, ASCII, SHF, ASCII, ASCII, ASCII, ASCII, ASCII, /* scan 40-47 */
- ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, SHF, ASCII, /* scan 48-55 */
- ALT, ASCII, CPS, FUNC, FUNC, FUNC, FUNC, FUNC, /* scan 56-63 */
- FUNC, FUNC, FUNC, FUNC, FUNC, NUM,SCROLL, ASCII, /* scan 64-71 */
- ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, /* scan 72-79 */
- ASCII, ASCII, ASCII, ASCII, 0, 0, 0, 0, /* scan 80-87 */
- 0,0,0,0,0,0,0,0, /* scan 88-95 */
- 0,0,0,0,0,0,0,0, /* scan 96-103 */
- 0,0,0,0,0,0,0,0, /* scan 104-111 */
- 0,0,0,0,0,0,0,0, /* scan 112-119 */
- 0,0,0,0,0,0,0,0, /* scan 120-127 */
-};
-
-static int
-kbd(noblock)
- int noblock;
+
+static int kbd(int noblock)
{
- unsigned char dt, brk, act;
- int first = 1;
+ unsigned char dt, brk, val;
+ unsigned code;
loop:
if (noblock) {
- if ((inb(KBSTATP) & KBINRDY) == 0)
- return (-1);
+ if ((inb(KBSTATP) & KBINRDY) == 0)
+ return (-1);
} else while((inb(KBSTATP) & KBINRDY) == 0) ;
dt = inb(KBDATAP);
@@ -59,72 +28,102 @@ loop:
brk = dt & 0x80; /* brk == 1 on key release */
dt = dt & 0x7f; /* keycode */
- act = action[dt];
- if (/*act&SHF*/ dt == 54)
- shfts = brk ? 0 : 1;
- if (/*act&ALT*/ dt == 48)
- alts = brk ? 0 : 1;
- if (/*act&NUM*/ dt == 69)
- if (act&L) {
- /* NUM lock */
- if(!brk)
- num = !num;
- } else
- num = brk ? 0 : 1;
- if (/*act&CTL*/ dt == 29)
- ctls = brk ? 0 : 1;
- if (/*act&CPS*/ dt == 58)
- if (act&L) {
- /* CAPS lock */
- if(!brk)
- caps = !caps;
- } else
- caps = brk ? 0 : 1;
- if (0/*act&STP*/)
- if (act&L) {
- if(!brk)
- stp = !stp;
- } else
- stp = brk ? 0 : 1;
-
- if ((act&ASCII) && !brk) {
- unsigned char chr;
- if (shfts)
- chr = shift_map[dt];
- else if (ctls)
- chr = ctrl_map[dt];
- else
- chr = plain_map[dt];
+ if (shfts)
+ code = shift_map[dt];
+ else if (ctls)
+ code = ctrl_map[dt];
+ else
+ code = plain_map[dt];
+
+ val = KVAL(code);
+ switch (KTYP(code) & 0x0f) {
+ case KT_LATIN:
+ if (brk)
+ break;
if (alts)
- chr |= 0x80;
-
- if (caps && (chr >= 'a' && chr <= 'z'))
- chr -= 'a' - 'A' ;
- if ( chr == 0x01 ) chr = '\n'; /* hack */
-#define CTRL(s) (s & 0x1F)
- if ((chr == '\r') || (chr == '\n') || (chr == CTRL('A')) || (chr == CTRL('S')))
- {
- /* Wait for key up */
- while (1)
- {
- while((inb(KBSTATP) & KBINRDY) == 0) ;
- dt = inb(KBDATAP);
- if (dt & 0x80) /* key up */ break;
- }
+ val |= 0x80;
+ if (val == 0x7f) /* map delete to backspace */
+ val = '\b';
+ return val;
+
+ case KT_LETTER:
+ if (brk)
+ break;
+ if (caps)
+ val -= 'a'-'A';
+ return val;
+
+ case KT_SPEC:
+ if (brk)
+ break;
+ if (val == KVAL(K_CAPS))
+ caps = !caps;
+ else if (val == KVAL(K_ENTER)) {
+enter: /* Wait for key up */
+ while (1) {
+ while((inb(KBSTATP) & KBINRDY) == 0) ;
+ dt = inb(KBDATAP);
+ if (dt & 0x80) /* key up */ break;
+ }
+ return 10;
+ }
+ break;
+
+ case KT_PAD:
+ if (brk)
+ break;
+ if (val < 10)
+ return val;
+ if (val == KVAL(K_PENTER))
+ goto enter;
+ break;
+
+ case KT_SHIFT:
+ switch (val) {
+ case KG_SHIFT:
+ case KG_SHIFTL:
+ case KG_SHIFTR:
+ shfts = brk ? 0 : 1;
+ break;
+ case KG_ALT:
+ case KG_ALTGR:
+ alts = brk ? 0 : 1;
+ break;
+ case KG_CTRL:
+ case KG_CTRLL:
+ case KG_CTRLR:
+ ctls = brk ? 0 : 1;
+ break;
}
- return (chr);
+ break;
+
+ case KT_LOCK:
+ switch (val) {
+ case KG_SHIFT:
+ case KG_SHIFTL:
+ case KG_SHIFTR:
+ if (brk)
+ shfts = !shfts;
+ break;
+ case KG_ALT:
+ case KG_ALTGR:
+ if (brk)
+ alts = !alts;
+ break;
+ case KG_CTRL:
+ case KG_CTRLL:
+ case KG_CTRLR:
+ if (brk)
+ ctls = !ctls;
+ break;
+ }
+ break;
}
- if (first && brk) return (0); /* Ignore initial 'key up' codes */
+ if (brk) return (0); /* Ignore initial 'key up' codes */
goto loop;
}
-static
-scankbd(void) {
- return (kbd(1) != -1);
-}
-
-static
-kbdreset(void)
+static void kbdreset(void)
{
unsigned char c;
int i;
@@ -151,7 +150,7 @@ kbdreset(void)
static int kbd_reset = 0;
-CRT_getc(void)
+int CRT_getc(void)
{
int c;
if (!kbd_reset) {kbdreset(); kbd_reset++; }
@@ -159,7 +158,7 @@ CRT_getc(void)
return(c);
}
-CRT_tstc(void)
+int CRT_tstc(void)
{
if (!kbd_reset) {kbdreset(); kbd_reset++; }
return ((inb(KBSTATP) & KBINRDY) != 0);