All I know is OP is having issues that I've somehow managed to solve before, even though I'm only a hobbyist and they the expert.
One trick I'd consider here is using NX138AKR N-channel MOSFETs on both columns and rows to boost the actual button voltage to 12V-16V (whatever is easily available on the system). I prefer NX138AKR over BSS138's, because although they have very similar specs, NX138AKR are faster (smaller total gate capacitance); and they have sufficiently low V
GS(th) that they fully conduct at 2.5V or so, plenty of diode headroom for 3.3V logic. With sufficiently strong pull-up resistors on inputs and diode for each button (or half a diode pair, or quarter of a dual common anode pair in SOT23-6), you can increase the power needed to toggle the input state to above the EMI noise floor, regardless of what the microcontroller can source or sink. The exact (high) voltage doesn't matter, either, so you can heavily filter it (using say a capacitive multiplier or a Pi filter on the PCB, just before the MOSFETs); the NX138AKR gate can withstand ±20V with respect to source (which here would be ground in all 7+4 cases).
Another trick is twisting each button wire pair (signal and return) to minimize loop area. Arcade buttons are often microswitch-based, so needing foot long wires between each button and the PCB is common. Although cabinets tend to be
slightly EM noisy (several SMPS, display backlight PWM flicker nearby, long leads), twisting
usually suffices. In even noiser systems I'd definitely use shielded cable between PCB and each button, say Belden 9451, Tasker C114, Tasker C121 –– these "microphone cables" have served me well in such use, as long as I ground the shield properly. I suspect, but have not tested in practice, that a resistor-capacitor parallel single point connection between the PCB ground and each button cable shield would also help (as it would act as a low-pass filter for any EMI coupled to the cable shield, before it reaches the PCB ground).
I would also use a microcontroller with native USB so I can do a direct USB HID interface, and not need any Serial-to-uinput daemon running on the host. Much simpler, much more robust; no drivers or applications needed on Linux that way.
Teensy LC used to be perfect for this, but they're no longer made –– I've even done a few carrier boards for gamepads and such –– but
Teensy 4.0 is just as easy to use, only costs a bit more (currently approx. 24 USD). I've also used ATmega32u4 (Arduino Pro Micro clones, based on the SparkFun Pro Micro but using Leonardo bootloader) and AT90USB1286 (Teensy 2.0++) 8-bit AVRs, and have a couple of projects I'm not finished yet using
WCH CH552G's. For the CH552G's, I recommend either using
wagiminator's CH55xG DevBoard, or basing your own board design on it. I trust wagiminator's design more than my own: more experience in that sort of stuff. CH55x do not even need a crystal for USB Full Speed stuff, so are very, very easy to implement. JLCPCB has CH552G's in stock for assembly, so you can have such boards made for your exact requirements for very little money.
Teensiest are easiest to develop for, because the
Teensyduino add-on gives you a menu in Arduino IDE to select what kind of USB device you want your microcontroller to be: the
Keyboard ones allowing a very easy interface via the automagically-exposed
Keyboard object to send the exact keypresses (as if from an actual keyboard, without any Linux/host-side driver assistance). All you need is a loop to check the keyboard matrix, debounce buttons, and send key press and release events when necessary. With AVRs and CH55xG's there is a bit more set up to do, and CH55x's are limited to C (compared to the C++ that Arduino sketches are normally based on) as it uses the
Small Device C Compiler instead of GCC.
Using a cheap cast aluminium enclosure (like Hammond 1550A, 1550B, 1550P, 1590A – might need a bigger one to fit 28 2-pin connectors on the PCB; I recommend 2.0mm pitch JST PH2.0 ones), with the board connected to the lid using M2.5 nylon stand-offs, only wires poking out with all connectors inside the enclosure, cable shields connected to the enclosure, and the entire enclosure grounded at a single point (perhaps via a resistor-capacitor filter), would seriously limit any EM noise from coupling to the buttons and HID logic. If it works correctly when someone is stick welding within a meter or so, I think it should withstand a noisy servo or a couple of motors nearby too. Also, with a bit of silicone (I like using the automotive safe-for-electronics stuff in a tube) to insulate the cable and wire passthroughs and the lid, you can make it spray-proof against typical coolants. And you won't break anything if you happen to hit the box with a chuck key.
Never underestimate the solutions even hobbyists have discovered. Experience is experience, even if it is only at the hobbyist level, and not at proper electrical engineering or PCB design level.