diff options
| author | Kazutaka YOKOTA <yokota@FreeBSD.org> | 1999-12-13 09:31:43 +0000 |
|---|---|---|
| committer | Kazutaka YOKOTA <yokota@FreeBSD.org> | 1999-12-13 09:31:43 +0000 |
| commit | 579958932a0ec80a54e25111370bcd1f635c6649 (patch) | |
| tree | dd1b60fcb1b209031a49529fa481f1e02f1422b0 /sys/dev/kbd | |
| parent | e14140f43eb85e6e24244bd0c64097414bf8f1fb (diff) | |
Notes
Diffstat (limited to 'sys/dev/kbd')
| -rw-r--r-- | sys/dev/kbd/atkbd.c | 42 | ||||
| -rw-r--r-- | sys/dev/kbd/kbd.c | 5 |
2 files changed, 37 insertions, 10 deletions
diff --git a/sys/dev/kbd/atkbd.c b/sys/dev/kbd/atkbd.c index ca81c4d57c786..707273446128d 100644 --- a/sys/dev/kbd/atkbd.c +++ b/sys/dev/kbd/atkbd.c @@ -35,11 +35,8 @@ #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> -#include <sys/conf.h> #include <sys/bus.h> #include <sys/proc.h> -#include <sys/tty.h> -#include <sys/fcntl.h> #include <sys/malloc.h> #include <dev/kbd/kbdreg.h> @@ -224,6 +221,8 @@ static int init_keyboard(KBDC kbdc, int *type, int flags); static int write_kbd(KBDC kbdc, int command, int data); static int get_kbd_id(KBDC kbdc); static int typematic(int delay, int rate); +static int typematic_delay(int delay); +static int typematic_rate(int rate); /* local variables */ @@ -875,13 +874,23 @@ atkbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) if (!KBD_HAS_DEVICE(kbd)) return 0; i = typematic(((int *)arg)[0], ((int *)arg)[1]); - return write_kbd(state->kbdc, KBDC_SET_TYPEMATIC, i); + error = write_kbd(state->kbdc, KBDC_SET_TYPEMATIC, i); + if (error == 0) { + kbd->kb_delay1 = typematic_delay(i); + kbd->kb_delay2 = typematic_rate(i); + } + return error; case KDSETRAD: /* set keyboard repeat rate (old interface) */ splx(s); if (!KBD_HAS_DEVICE(kbd)) return 0; - return write_kbd(state->kbdc, KBDC_SET_TYPEMATIC, *(int *)arg); + error = write_kbd(state->kbdc, KBDC_SET_TYPEMATIC, *(int *)arg); + if (error == 0) { + kbd->kb_delay1 = typematic_delay(*(int *)arg); + kbd->kb_delay2 = typematic_rate(*(int *)arg); + } + return error; case PIO_KEYMAP: /* set keyboard translation table */ case PIO_KEYMAPENT: /* set keyboard translation table entry */ @@ -1286,14 +1295,27 @@ get_kbd_id(KBDC kbdc) return ((id2 << 8) | id1); } +static int delays[] = { 250, 500, 750, 1000 }; +static int rates[] = { 34, 38, 42, 46, 50, 55, 59, 63, + 68, 76, 84, 92, 100, 110, 118, 126, + 136, 152, 168, 184, 200, 220, 236, 252, + 272, 304, 336, 368, 400, 440, 472, 504 }; + +static int +typematic_delay(int i) +{ + return delays[(i >> 5) & 3]; +} + +static int +typematic_rate(int i) +{ + return rates[i & 0x1f]; +} + static int typematic(int delay, int rate) { - static int delays[] = { 250, 500, 750, 1000 }; - static int rates[] = { 34, 38, 42, 46, 50, 55, 59, 63, - 68, 76, 84, 92, 100, 110, 118, 126, - 136, 152, 168, 184, 200, 220, 236, 252, - 272, 304, 336, 368, 400, 440, 472, 504 }; int value; int i; diff --git a/sys/dev/kbd/kbd.c b/sys/dev/kbd/kbd.c index 3f1abf1ed4c95..3b634047cbb0e 100644 --- a/sys/dev/kbd/kbd.c +++ b/sys/dev/kbd/kbd.c @@ -752,6 +752,11 @@ genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) *(int *)arg = kbd->kb_type; break; + case KDGETREPEAT: /* get keyboard repeat rate */ + ((int *)arg)[0] = kbd->kb_delay1; + ((int *)arg)[1] = kbd->kb_delay2; + break; + case GIO_KEYMAP: /* get keyboard translation table */ bcopy(kbd->kb_keymap, arg, sizeof(*kbd->kb_keymap)); break; |
