summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/atkbdc/atkbd.c16
-rw-r--r--sys/dev/kbd/atkbd.c16
-rw-r--r--sys/dev/kbd/kbd.c79
-rw-r--r--sys/dev/kbd/kbdreg.h2
4 files changed, 100 insertions, 13 deletions
diff --git a/sys/dev/atkbdc/atkbd.c b/sys/dev/atkbdc/atkbd.c
index 3094c60..ca81c4d 100644
--- a/sys/dev/atkbdc/atkbd.c
+++ b/sys/dev/atkbdc/atkbd.c
@@ -514,6 +514,8 @@ atkbd_read(keyboard_t *kbd, int wait)
c = read_kbd_data(((atkbd_state_t *)kbd->kb_data)->kbdc);
else
c = read_kbd_data_no_wait(((atkbd_state_t *)kbd->kb_data)->kbdc);
+ if (c != -1)
+ ++kbd->kb_count;
return (KBD_IS_ACTIVE(kbd) ? c : -1);
}
@@ -556,6 +558,11 @@ next_code:
if (scancode == -1)
return NOKEY;
}
+ ++kbd->kb_count;
+
+#if KBDIO_DEBUG >= 10
+ printf("atkbd_read_char(): scancode:0x%x\n", scancode);
+#endif
/* return the byte as is for the K_RAW mode */
if (state->ks_mode == K_RAW)
@@ -709,23 +716,27 @@ next_code:
case 0x47: case 0x48: case 0x49: /* keypad 7,8,9 */
state->ks_composed_char *= 10;
state->ks_composed_char += keycode - 0x40;
+ kbd->kb_prev_key = keycode | (scancode & 0x80);
if (state->ks_composed_char > UCHAR_MAX)
return ERRKEY;
goto next_code;
case 0x4B: case 0x4C: case 0x4D: /* keypad 4,5,6 */
state->ks_composed_char *= 10;
state->ks_composed_char += keycode - 0x47;
+ kbd->kb_prev_key = keycode | (scancode & 0x80);
if (state->ks_composed_char > UCHAR_MAX)
return ERRKEY;
goto next_code;
case 0x4F: case 0x50: case 0x51: /* keypad 1,2,3 */
state->ks_composed_char *= 10;
state->ks_composed_char += keycode - 0x4E;
+ kbd->kb_prev_key = keycode | (scancode & 0x80);
if (state->ks_composed_char > UCHAR_MAX)
return ERRKEY;
goto next_code;
case 0x52: /* keypad 0 */
state->ks_composed_char *= 10;
+ kbd->kb_prev_key = keycode | (scancode & 0x80);
if (state->ks_composed_char > UCHAR_MAX)
return ERRKEY;
goto next_code;
@@ -735,6 +746,7 @@ next_code:
case 0xCB: case 0xCC: case 0xCD: /* keypad 4,5,6 */
case 0xCF: case 0xD0: case 0xD1: /* keypad 1,2,3 */
case 0xD2: /* keypad 0 */
+ kbd->kb_prev_key = keycode | (scancode & 0x80);
goto next_code;
case 0x38: /* left alt key */
@@ -744,6 +756,7 @@ next_code:
if (state->ks_composed_char > 0) {
state->ks_flags &= ~COMPOSE;
state->ks_composed_char = 0;
+ kbd->kb_prev_key = keycode | (scancode & 0x80);
return ERRKEY;
}
break;
@@ -753,6 +766,7 @@ next_code:
/* keycode to key action */
action = genkbd_keyaction(kbd, keycode, scancode & 0x80,
&state->ks_state, &state->ks_accents);
+ kbd->kb_prev_key = keycode | (scancode & 0x80);
if (action == NOKEY)
goto next_code;
else
@@ -1056,7 +1070,7 @@ init_keyboard(KBDC kbdc, int *type, int flags)
}
/* save the current controller command byte */
- empty_both_buffers(kbdc, 10);
+ empty_both_buffers(kbdc, 200);
c = get_controller_command_byte(kbdc);
if (c == -1) {
/* CONTROLLER ERROR */
diff --git a/sys/dev/kbd/atkbd.c b/sys/dev/kbd/atkbd.c
index 3094c60..ca81c4d 100644
--- a/sys/dev/kbd/atkbd.c
+++ b/sys/dev/kbd/atkbd.c
@@ -514,6 +514,8 @@ atkbd_read(keyboard_t *kbd, int wait)
c = read_kbd_data(((atkbd_state_t *)kbd->kb_data)->kbdc);
else
c = read_kbd_data_no_wait(((atkbd_state_t *)kbd->kb_data)->kbdc);
+ if (c != -1)
+ ++kbd->kb_count;
return (KBD_IS_ACTIVE(kbd) ? c : -1);
}
@@ -556,6 +558,11 @@ next_code:
if (scancode == -1)
return NOKEY;
}
+ ++kbd->kb_count;
+
+#if KBDIO_DEBUG >= 10
+ printf("atkbd_read_char(): scancode:0x%x\n", scancode);
+#endif
/* return the byte as is for the K_RAW mode */
if (state->ks_mode == K_RAW)
@@ -709,23 +716,27 @@ next_code:
case 0x47: case 0x48: case 0x49: /* keypad 7,8,9 */
state->ks_composed_char *= 10;
state->ks_composed_char += keycode - 0x40;
+ kbd->kb_prev_key = keycode | (scancode & 0x80);
if (state->ks_composed_char > UCHAR_MAX)
return ERRKEY;
goto next_code;
case 0x4B: case 0x4C: case 0x4D: /* keypad 4,5,6 */
state->ks_composed_char *= 10;
state->ks_composed_char += keycode - 0x47;
+ kbd->kb_prev_key = keycode | (scancode & 0x80);
if (state->ks_composed_char > UCHAR_MAX)
return ERRKEY;
goto next_code;
case 0x4F: case 0x50: case 0x51: /* keypad 1,2,3 */
state->ks_composed_char *= 10;
state->ks_composed_char += keycode - 0x4E;
+ kbd->kb_prev_key = keycode | (scancode & 0x80);
if (state->ks_composed_char > UCHAR_MAX)
return ERRKEY;
goto next_code;
case 0x52: /* keypad 0 */
state->ks_composed_char *= 10;
+ kbd->kb_prev_key = keycode | (scancode & 0x80);
if (state->ks_composed_char > UCHAR_MAX)
return ERRKEY;
goto next_code;
@@ -735,6 +746,7 @@ next_code:
case 0xCB: case 0xCC: case 0xCD: /* keypad 4,5,6 */
case 0xCF: case 0xD0: case 0xD1: /* keypad 1,2,3 */
case 0xD2: /* keypad 0 */
+ kbd->kb_prev_key = keycode | (scancode & 0x80);
goto next_code;
case 0x38: /* left alt key */
@@ -744,6 +756,7 @@ next_code:
if (state->ks_composed_char > 0) {
state->ks_flags &= ~COMPOSE;
state->ks_composed_char = 0;
+ kbd->kb_prev_key = keycode | (scancode & 0x80);
return ERRKEY;
}
break;
@@ -753,6 +766,7 @@ next_code:
/* keycode to key action */
action = genkbd_keyaction(kbd, keycode, scancode & 0x80,
&state->ks_state, &state->ks_accents);
+ kbd->kb_prev_key = keycode | (scancode & 0x80);
if (action == NOKEY)
goto next_code;
else
@@ -1056,7 +1070,7 @@ init_keyboard(KBDC kbdc, int *type, int flags)
}
/* save the current controller command byte */
- empty_both_buffers(kbdc, 10);
+ empty_both_buffers(kbdc, 200);
c = get_controller_command_byte(kbdc);
if (c == -1) {
/* CONTROLLER ERROR */
diff --git a/sys/dev/kbd/kbd.c b/sys/dev/kbd/kbd.c
index 0950f35..3f1abf1 100644
--- a/sys/dev/kbd/kbd.c
+++ b/sys/dev/kbd/kbd.c
@@ -136,6 +136,8 @@ kbd_init_struct(keyboard_t *kbd, char *name, int type, int unit, int config,
kbd->kb_fkeytab_size = 0;
kbd->kb_delay1 = KB_DELAY1; /* these values are advisory only */
kbd->kb_delay2 = KB_DELAY2;
+ kbd->kb_prev_key = 0;
+ kbd->kb_count = 0L;
}
void
@@ -673,14 +675,7 @@ genkbd_event(keyboard_t *kbd, int event, void *arg)
/* process special keys; most of them are just ignored... */
if (c & SPCLKEY) {
switch (KEYCHAR(c)) {
- /* locking keys */
- case NLK: case CLK: case SLK: case ALK:
- /* shift keys */
- case LSH: case RSH: case LCTR: case RCTR:
- case LALT: case RALT: case ASH: case META:
- /* other special keys */
- case NOP: case SPSC: case RBT: case SUSP:
- case STBY: case DBG: case NEXT:
+ default:
/* ignore them... */
continue;
case BTAB: /* a backtab: ESC [ Z */
@@ -967,10 +962,11 @@ genkbd_keyaction(keyboard_t *kbd, int keycode, int up, int *shiftstate,
int f;
int i;
+ i = keycode;
f = state & (AGRS | ALKED);
if ((f == AGRS1) || (f == AGRS2) || (f == ALKED))
- keycode += ALTGR_OFFSET;
- key = &kbd->kb_keymap->key[keycode];
+ i += ALTGR_OFFSET;
+ key = &kbd->kb_keymap->key[i];
i = ((state & SHIFTS) ? 1 : 0)
| ((state & CTLS) ? 2 : 0)
| ((state & ALTS) ? 4 : 0);
@@ -983,21 +979,63 @@ genkbd_keyaction(keyboard_t *kbd, int keycode, int up, int *shiftstate,
if (key->spcl & (0x80 >> i)) {
/* special keys */
switch (action) {
+ case LSHA:
+ if (kbd->kb_prev_key == keycode) {
+ set_lockkey_state(kbd, state, ALK);
+ state &= ~ALKDOWN;
+ }
+ action = LSH;
+ /* FALL THROUGH */
case LSH:
state &= ~SHIFTS1;
break;
+ case RSHA:
+ if (kbd->kb_prev_key == keycode) {
+ set_lockkey_state(kbd, state, ALK);
+ state &= ~ALKDOWN;
+ }
+ action = RSH;
+ /* FALL THROUGH */
case RSH:
state &= ~SHIFTS2;
break;
+ case LCTRA:
+ if (kbd->kb_prev_key == keycode) {
+ set_lockkey_state(kbd, state, ALK);
+ state &= ~ALKDOWN;
+ }
+ action = LCTR;
+ /* FALL THROUGH */
case LCTR:
state &= ~CTLS1;
break;
+ case RCTRA:
+ if (kbd->kb_prev_key == keycode) {
+ set_lockkey_state(kbd, state, ALK);
+ state &= ~ALKDOWN;
+ }
+ action = RCTR;
+ /* FALL THROUGH */
case RCTR:
state &= ~CTLS2;
break;
+ case LALTA:
+ if (kbd->kb_prev_key == keycode) {
+ set_lockkey_state(kbd, state, ALK);
+ state &= ~ALKDOWN;
+ }
+ action = LALT;
+ /* FALL THROUGH */
case LALT:
state &= ~ALTS1;
break;
+ case RALTA:
+ if (kbd->kb_prev_key == keycode) {
+ set_lockkey_state(kbd, state, ALK);
+ state &= ~ALKDOWN;
+ }
+ action = RALT;
+ /* FALL THROUGH */
case RALT:
state &= ~ALTS2;
break;
@@ -1058,28 +1096,46 @@ genkbd_keyaction(keyboard_t *kbd, int keycode, int up, int *shiftstate,
break;
/* NON-LOCKING KEYS */
case SPSC: case RBT: case SUSP: case STBY:
- case DBG: case NEXT:
+ case DBG: case NEXT: case PREV: case PNC:
*accents = 0;
break;
case BTAB:
*accents = 0;
action |= BKEY;
break;
+ case LSHA:
+ action = LSH;
+ /* FALL THROUGH */
case LSH:
state |= SHIFTS1;
break;
+ case RSHA:
+ action = RSH;
+ /* FALL THROUGH */
case RSH:
state |= SHIFTS2;
break;
+ case LCTRA:
+ action = LCTR;
+ /* FALL THROUGH */
case LCTR:
state |= CTLS1;
break;
+ case RCTRA:
+ action = RCTR;
+ /* FALL THROUGH */
case RCTR:
state |= CTLS2;
break;
+ case LALTA:
+ action = LALT;
+ /* FALL THROUGH */
case LALT:
state |= ALTS1;
break;
+ case RALTA:
+ action = RALT;
+ /* FALL THROUGH */
case RALT:
state |= ALTS2;
break;
@@ -1114,6 +1170,7 @@ genkbd_keyaction(keyboard_t *kbd, int keycode, int up, int *shiftstate,
if (action >= F_FN && action <= L_FN)
action |= FKEY;
/* XXX: return fkey string for the FKEY? */
+ break;
}
*shiftstate = state;
return (SPCLKEY | action);
diff --git a/sys/dev/kbd/kbdreg.h b/sys/dev/kbd/kbdreg.h
index 4fc5fd6..1b90871 100644
--- a/sys/dev/kbd/kbdreg.h
+++ b/sys/dev/kbd/kbdreg.h
@@ -88,6 +88,8 @@ struct keyboard {
int kb_delay2;
#define KB_DELAY1 500
#define KB_DELAY2 100
+ int kb_prev_key; /* keycode previously seen */
+ unsigned long kb_count; /* # of processed key strokes */
};
#define KBD_IS_VALID(k) ((k)->kb_flags & KB_VALID)
OpenPOWER on IntegriCloud