I recently purchased a Minisforum MS-A2 figuring I'd use it as a CI machine for Zig since we've been improving our FreeBSD support substantially lately. Unfortunately, I ran into a bit of a showstopper: In the FreeBSD 14.3 installer (and live shell), modifier keys - Shift, Ctrl, etc - are not recognized at all. This makes typing some characters impossible(?), thus preventing me from properly completing the installation. I've tried several different USB keyboards and different USB ports to no avail - the same issue occurs regardless. It also does not seem to matter which keymap I select during installation (I tried US and Danish, FWIW). I confirmed with a Debian netinst image that modifier keys work fine there, so I'm not sure it's a hardware issue per se. I'm relatively new to actually operating a FreeBSD system so please let me know if there's any more useful information I can provide to diagnose this.
Are you able to test 15.0-ALPHA1 instead of 14.3? In between we changed the driver architecture for HID-based drivers, so there's a chance your problem is gone. It would also be useful to see a copy of the dmesg from a booted system.
(In reply to Mark Johnston from comment #1) I still see the same issue with 15.0-ALPHA1. I did notice this time that modifier keys work fine in the loader prompt, though I don't recall whether that was the case with 14.3. What would be the best way for me to get dmesg output off the machine given that I can't actually input non-trivial commands without a working Shift key?
(In reply to Alex Rønne Petersen from comment #2) If you've managed to get the network working you can use https://termbin.com/ % dmesg | nc termbin.com 9999
Created attachment 265378 [details] dmesg from booting with a keyboard, HDMI, and ethernet plugged in So I actually managed to get FreeBSD installed on the machine in the meantime (despite the keyboard issues), so getting the dmesg off the machine via ssh is easy now. I just totally forgot to go and upload it here, sorry!
I'm fairly certain this issue has nothing to do w/ the MS-A2 at all. This bug presents itself only on specific keyboards, so getting the keyboard model itself is the most crucial piece of information. I ran into this exact issue w/ the 8BitDo Retro Keyboard (Model: 85HA) This issue is present on FreeBSD 13.0-RELEASE through 15.0-RCs. Prior to 13.0, the keyboard flat out doesn't work at all (USB detection works, no key presses register, and turning capslock on/off via another keyboard doesn't modify the LEDs on it), but that part doesn't matter since 12.x is ancient. On the latest 15.0 RC build this week, the keyboard works except for modifiers. Lock keys properly register their status and LEDs toggle properly. No modifier key works, which includes shift, alt, control, "super", and more. There was a discussion about this issue earlier this year on the FreeBSD Discord server and I had done some deeper diving where I disabled some of the USB checks in the HID driver, which enabled the modifier keys to work on this keyboard, but significantly broke other things. This is purely a Keyboard HID descriptor issue, as this and some other "gamer" keyboards register themselves a little differently. At this point, I think we need to start compiling a list of "broken" keyboard models and getting these in the hands of developers that know and understand the keyboard HID code better than I do.
As a quick followup, I went and found that original discussion on Discord: https://discord.com/channels/727023752348434432/1372409106312204378/1394356379522695199 And here was the diff I used for testing. As noted previously, this "fixed" the modifiers, but caused other problems, so its not a REAL fix. I don't recall off the top of my head what all it broke otherwise, but I do remember it was an issue and why I never submitted it as a patch. diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c index 57e9beac3..5034f2c27 100644 --- a/sys/dev/usb/input/ukbd.c +++ b/sys/dev/usb/input/ukbd.c @@ -761,9 +761,9 @@ ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error) continue; /* skip empty areas */ } else if (~valid & mask) { continue; /* location is not valid */ - } else if (id != sc->sc_id_loc_key[i]) { - continue; /* invalid HID ID */ - } else if (i == 0) { +// } else if (id != sc->sc_id_loc_key[i]) { +// continue; /* invalid HID ID */ + } else if ((i == 0) && (id == sc->sc_id_loc_key[i])) { struct hid_location tmp_loc = sc->sc_loc_key[0]; /* range check array size */ if (tmp_loc.count > UKBD_NKEYCODE)
(In reply to Vincent Milum Jr from comment #5) FWIW, I have the exact same modifier problem on a UHK 80 (https://uhk.io/uhk80).