Connecting a MiSTer FPGA to an iiRcade Cabinet with the GRS Viper KVM Switcher (Step‑by‑Step)
I’ve always loved tinkering with arcade games, from my childhood, to my teenage years when my mom operated an arcade, and beyond. So, when the idea came up to connect my MiSTer FPGA setup to my iiRcade cabinet, I had to make it happen. The solution ended up being the GRS Viper KVM switcher, and here’s exactly how I wired it and configured MiSTer so you can replicate it.
The iiRcade cabinet is great, but I wanted flexibility. The MiSTer opens up a massive library of classic arcade and console cores, and with the Viper KVM I can switch between the iiRcade’s stock system and the MiSTer with the press of a button. No unplugging cables, no mess, just seamless switching.
DE10‑Nano + SDRAM add‑on (MiSTer). The USB hub and I/O board aren’t strictly necessary, but they don’t hurt.
GRS Viper KVM switcher (handles video, controls, and audio routing)
HDMI cable (keep it short for tidiness)
USB‑A ⇄ USB‑C cable (for controls via the KVM's USB‑C Input B)
Optional: Keyboard for initial MiSTer configuration
Optional: Ethernet if you’re using a NAS (I use RetroNAS)
Power: I use a Raspberry Pi 3B+ PSU with an inline switch (micro‑USB) and a micro‑USB→DC barrel converter. You could pull 5V from the KVM with a buck converter (12/24V→5V) to keep it self‑contained, but I stuck with a known‑good supply.
HDMI (video): MiSTer HDMI → KVM HDMI Input B
USB (controls + internal hub): MiSTer USB‑A → KVM USB‑C Input B (this attaches joysticks, buttons, trackball, and spinners to MiSTer)
Power: MiSTer powered by external PSU; KVM powered per its install guide
Step 1: Mount & Place Hardware
Mount the Viper KVM where you can reach the switch but it won’t snag wires.
Tuck the MiSTer somewhere with airflow.
(Optional) Route an Ethernet cable into the cab if you’re using RetroNAS or want easy updates.
Yep, this is what the KVM board looks like.
Run MiSTer HDMI → KVM HDMI Input B.
Ensure the KVM's LVDS harness is seated and going to the iiRcade display as per the KVM's instructions.
Don’t worry about scaling yet, we’ll set MiSTer to the iiRcade panel’s sweet spot in software.
HDMI from MiSTer connected to Viper KVM
The iiRcade panel is GPIO internally, but the Viper KVM includes a USB encoder that exposes the sticks/buttons as an Xbox 360 (XInput) controller.
Run MiSTer USB‑A → KVM USB‑C Input B.
That single cable attaches the internal hub (sticks, buttons, trackball, spinners) to MiSTer.
We’ll tweak MiSTer so it treats the two sticks as separate pads instead of a merged controller.
Disconnect the USB-C cable from KVM Input B and connect your MiSTer as shown.
If all went well, you should have something like this now.
Step 4: Software (MiSTer.ini)
This is where it all comes together. We’ll set the panel’s resolution, un‑merge the two gamepads, and (optionally) make the panel’s volume buttons work in XInput mode.
4.1 Set the iiRcade Panel Resolution
The iiRcade’s panel is happiest at 1280×1024 @ 60 Hz. In MiSTer.ini:
; 1280x1024 @ 60 Hz
video_mode=4
If you see scaling quirks, verify your core’s video settings aren’t forcing a different mode.
After saving, reboot MiSTer to apply.
4.2 Treat Both Sticks as Separate Controllers
By default, the KVM's encoder can present both control halves under a single VID/PID (merged). Tell MiSTer not to merge these so each side becomes its own pad:
; Prevent merging of the two XInput pads from the KVM encoder
no_merge_vid=0x045E
no_merge_pid=0x028E
After this change, reboot so MiSTer re‑enumerates devices.
4.3 Make Volume Buttons Work in XInput Mode (Optional but Recommended)
In XInput mode, the iiRcade panel’s volume keys don’t emit standard keyboard scancodes; they show up as analog axes. I patched MiSTer to add INI keys that let us bind these to volume up/down without breaking other 360 pads.
Add this block to MiSTer.ini:
; Some arcade panels expose volume through analog axes (XInput).
; Enable per‑device mapping by VID/PID and chosen axes.
; GRS Viper KVM (Xbox 360 encoder):
volume_abs_vid=0x045E
volume_abs_pid=0x028E
volume_abs_down=2
volume_abs_up=5
This requires a MiSTer build that includes my patch. PR: https://github.com/MiSTer-devel/Main_MiSTer/pull/1029 If you’re on a stock build without this patch, you can still adjust volume via the OSD or map alternative keys, but this makes the panel’s dedicated buttons work like they should.
EDIT: This part isn't necessary. The MiSTer dev doesn't want this cluttering up the main release, apparently we give this controller "too much attentions". So, I forked it with a patch specifically for this deck.
Step 5: First Boot & Input Mapping
Turn on the MiSTer before powering the iiRcade cabinet. I recommend this because the KVM will backfeed 5V power through the HDMI port to the MiSTer, and this minimizes the risk of hardware damage.
Open the OSD (F12 or the MiSTer button) → Define joystick buttons and walk through binding for Player 1 and Player 2.
Test: Trackball/spinners should enumerate as separate HID axes through the same hub.
If either stick doesn’t show up: re‑seat the USB‑C cable, confirm no_merge_* is in place, and unplug/re‑plug so MiSTer re‑scans USB.
Step 6: (Optional) Network Storage with RetroNAS
I use RetroNAS to serve my cores/ROMs/artwork centrally. On MiSTer, enable CIFS/SMB and mount your shares. Keeping everything on the network simplifies updates and keeps the SD card clean.
No picture / wrong aspect: Double‑check video_mode=4 and that the HDMI is on Input B. Reboot after INI edits.
Only one controller detected: Ensure no_merge_vid/pid are set and match 0x045E/0x028E. Power‑cycle MiSTer.
Volume buttons don’t work: Confirm you’re running a build with the volume button patch.
Lag or jitter on spinners/trackball: Use a short, good‑quality USB‑C cable for Input B; avoid cheap hubs between MiSTer and the KVM.
Honestly, it feels like the MiSTer was meant to live in the iiRcade. The controls map over beautifully, video is crisp, and audio is solid. One moment I’m playing the iiRcade’s native library, the next I’m deep into arcade‑perfect classics on the MiSTer.
If you’ve got an iiRcade and a MiSTer sitting around, the GRS Viper KVM is hands‑down the cleanest way to bring them together. It isn’t complicated, and once you’ve got it set up, you’ll wonder why you didn’t do it sooner.
Appendix: Full MiSTer.ini Snippet (copy/paste)
; === iiRcade + GRS Viper KVM ===
video_mode=4
; Treat both sticks as separate pads (don’t merge the Xbox 360 VID/PID)
no_merge_vid=0x045E
no_merge_pid=0x028E
; Optional: map iiRcade panel volume axes in XInput mode (requires patched Main_MiSTer)
volume_abs_vid=0x045E
volume_abs_pid=0x028E
volume_abs_down=2
volume_abs_up=5
EDIT: Forget the volume_abs_* parts. Apparently this is "too niche" for a "poorly designed" controller that "didn't even succeed its kickstarter". Soooo... Here's a fork with hardcoded PID/VID for the deck.
UPDATE: I mentioned previously that it would be possible to power the MiSTer internally using a buck converter, but opted not to at the time for simplicity's sake. Yesterday I decided I wanted to do something about this, so I constructed a power cable from a pair of male and female DC power connectors and an LM2596 Buck Converter.
I then connected a DC power splitter to the cable going into the iiRcade motherboard, with one end going to the iiRcade mobo, and the other end to this cable and into the MiSTer. The results so far have been just as I expected, it's been running all day yesterday and all night last night with no problems.