diff options
author | Mats O Jansson <maja@cvs.openbsd.org> | 1999-07-18 17:12:39 +0000 |
---|---|---|
committer | Mats O Jansson <maja@cvs.openbsd.org> | 1999-07-18 17:12:39 +0000 |
commit | 701e6ae03ec702bfdc7a91e23852080e521f31ae (patch) | |
tree | 17dae5bfedd7247ce93dc35688ff67e71b0d01eb /sys | |
parent | 4ebabb9303a01a2a29e4e6589e44fe734415a281 (diff) |
Add code to support none us keyboards in kernel. -moj
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arch/sparc/dev/kbd.c | 190 | ||||
-rw-r--r-- | sys/arch/sparc/include/kbd.h | 26 |
2 files changed, 197 insertions, 19 deletions
diff --git a/sys/arch/sparc/dev/kbd.c b/sys/arch/sparc/dev/kbd.c index 1637ed844ff..b34ad63b08b 100644 --- a/sys/arch/sparc/dev/kbd.c +++ b/sys/arch/sparc/dev/kbd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kbd.c,v 1.8 1998/04/25 00:31:23 deraadt Exp $ */ +/* $OpenBSD: kbd.c,v 1.9 1999/07/18 17:12:37 maja Exp $ */ /* $NetBSD: kbd.c,v 1.28 1997/09/13 19:12:18 pk Exp $ */ /* @@ -99,7 +99,8 @@ #define KEY_RSHIFT 0x82 #define KEY_CONTROL 0x83 #define KEY_ALLUP 0x84 /* all keys are now up; also reset */ - +#define KEY_ALTGR 0x85 +#define KEY_MAGIC_LAST 0x85 /* * Decode tables for type 2, 3, and 4 keyboards * (stolen from Sprite; see also kbd.h). @@ -108,7 +109,7 @@ static u_char kbd_unshifted[] = { /* 0 */ KEY_IGNORE, KEY_L1, KEY_IGNORE, KEY_IGNORE, /* 4 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, /* 8 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, -/* 12 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 12 */ KEY_IGNORE, KEY_ALTGR, KEY_IGNORE, KEY_IGNORE, /* 16 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, /* 20 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, /* 24 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, @@ -143,7 +144,7 @@ static u_char kbd_shifted[] = { /* 0 */ KEY_IGNORE, KEY_L1, KEY_IGNORE, KEY_IGNORE, /* 4 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, /* 8 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, -/* 12 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 12 */ KEY_IGNORE, KEY_ALTGR, KEY_IGNORE, KEY_IGNORE, /* 16 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, /* 20 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, /* 24 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, @@ -174,6 +175,76 @@ static u_char kbd_shifted[] = { /* 124 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_ALLUP, }; +static u_char kbd_altgraph[] = { +/* 0 */ KEY_IGNORE, KEY_L1, KEY_IGNORE, KEY_IGNORE, +/* 4 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 8 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 12 */ KEY_IGNORE, KEY_ALTGR, KEY_IGNORE, KEY_IGNORE, +/* 16 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 20 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 24 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 28 */ KEY_IGNORE, '\033', KEY_IGNORE, KEY_IGNORE, +/* 32 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 36 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 40 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, '\b', +/* 44 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 48 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 52 */ KEY_IGNORE, '\t', KEY_IGNORE, KEY_IGNORE, +/* 56 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 60 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 64 */ KEY_IGNORE, KEY_IGNORE, '\177', KEY_IGNORE, +/* 68 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 72 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 76 */ KEY_CONTROL, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 80 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 84 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 88 */ KEY_IGNORE, '\r', KEY_IGNORE, KEY_IGNORE, +/* 92 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 96 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_LSHIFT, +/* 100 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 104 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 108 */ KEY_IGNORE, KEY_IGNORE, KEY_RSHIFT, '\n', +/* 112 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 116 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_CAPSLOCK, +/* 120 */ KEY_IGNORE, ' ', KEY_IGNORE, KEY_IGNORE, +/* 124 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_ALLUP, +}; + +static u_char kbd_ctrl[] = { +/* 0 */ KEY_IGNORE, KEY_L1, KEY_IGNORE, KEY_IGNORE, +/* 4 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 8 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 12 */ KEY_IGNORE, KEY_ALTGR, KEY_IGNORE, KEY_IGNORE, +/* 16 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 20 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 24 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 28 */ KEY_IGNORE, '\033', '1', '\000', +/* 32 */ '3', '4', '5', '\036', +/* 36 */ '7', '8', '9', '0', +/* 40 */ '\037', '=', '\036', '\b', +/* 44 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 48 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 52 */ KEY_IGNORE, '\t', '\021', '\027', +/* 56 */ '\005', '\022', '\024', '\031', +/* 60 */ '\025', '\t', '\017', '\020', +/* 64 */ '\033', '\035', '\177', KEY_IGNORE, +/* 68 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 72 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 76 */ KEY_CONTROL, '\001', '\023', '\004', +/* 80 */ '\006', '\007', '\b', '\n', +/* 84 */ '\013', '\014', ';', '\'', +/* 88 */ '\034', '\r', KEY_IGNORE, KEY_IGNORE, +/* 92 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 96 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_LSHIFT, +/* 100 */ '\032', '\030', '\003', '\026', +/* 104 */ '\002', '\016', '\r', ',', +/* 108 */ '.', '\037', KEY_RSHIFT, '\n', +/* 112 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, +/* 116 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_CAPSLOCK, +/* 120 */ KEY_IGNORE, '\000', KEY_IGNORE, KEY_IGNORE, +/* 124 */ KEY_IGNORE, KEY_IGNORE, KEY_IGNORE, KEY_ALLUP, +}; + /* * We need to remember the state of the keyboard's shift and control * keys, and we need a per-type translation table. @@ -181,6 +252,8 @@ static u_char kbd_shifted[] = { struct kbd_state { const u_char *kbd_unshifted; /* unshifted keys */ const u_char *kbd_shifted; /* shifted keys */ + const u_char *kbd_altgraph; /* alt gr keys */ + const u_char *kbd_ctrl; /* control keys */ const u_char *kbd_cur; /* current keys (either of the preceding) */ union { char c[2]; /* left and right shift keys */ @@ -190,6 +263,7 @@ struct kbd_state { #define kbd_rshift kbd_shift.c[1] #define kbd_anyshift kbd_shift.s char kbd_control; /* true => ctrl down */ + char kbd_altgr; /* true => alt gr down */ char kbd_click; /* true => keyclick enabled */ u_char kbd_pending; /* Another code from the keyboard is due */ u_char kbd_id; /* a place to store the ID */ @@ -224,6 +298,8 @@ void kbd_reset __P((struct kbd_state *)); static int kbd_translate __P((int, struct kbd_state *)); void kbdattach __P((int)); void kbd_repeat __P((void *arg)); +u_short kbd_cnv_entry __P((u_short)); +u_short kbd_cnv_out __P((u_short)); /* set in kbdattach() */ int kbd_repeat_start; @@ -315,6 +391,8 @@ kbd_reset(ks) if (ks->kbd_unshifted == NULL) { ks->kbd_unshifted = kbd_unshifted; ks->kbd_shifted = kbd_shifted; + ks->kbd_altgraph = kbd_altgraph; + ks->kbd_ctrl = kbd_ctrl; ks->kbd_cur = ks->kbd_unshifted; } @@ -362,7 +440,7 @@ kbd_translate(c, ks) } down = !KEY_UP(c); c = ks->kbd_cur[KEY_CODE(c)]; - if (c & KEY_MAGIC) { + if ((c >= KEY_MAGIC) && (c <= KEY_MAGIC_LAST)) { switch (c) { case KEY_LSHIFT: @@ -376,10 +454,16 @@ kbd_translate(c, ks) case KEY_ALLUP: ks->kbd_anyshift = 0; ks->kbd_control = 0; + ks->kbd_altgr = 0; + break; + + case KEY_ALTGR: + ks->kbd_altgr = down; break; case KEY_CONTROL: ks->kbd_control = down; + break; /* FALLTHROUGH */ case KEY_IGNORE: @@ -392,21 +476,15 @@ kbd_translate(c, ks) ks->kbd_cur = ks->kbd_shifted; else ks->kbd_cur = ks->kbd_unshifted; + if (ks->kbd_control) { + ks->kbd_cur = ks->kbd_ctrl; + } else if (ks->kbd_altgr) { + ks->kbd_cur = ks->kbd_altgraph; + } return (-1); } if (!down) return (-1); - if (ks->kbd_control) { - /* control space and unshifted control atsign return null */ - if (c == ' ' || c == '2') - return (0); - /* unshifted control hat */ - if (c == '6') - return ('^' & 0x1f); - /* standard controls */ - if (c >= '@' && c < 0x7f) - return (c & 0x1f); - } return (c); } @@ -529,6 +607,69 @@ kbd_rint(c) EV_WAKEUP(&k->k_events); } +u_short +kbd_cnv_entry(entry) + u_short entry; +{ + u_short s; + + s = entry; + + if ((entry >= 0x100) && (entry < 0x800)) { + + if (entry == SHIFTKEYS+CAPSLOCK) { + s = KEY_CAPSLOCK; + } else if (entry == SHIFTKEYS+LEFTSHIFT) { + s = KEY_LSHIFT; + } else if (entry == SHIFTKEYS+RIGHTSHIFT) { + s = KEY_RSHIFT; + } else if ((entry == SHIFTKEYS+LEFTCTRL) || + (entry == SHIFTKEYS+RIGHTCTRL)) { + s = KEY_CONTROL; + } else if (entry == SHIFTKEYS+ALTGRAPH) { + s = KEY_ALTGR; + } else if (entry == BUCKYBITS+SYSTEMBIT) { + s = KEY_L1; + } else if (entry == IDLE) { + s = KEY_ALLUP; + } else { + s = KEY_IGNORE; + } + + } + + return(s); +} + +u_short +kbd_cnv_out(entry) + u_short entry; +{ + u_short s; + + s = entry; + + if (entry == KEY_IGNORE) { + s = NOP; + } else if (entry == KEY_L1) { + s = BUCKYBITS+SYSTEMBIT; + } else if (entry == KEY_CAPSLOCK) { + s = SHIFTKEYS+CAPSLOCK; + } else if (entry == KEY_LSHIFT) { + s = SHIFTKEYS+LEFTSHIFT; + } else if (entry == KEY_RSHIFT) { + s = SHIFTKEYS+RIGHTSHIFT; + } else if (entry == KEY_CONTROL) { + s = SHIFTKEYS+LEFTCTRL; + } else if (entry == KEY_ALLUP) { + s = IDLE; + } else if (entry == KEY_ALTGR) { + s = SHIFTKEYS+ALTGRAPH; + } + + return(s); +} + int kbdopen(dev, flags, mode, p) dev_t dev; @@ -658,11 +799,18 @@ kbdioctl(dev, cmd, data, flag, p) case KIOC_SHIFTMASK: tp = kbd_shifted; break; + case KIOC_CTRLMASK: + tp = kbd_ctrl; + break; + case KIOC_ALTGMASK: + tp = kbd_altgraph; + break; default: /* Silently ignore unsupported masks */ return (0); } - if (kmp->kio_entry & 0xff80) + kmp->kio_entry = kbd_cnv_entry(kmp->kio_entry); + if (kmp->kio_entry & 0xff00) /* Silently ignore funny entries */ return (0); @@ -679,10 +827,16 @@ kbdioctl(dev, cmd, data, flag, p) case KIOC_SHIFTMASK: tp = kbd_shifted; break; + case KIOC_CTRLMASK: + tp = kbd_ctrl; + break; + case KIOC_ALTGMASK: + tp = kbd_altgraph; + break; default: return (0); } - kmp->kio_entry = tp[kmp->kio_station] & ~KEY_MAGIC; + kmp->kio_entry = kbd_cnv_out(tp[kmp->kio_station]); return (0); case KIOCCMD: diff --git a/sys/arch/sparc/include/kbd.h b/sys/arch/sparc/include/kbd.h index 5c28aa80210..d081989c06f 100644 --- a/sys/arch/sparc/include/kbd.h +++ b/sys/arch/sparc/include/kbd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: kbd.h,v 1.4 1998/06/27 20:01:08 todd Exp $ */ +/* $OpenBSD: kbd.h,v 1.5 1999/07/18 17:12:38 maja Exp $ */ /* $NetBSD: kbd.h,v 1.6 1996/03/31 22:21:35 pk Exp $ */ /* @@ -88,6 +88,30 @@ #define LED_SCROLL_LOCK 0x4 #define LED_CAPS_LOCK 0x8 +#define CAPSLOCK 0 +#define SHIFTLOCK 1 +#define LEFTSHIFT 2 +#define RIGHTSHIFT 3 +#define LEFTCTRL 4 +#define RIGHTCTRL 5 +#define ALTGRAPH 9 +#define ALT 10 +#define NUMLOCK 11 + +#define SYSTEMBIT 1 + +#define SHIFTKEYS 0x100 +#define BUCKYBITS 0x200 +#define FUNNY 0x300 +#define NOP 0x300 +#define OOPS 0x301 +/* HOLE 0x302 defined in kbio.h */ +#define RESET 0x306 +#define ERROR 0x307 +#define IDLE 0x308 +#define COMPOSE 0x309 +#define NONL 0x30a + #ifdef _KERNEL void kbd_serial __P((struct tty *, void (*)(struct tty *), void (*)(struct tty *))); |