Posted on :: Tags:

As an avid gamer with limited free time, I found myself facing a common dilemma: how to maximize my gaming sessions without spending precious minutes on setup. I wanted to create a seamless gaming experience that would allow me to start playing almost instantly, comfortably lounging on my sofa. My goal was clear - minimal setup time, maximum comfort.

Oh yeah, and for cheap.

I had a Raspberry Pi 3B lying around, but I wasn't sure it would be capable of streaming Steam games in 60 fps from my desktop to my TV in the same room. But sure as hell I was gonna find out. Oh, boy...

Valve does not support Steamlink on Raspberry properly so I needed all kinds of black magic to make this work.

This was a weeks long adventure peppered with lots of swearing and screaming at inanimate objects but here we go. Specs and setup at the end of the article.

Credit: Christian Deacon's article was very helpful in setting this all up and debugging it: Setup Steam Link on Raspberry Pi

The Vision: Instant Gaming on Demand

My ideal scenario was simple: I wanted to be able to turn on my Samsung Q90N TV, press a button on the remote (thanks to Anynet+), and immediately jump into my game. No fiddling with multiple devices, no long loading times, just instant access to my entire Steam library displayed on a large, comfortable screen (obvisouly my Linux desktop has to run for this to work).

With limited gaming time available, I couldn't afford to spend 5-10 minutes setting things up each time I wanted to play.

Initial Challenges

I spent weeks trying different Raspberry Pi OS versions, each attempt ending in frustration. The issues were varied and persistent. Sometimes, the SteamLink app wouldn't even start. Other times, it would run, but performance was abysmal.

Don't get me started on the "why the fuck does the sound not work???" ordeal (pro tip: change raspberry's audio output to HDMI, duh. In the GUI, it's in the upper right hand corner of the screen).

The most infuriating problem was the screen blanking issue. I'd set everything up, start a gaming session, and if I left it idle for a while, the TV would lose signal from the Raspberry Pi.

No amount of button mashing would bring it back to life. The only solution was to SSH into the Pi and reboot it - exactly the kind of time-consuming process I was trying to avoid.

I tried tweaking the config.txt file, adding lines like hdmi_force_hotplug=1 and hdmi_safe=1, hoping these would solve the signal loss issue. But while these settings seemed to keep the HDMI signal alive, they introduced new problems.

My frame rate became inconsistent and jittery, even though Steam and the Raspberry Pi's diagnostics both reported a steady 60 FPS.

The Breakthrough: Successful Configuration

After countless hours of troubleshooting and what felt like a hundred reboots, I finally found the magic combination of settings that worked.

Raspberry Pi Setup

The first key was using the right OS. I settled on the bullseye distro , installed directly from the rpi-imager. This provided the stability I needed for SteamLink to function properly.

Next came the crucial /boot/config.txt modifications. Counter to what you might expect, I found that removing hdmi_force_hotplug=1 and hdmi_safe=1 actually improved my situation.

The game-changer (pun intended) was setting config_hdmi_boost=9, up from the default of 4. This significantly boosted the HDMI signal strength, preventing the TV from losing connection even after long periods of inactivity.

Even 7 was not enough, I believe the max is 14, but then they advise that might overheat the Pi which I definitely didn't want.

I also tweaked the video RAM, giving it 256MB in /boot/config.txt, and made sure to change the audio output to HDMI in the Raspberry Pi's GUI settings.

Final config.txt setup is this:

# For more options and information see
# http://rpf.io/configtxt
# Some settings may impact device functionality. See link above for details

# uncomment if you get no picture on HDMI for a default "safe" mode
# hdmi_safe=1

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16

# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
# hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
hdmi_group=1
hdmi_mode=16

# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2

# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
config_hdmi_boost=9

# uncomment for composite PAL
#sdtv_mode=2

#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=1000

# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on

# Uncomment this to enable infrared communication.
#dtoverlay=gpio-ir,gpio_pin=17
#dtoverlay=gpio-ir-tx,gpio_pin=18

# Additional overlays and parameters are documented /boot/overlays/README

