git: 971bac5ace7a - main - kbd: consolidate kb interfaces (phase one)

From: Warner Losh <imp_at_FreeBSD.org>
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);