Steam Deck - ZFEbHVUE/Batocera-CRT-Script GitHub Wiki

⚠️ Warning: Work in progress!!

Steam Deck

A quick, field-tested guide to running Batocera-CRT-Script on the Steam Deck and outputting analog video to a CRT.


TL;DR (what worked)

Why: In practice, several “USB-C hubs with DP Alt Mode” failed to pass a stable low dot-clock path needed for CRT timings. Splitters made for AR glasses (power + video) were more reliable when paired with a known-good USB-C→VGA (RTD2166) cable.


Known-good chains (examples)

  1. Steam Deck → StarTech USB-C→VGA (CDP2VGA3MBNL) → Antonio Villena VGA→S-Video → CRT
    Status: Works. Slight resolution-switch delay (typical of DP/USB-C DACs).

  2. Steam Deck → VITURE USB-C “glasses” splitter → StarTech USB-C→VGA (CDP2VGA3MBNL) → Rondo HD15-to-SCART → RetroTINK RGB2COMP → Component → CRT
    Status: Works. Stable after Switchres override tweaks (see below).

Quick sanity check used: Tekken 3 resolution-switch test. Expect a small mode-switch delay compared to native VGA/DVI-I.


Switchres override on Steam Deck

Goal: Give low dot-clock modes a stable path and ensure proper parity rules on DCN hardware.

  1. Copy the system default to the RetroArch override:
    cp /etc/switchres.ini /userdata/system/configs/retroarch/

  2. Edit the copy at /userdata/system/configs/retroarch/switchres.ini:

    Set dotclock_min and test in small steps until you find the lowest stable value:

dotclock_min 2

Then try, one at a time: 2, 4, 5, 6, 7, 8, 10, 12, 16, 20, 25
Keep the lowest value that locks cleanly on your chain.
Max dot clock floor used here is 25 MHzdotclock_min 25.
With super-resolutions, using a slightly higher floor won’t hurt.

Confirm parity rule is present (Steam Deck = DCN):

interlace_force_even 1

Hierarchy reminder (most specific first):
/userdata/system/configs/retroarch/config/<core_name>/switchres.ini
/userdata/system/configs/retroarch/switchres.ini
/etc/switchres.ini

Use a per-core file if only certain cores need a different dotclock_min.


Verify your build

Run these on the Deck:

  • Show current resolution under X
    DISPLAY=:0 batocera-resolution currentResolution

  • Confirm DCN detection and parity decision in the 15 kHz build log
    grep -E 'Engine detect|Parity decision' /userdata/system/logs/BUILD_15KHz_Batocera.log

  • Ensure the parity rule exists in the effective INI you are using
    grep -n 'interlace_force_even' /etc/switchres.ini

Expected snippets:

  • Engine detect: ... DCN ...
  • Parity decision: interlace_force_even=1 (engine=DCN)

Troubleshooting

  • Black or rolling image at 240p/480i:
    Adjust dotclock_min in the override INI (/userdata/system/configs/retroarch/switchres.ini) by stepping through low values until you get a stable lock.
    Try: 2, 4, 5, 6, 7, 8, 10, 12, 16, 20, 25 — keep the lowest value that locks cleanly.
    (Max floor used here is 25 MHz. With super-res, a slightly higher floor won’t hurt.)

  • Sync OK in PSX or SNES but others unstable:
    Try per-core overrides at /userdata/system/configs/retroarch/config/<core_name>/switchres.ini with a slightly different dotclock_min.

  • No video via a USB-C hub or dock:
    Swap the hub for an AR-glasses style splitter (power + video) and keep the StarTech CDP2VGA3MBNL as the VGA DAC.

  • Long mode-switch pauses:
    Expected vs native analog. Harmless, just slower than DVI-I or VGA.


Hardware links


Notes from testing

  • Batocera: v42 Stable
  • CRT profile: for example MS929
  • Outcome: First-try success. Mega Drive and SNES needed a small dotclock tweak.

Screenshots

Media

  • Tekken 3 (YouTube)
Steam Deck CRT demo (YouTube)
  • Old Towers (YouTube)
Steam Deck CRT demo (YouTube)
  • Crystal Breakers (YouTube)
Steam Deck CRT demo (YouTube)
⚠️ **GitHub.com Fallback** ⚠️