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
This commit is contained in:
Michael 2023-07-06 20:32:45 -06:00 committed by Warner Losh
parent 034c085601
commit 971bac5ace
9 changed files with 61 additions and 100 deletions

View file

@ -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;
}

View file

@ -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;

View file

@ -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);
}

View file

@ -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);

View file

@ -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)

View file

@ -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);

View file

@ -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;

View file

@ -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 */

View file

@ -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 @@ set_keyrates(char *opt)
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 @@ set_keyrates(char *opt)
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);