Skip to content

Raspberry Pi Display Auto Switching

superjamie edited this page Jul 16, 2016 · 1 revision

I've come across several people who wish to have a Raspberry Pi handheld with a composite/SPI screen when operating as a handheld, yet have the option to plug into a HDMI display when they're at home or near a display.

As far as I know, the display cannot be switched live. You can't be playing on the handheld display, plug into HDMI, and continue where you left off.

However, you can detect the HDMI state on boot with tvservice, change the config.txt options, and reboot again. This script automates that process at boot time.

To use the HDMI display: Power down, plug in HDMI, power on.

To use the composite/SPI display: Power down, unplug HDMI, power on.

The Script

Put this script somewhere like /bin/displaydetect.sh and set it executable with chmod +x /bin/displaydetect.sh

#!/bin/bash

# this is the config.txt parameter you want to change
MYTHING="overscan_scale"

# store the output of the tvservice commands
TVN=$(/opt/vc/bin/tvservice -n)
#TVS=$(/opt/vc/bin/tvservice -s)

# if the above command matches the HDMI display detected pattern
if [ $(echo "$TVN" | egrep -c "device_name") -gt 0 ]
then
    # we're plugged into HDMI
    OUTPUT="hdmi"
else
    # we're plugged into Composite
    OUTPUT="comp"
fi

# when plugged into HDMI, run this
if [ "$OUTPUT" == "hdmi" ]
then
    # if a line starts "my_parameter" without a comment
    if [ $(egrep -c "^$MYTHING" /boot/config.txt) -gt 0 ]
    then
        # comment out the parameter and reboot
        sed -i -e "s/^$MYTHING/#$MYTHING/g" /boot/config.txt
        reboot
    fi
fi

# when plugged into Composite, run this
if [ "$OUTPUT" == "comp" ]
then
    # if a line starts "#my_parameter" commented out
    if [ $(egrep -c "^#$MYTHING" /boot/config.txt) -gt 0 ]
    then
        # uncomment the parameter and reboot
        sed -i -e "s/^#$MYTHING/$MYTHING/g" /boot/config.txt
        reboot
    fi
fi

Edit /etc/rc.local so it runs that script, and also set that executable with chmod +x /etc/rc.local

If you wish to add additional parameters like overscan left/right/top/bottom, you can create additional variables like MYTHINGA and MYTHINGB and duplicate the sed commands.

Reference post:

About

This is a wiki of useful advice I commonly give or have seen on places like StackExchange and Reddit. Sometimes I will link directly to useful posts, sometimes I will make a page on here and curate content.

License

Unless otherwise noted per-page, all information here is provided under Creative Commons - Attribution - Share Alike. Anyone can steal this stuff, but you must give credit and you must provide others the same rights.

Money

If you wish to give a financial thanks for any advice, please do not send me anything. Instead, make a donation to an animal rescue charity or environmental charity in your area.

Clone this wiki locally