git: 971bac5ace7a - main - kbd: consolidate kb interfaces (phase one)
Date: Fri, 07 Jul 2023 05:10:32 UTC
The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=971bac5ace7a3c2262349fa2808188a11a5ffeed commit 971bac5ace7a3c2262349fa2808188a11a5ffeed Author: Michael <git@paepcke.de> AuthorDate: 2023-07-07 02:32:45 +0000 Commit: Warner Losh <imp@FreeBSD.org> CommitDate: 2023-07-07 05:10:18 +0000 kbd: consolidate kb interfaces (phase one) Refactor to eliminate duplicated rate and delay tables, with minor style tweaks for changed lines. Remove an obsolete comment about needing to convert from microseconds to ticks (that's done elsewhere). Remove traiing whitespace in kbdcontrol.c. Except for the new warning, no change in behavior Sponsored by: DSS GmbH Reviewed by: imp [minor style tweaks as well] Pull Request: https://github.com/freebsd/pull/683 Differential Revision: https://reviews.freebsd.org/D38818 --- sys/dev/adb/adb_kbd.c | 12 ++------- sys/dev/atkbdc/atkbd.c | 18 +++++--------- sys/dev/gpio/gpiokeys.c | 10 ++------ sys/dev/hid/hkbd.c | 10 ++------ sys/dev/kbdmux/kbdmux.c | 23 +++++------------ sys/dev/usb/input/ukbd.c | 10 ++------ sys/dev/vkbd/vkbd.c | 18 +++++--------- sys/sys/kbio.h | 7 ++++++ usr.sbin/kbdcontrol/kbdcontrol.c | 53 +++++++++++++++++++++------------------- 9 files changed, 61 insertions(+), 100 deletions(-) diff --git a/sys/dev/adb/adb_kbd.c b/sys/dev/adb/adb_kbd.c index 62fb70cd51f7..2bc5a79a7e2b 100644 --- a/sys/dev/adb/adb_kbd.c +++ b/sys/dev/adb/adb_kbd.c @@ -688,18 +688,10 @@ akbd_check_char(keyboard_t *kbd) static int set_typematic(keyboard_t *kbd, int code) { - /* These numbers are in microseconds, so convert to ticks */ - - 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 }; - if (code & ~0x7f) return EINVAL; - kbd->kb_delay1 = delays[(code >> 5) & 3]; - kbd->kb_delay2 = rates[code & 0x1f]; + kbd->kb_delay1 = kbdelays[(code >> 5) & 3]; + kbd->kb_delay2 = kbrates[code & 0x1f]; return 0; } diff --git a/sys/dev/atkbdc/atkbd.c b/sys/dev/atkbdc/atkbd.c index 0c9f2592d6b8..dcb5805982ff 100644 --- a/sys/dev/atkbdc/atkbd.c +++ b/sys/dev/atkbdc/atkbd.c @@ -1571,22 +1571,16 @@ 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]; + return (kbdelays[(i >> 5) & 3]); } static int typematic_rate(int i) { - return rates[i & 0x1f]; + return (kbrates[i & 0x1f]); } static int @@ -1595,13 +1589,13 @@ typematic(int delay, int rate) int value; int i; - for (i = nitems(delays) - 1; i > 0; --i) { - if (delay >= delays[i]) + for (i = nitems(kbdelays) - 1; i > 0; --i) { + if (delay >= kbdelays[i]) break; } value = i << 5; - for (i = nitems(rates) - 1; i > 0; --i) { - if (rate >= rates[i]) + for (i = nitems(kbrates) - 1; i > 0; --i) { + if (rate >= kbrates[i]) break; } value |= i; diff --git a/sys/dev/gpio/gpiokeys.c b/sys/dev/gpio/gpiokeys.c index 86f684535be9..e21b53db9a4c 100644 --- a/sys/dev/gpio/gpiokeys.c +++ b/sys/dev/gpio/gpiokeys.c @@ -975,17 +975,11 @@ gpiokeys_poll(keyboard_t *kbd, int on) static int gpiokeys_set_typematic(keyboard_t *kbd, int code) { - static const int delays[] = {250, 500, 750, 1000}; - static const 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}; - if (code & ~0x7f) { return (EINVAL); } - kbd->kb_delay1 = delays[(code >> 5) & 3]; - kbd->kb_delay2 = rates[code & 0x1f]; + kbd->kb_delay1 = kbdelays[(code >> 5) & 3]; + kbd->kb_delay2 = kbrates[code & 0x1f]; return (0); } diff --git a/sys/dev/hid/hkbd.c b/sys/dev/hid/hkbd.c index 6d9ad52469bb..922256a8f23b 100644 --- a/sys/dev/hid/hkbd.c +++ b/sys/dev/hid/hkbd.c @@ -1832,17 +1832,11 @@ hkbd_set_typematic(keyboard_t *kbd, int code) #ifdef EVDEV_SUPPORT struct hkbd_softc *sc = kbd->kb_data; #endif - static const int delays[] = {250, 500, 750, 1000}; - static const 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}; - if (code & ~0x7f) { return (EINVAL); } - kbd->kb_delay1 = delays[(code >> 5) & 3]; - kbd->kb_delay2 = rates[code & 0x1f]; + kbd->kb_delay1 = kbdelays[(code >> 5) & 3]; + kbd->kb_delay2 = kbrates[code & 0x1f]; #ifdef EVDEV_SUPPORT if (sc->sc_evdev != NULL) evdev_push_repeats(sc->sc_evdev, kbd); diff --git a/sys/dev/kbdmux/kbdmux.c b/sys/dev/kbdmux/kbdmux.c index 71f5dc7295e7..97ea7ba14a62 100644 --- a/sys/dev/kbdmux/kbdmux.c +++ b/sys/dev/kbdmux/kbdmux.c @@ -963,17 +963,6 @@ kbdmux_check_char(keyboard_t *kbd) static int kbdmux_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) { - 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 - }; - kbdmux_state_t *state = (kbdmux_state_t *) kbd->kb_data; kbdmux_kbd_t *k; keyboard_info_t *ki; @@ -1206,14 +1195,14 @@ kbdmux_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) int i; /* lookup delay */ - for (i = sizeof(delays)/sizeof(delays[0]) - 1; i > 0; i --) - if (((int *)arg)[0] >= delays[i]) + for (i = nitems(kbdelays) - 1; i > 0; i--) + if (((int *)arg)[0] >= kbdelays[i]) break; mode = i << 5; /* lookup rate */ - for (i = sizeof(rates)/sizeof(rates[0]) - 1; i > 0; i --) - if (((int *)arg)[1] >= rates[i]) + for (i = nitems(kbrates) - 1; i > 0; i--) + if (((int *)arg)[1] >= kbrates[i]) break; mode |= i; } else @@ -1225,8 +1214,8 @@ kbdmux_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) return (EINVAL); } - kbd->kb_delay1 = delays[(mode >> 5) & 3]; - kbd->kb_delay2 = rates[mode & 0x1f]; + kbd->kb_delay1 = kbdelays[(mode >> 5) & 3]; + kbd->kb_delay2 = kbrates[mode & 0x1f]; #ifdef EVDEV_SUPPORT if (state->ks_evdev != NULL && evdev_rcpt_mask & EVDEV_RCPT_KBDMUX) diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c index 0e964da3ef19..0dd6d41f7a8d 100644 --- a/sys/dev/usb/input/ukbd.c +++ b/sys/dev/usb/input/ukbd.c @@ -2002,17 +2002,11 @@ ukbd_set_typematic(keyboard_t *kbd, int code) #ifdef EVDEV_SUPPORT struct ukbd_softc *sc = kbd->kb_data; #endif - static const int delays[] = {250, 500, 750, 1000}; - static const 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}; - if (code & ~0x7f) { return (EINVAL); } - kbd->kb_delay1 = delays[(code >> 5) & 3]; - kbd->kb_delay2 = rates[code & 0x1f]; + kbd->kb_delay1 = kbdelays[(code >> 5) & 3]; + kbd->kb_delay2 = kbrates[code & 0x1f]; #ifdef EVDEV_SUPPORT if (sc->sc_evdev != NULL) evdev_push_repeats(sc->sc_evdev, kbd); diff --git a/sys/dev/vkbd/vkbd.c b/sys/dev/vkbd/vkbd.c index ebf9b09996c2..bb91c85b2718 100644 --- a/sys/dev/vkbd/vkbd.c +++ b/sys/dev/vkbd/vkbd.c @@ -1305,22 +1305,16 @@ vkbd_poll(keyboard_t *kbd, int on) * Local functions */ -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]); + return (kbdelays[(i >> 5) & 3]); } static int typematic_rate(int i) { - return (rates[i & 0x1f]); + return (kbrates[i & 0x1f]); } static int @@ -1329,13 +1323,13 @@ typematic(int delay, int rate) int value; int i; - for (i = nitems(delays) - 1; i > 0; i --) { - if (delay >= delays[i]) + for (i = nitems(kbdelays) - 1; i > 0; i--) { + if (delay >= kbdelays[i]) break; } value = i << 5; - for (i = nitems(rates) - 1; i > 0; i --) { - if (rate >= rates[i]) + for (i = nitems(kbrates) - 1; i > 0; i--) { + if (rate >= kbrates[i]) break; } value |= i; diff --git a/sys/sys/kbio.h b/sys/sys/kbio.h index 80a58bf8e51e..3b632bf96361 100644 --- a/sys/sys/kbio.h +++ b/sys/sys/kbio.h @@ -70,6 +70,13 @@ struct keyboard_info { }; typedef struct keyboard_info keyboard_info_t; +/* keyboard repeat rate mapping table */ +static const int kbdelays[] = { 250, 500, 750, 1000 }; +static const int kbrates[] = { 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 }; + /* add/remove keyboard to/from mux */ #define KBADDKBD _IOW('K', 68, keyboard_info_t) /* add keyboard */ #define KBRELKBD _IOW('K', 69, keyboard_info_t) /* release keyboard */ diff --git a/usr.sbin/kbdcontrol/kbdcontrol.c b/usr.sbin/kbdcontrol/kbdcontrol.c index 4f3be144132b..614734e6123a 100644 --- a/usr.sbin/kbdcontrol/kbdcontrol.c +++ b/usr.sbin/kbdcontrol/kbdcontrol.c @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include <fcntl.h> #include <sys/kbio.h> #include <sys/consio.h> +#include <sys/param.h> #include <sys/queue.h> #include <sys/sysctl.h> #include "path.h" @@ -70,13 +71,13 @@ static const char ctrl_names[32][4] = { static const char acc_names[15][5] = { "dgra", "dacu", "dcir", "dtil", "dmac", "dbre", "ddot", - "duml", "dsla", "drin", "dced", "dapo", "ddac", "dogo", + "duml", "dsla", "drin", "dced", "dapo", "ddac", "dogo", "dcar", }; static const char acc_names_u[15][5] = { "DGRA", "DACU", "DCIR", "DTIL", "DMAC", "DBRE", "DDOT", - "DUML", "DSLA", "DRIN", "DCED", "DAPO", "DDAC", "DOGO", + "DUML", "DSLA", "DRIN", "DCED", "DAPO", "DDAC", "DOGO", "DCAR", }; @@ -107,13 +108,8 @@ static const char fkey_table[96][MAXFK] = { /* 93-96 */ "" , "" , "" , "" , }; -static const int delays[] = {250, 500, 750, 1000}; -static const int repeats[] = { 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 const int ndelays = (sizeof(delays) / sizeof(int)); -static const int nrepeats = (sizeof(repeats) / sizeof(int)); +static const int ndelays = nitems(kbdelays); +static const int nrepeats = nitems(kbrates); static int hex = 0; static int paths_configured = 0; static int token; @@ -298,7 +294,7 @@ get_definition_line(FILE *file, keymap_t *keymap, accentmap_t *accentmap) if (token < 0) token = yylex(); - switch (token) { + switch (token) { case TNUM: c = get_key_definition_line(keymap); if (c < 0) @@ -751,7 +747,7 @@ dump_key_definition(char *name, keymap_t *keymap) dump_entry(keymap->key[i].map[j]); } printf("}, 0x%02X,0x%02X },\n", - (unsigned)keymap->key[i].spcl, + (unsigned)keymap->key[i].spcl, (unsigned)keymap->key[i].flgs); } printf("} };\n\n"); @@ -764,7 +760,7 @@ dump_accent_definition(char *name, accentmap_t *accentmap) int c; printf("static accentmap_t accentmap_%s = { %d", - name, accentmap->n_accs); + name, accentmap->n_accs); if (accentmap->n_accs <= 0) { printf(" };\n\n"); return; @@ -785,7 +781,7 @@ dump_accent_definition(char *name, accentmap_t *accentmap) } else printf(" 0x%02x, {", c); for (j = 0; j < NUM_ACCENTCHARS; j++) { - c = accentmap->acc[i].map[j][0]; + c = accentmap->acc[i].map[j][0]; if (c == 0) break; if ((j > 0) && ((j % 4) == 0)) @@ -793,7 +789,7 @@ dump_accent_definition(char *name, accentmap_t *accentmap) if (isascii(c) && isprint(c)) printf(" { '%c',", c); else - printf(" { 0x%02x,", c); + printf(" { 0x%02x,", c); printf("0x%02x },", accentmap->acc[i].map[j][1]); } printf(" }, },\n"); @@ -900,8 +896,8 @@ load_keymap(char *opt, int dumponly) fclose(file); return; } - if ((accentmap.n_accs > 0) - && (ioctl(0, PIO_DEADKEYMAP, &accentmap) < 0)) { + if ((accentmap.n_accs > 0) + && (ioctl(0, PIO_DEADKEYMAP, &accentmap) < 0)) { #ifdef OPIO_DEADKEYMAP to_old_accentmap(&accentmap, &oaccentmap); if (ioctl(0, OPIO_DEADKEYMAP, &oaccentmap) < 0) @@ -1058,14 +1054,20 @@ set_keyrates(char *opt) int r, d; if (!strcmp(opt, "slow")) { - delay = 1000, repeat = 500; - d = 3, r = 31; + delay = 1000; + repeat = 504; + d = 3; + r = 31; } else if (!strcmp(opt, "normal")) { - delay = 500, repeat = 125; - d = 1, r = 15; + delay = 500; + repeat = 126; + d = 1; + r = 15; } else if (!strcmp(opt, "fast")) { - delay = repeat = 0; - d = r = 0; + delay = 0; + repeat = 0; + d = 0; + r = 0; } else { int n; char *v1; @@ -1081,11 +1083,11 @@ badopt: return; } for (n = 0; n < ndelays - 1; n++) - if (delay <= delays[n]) + if (delay <= kbdelays[n]) break; d = n; for (n = 0; n < nrepeats - 1; n++) - if (repeat <= repeats[n]) + if (repeat <= kbrates[n]) break; r = n; } @@ -1093,6 +1095,7 @@ badopt: arg[0] = delay; arg[1] = repeat; if (ioctl(0, KDSETREPEAT, arg)) { + warn("fallback, setting keyboard rate via legacy interface (KDSETRAD), will be removed soon"); if (ioctl(0, KDSETRAD, (d << 5) | r)) warn("setting keyboard rate"); } @@ -1151,7 +1154,7 @@ set_keyboard(char *device) } /* * The keyboard device driver won't release the keyboard by - * the following ioctl, but it automatically will, when the device + * the following ioctl, but it automatically will, when the device * is closed. So, we don't check error here. */ ioctl(fd, CONS_RELKBD, 0);