summaryrefslogtreecommitdiff
path: root/sys/dev/usb/input
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2020-03-30 15:29:39 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2020-03-30 15:29:39 +0000
commit8e2e5ae7d1804c45e12876c412edbcc13f735dd3 (patch)
tree6f80b9d1ff17772b510b17a07f712de495e47924 /sys/dev/usb/input
parent9b1d850be89f83b4a427318745e2f90cdec1854e (diff)
Notes
Diffstat (limited to 'sys/dev/usb/input')
-rw-r--r--sys/dev/usb/input/ukbd.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c
index 355dbdb21475..33e137dbbfae 100644
--- a/sys/dev/usb/input/ukbd.c
+++ b/sys/dev/usb/input/ukbd.c
@@ -499,6 +499,21 @@ ukbd_interrupt(struct ukbd_softc *sc)
UKBD_LOCK_ASSERT();
+ /* Check for modifier key changes first */
+ for (key = 0xe0; key != 0xe8; key++) {
+ const uint64_t mask = 1ULL << (key % 64);
+ const uint64_t delta =
+ sc->sc_odata.bitmap[key / 64] ^
+ sc->sc_ndata.bitmap[key / 64];
+
+ if (delta & mask) {
+ if (sc->sc_odata.bitmap[key / 64] & mask)
+ ukbd_put_key(sc, key | KEY_RELEASE);
+ else
+ ukbd_put_key(sc, key | KEY_PRESS);
+ }
+ }
+
/* Check for key changes */
for (key = 0; key != UKBD_NKEYCODE; key++) {
const uint64_t mask = 1ULL << (key % 64);
@@ -509,6 +524,8 @@ ukbd_interrupt(struct ukbd_softc *sc)
if (mask == 1 && delta == 0) {
key += 63;
continue; /* skip empty areas */
+ } else if (ukbd_is_modifier_key(key)) {
+ continue;
} else if (delta & mask) {
if (sc->sc_odata.bitmap[key / 64] & mask) {
ukbd_put_key(sc, key | KEY_RELEASE);
@@ -519,9 +536,6 @@ ukbd_interrupt(struct ukbd_softc *sc)
} else {
ukbd_put_key(sc, key | KEY_PRESS);
- if (ukbd_is_modifier_key(key))
- continue;
-
sc->sc_co_basetime = sbinuptime();
sc->sc_delay = sc->sc_kbd.kb_delay1;
ukbd_start_timer(sc);