# Enable audio (loads snd_bcm2835)
dtparam=audio=on

# Automatically load overlays for detected cameras
camera_auto_detect=1

# Automatically load overlays for detected DSI displays
display_auto_detect=1

# Enable DRM VC4 V3D driver
dtoverlay=vc4-kms-v3d
max_framebuffers=2

# Disable compensation for displays with overscan
disable_overscan=1

[cm4]
# Enable host mode on the 2711 built-in XHCI USB controller.
# This line should be removed if the legacy DWC2 controller is required
# (e.g. for USB device mode) or if USB support is not required.
otg_mode=1

[all]

[pi4]
# Run as fast as firmware / board allows
arm_boost=1

[all]
gpu_mem=256

Linux Host Configuration

On my Pop!_OS desktop, this is my Steam Remote Play setup:

Steam Remote Play Setup

Funny enough, Low Latency Networking made it a LOT worse, so I had to turn it off. Raspberry was connected via ethernet, and the speed test showed 90 Mbits/s stable connection (Pop!_Os also has wired connection).

Optimized Workflow To streamline the process even further, I set up the Raspberry Pi to boot directly into TTY mode instead of loading the full GUI.

sudo systemctl set-default multi-user.target

After a fat reboot, all was good.

Note:

If I ever want to get back to GUI mode automatically:

sudo systemctl set-default graphical.target or simply just startx or hit Alt + F7 (going to TTY mode from GUI is Ctrl + Alt + F1)

This saved precious seconds on startup and reduced the strain on the Pi's resources.

The actual workflow now is beautifully simple. SteamLink runs in TTY mode (no X11 support needed, oh wait, Steamlink doesn't even start in X11).

After the initial pairing with a PIN, it just works. I can play a game, stop when I need to, and simply turn off the TV. The Pi continues streaming in the background, so when I turn the TV back on, I can pick up right where I left off.

Key Factors

Looking back, the key factors that made this setup successful were:

  • Proper HDMI signal boosting (config_hdmi_boost=9)
  • Removing unnecessary HDMI settings that were causing more harm than good
  • Optimizing Steam settings on the Linux host for smooth streaming
  • Booting directly into TTY mode for faster startup and better resource management

Benefits of the Final Setup

Now, I have exactly what I wanted:

  • Instant gaming with minimal startup time. I turn on the TV, press OK on the remote (which can control attached devices like the Raspberry Pi), and SteamLink streaming starts immediately at a buttery smooth 60 fps.
  • Comfortable gaming on my large Samsung Q90N TV.
  • All my games and saves are centralized on my main desktop, no need to manage multiple devices.
  • I can use my Xbox Series X controller connected directly to my desktop, eliminating any potential input lag from the Raspberry Pi.

Troubleshooting Tips

For anyone attempting a similar setup, here are some key troubleshooting tips:

  • Don't assume that commonly suggested settings like hdmi_force_hotplug=1 and hdmi_safe=1 will solve your problems. In my case, removing these improved performance.
  • If you're experiencing signal loss, try increasing the HDMI signal strength with config_hdmi_boost.
  • Pay attention to your Steam host settings. Enabling hardware encoding and network traffic prioritization can make a big difference.
  • Consider booting your Pi directly into TTY mode for better performance.

Conclusion

I viewed this as a challenge - I could have just bought a homelab server with a beefy processor - but why spend hundreds of dollars on it, when the existing gadgets can solve the problem?

For anyone out there struggling with a similar project: hit me up, if you need help! No need to lose as much as I did in the process.

Happy gaming, and may your streams be ever lag-free!

Appendix

Kernel:

uname -r
6.1.21-v7+
cat /etc/*-release

PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)"
NAME="Raspbian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

cat /proc/cpuinfo
processor       : 0
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 38.40
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd3
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 1
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 38.40
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 2
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 38.40
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 3
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 38.40
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

Hardware        : BCM2835
Revision        : a52082
Serial          : 000000005dd3bd5b
Model           : Raspberry Pi 3 Model B Rev 1.2