mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 04:43:53 +00:00
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:
parent
034c085601
commit
971bac5ace
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue