#!/bin/bash
|
|
|
|
if [ $(id -u) -ne 0 ]; then
|
|
echo "Installer must be run as root."
|
|
echo "Try 'sudo bash $0'"
|
|
exit 1
|
|
fi
|
|
|
|
clear
|
|
|
|
echo "This script enables basic PiTFT display"
|
|
echo "support for portable gaming, etc. Does"
|
|
echo "not cover X11, touchscreen or buttons"
|
|
echo "(see adafruit-pitft-helper for those)."
|
|
echo "HDMI output is set to PiTFT resolution,"
|
|
echo "not all monitors support this, PiTFT"
|
|
echo "may be only display after reboot."
|
|
echo "Run time ~5 minutes. Reboot required."
|
|
echo
|
|
echo -n "CONTINUE? [y/N] "
|
|
read
|
|
if [[ ! "$REPLY" =~ ^(yes|y|Y)$ ]]; then
|
|
echo "Canceled."
|
|
exit 0
|
|
fi
|
|
|
|
# FEATURE PROMPTS ----------------------------------------------------------
|
|
# Installation doesn't begin until after all user input is taken.
|
|
|
|
# Given a list of strings representing options, display each option
|
|
# preceded by a number (1 to N), display a prompt, check input until
|
|
# a valid number within the selection range is entered.
|
|
selectN() {
|
|
for ((i=1; i<=$#; i++)); do
|
|
echo $i. ${!i}
|
|
done
|
|
echo
|
|
REPLY=""
|
|
while :
|
|
do
|
|
echo -n "SELECT 1-$#: "
|
|
read
|
|
if [[ $REPLY -ge 1 ]] && [[ $REPLY -le $# ]]; then
|
|
return $REPLY
|
|
fi
|
|
done
|
|
}
|
|
|
|
echo
|
|
echo "Select project:"
|
|
selectN "PiGRRL 2" \
|
|
"Pocket PiGRRL" \
|
|
"PiGRRL Zero" \
|
|
"Cupcade (horizontal screen)" \
|
|
"Cupcade (vertical screen)" \
|
|
"Configure options manually"
|
|
PROJ_SELECT=$?
|
|
|
|
PITFT_VALUES=(pitft22 pitft28-resistive pitft28-capacitive pitft35-resistive)
|
|
WIDTH_VALUES=(320 320 320 480)
|
|
HEIGHT_VALUES=(240 240 240 320)
|
|
HZ_VALUES=(80000000 80000000 80000000 32000000)
|
|
# Framebuffer (HDMI out) rotation:
|
|
FBROTATE_VALUES=(0 1 2 3)
|
|
# PiTFT (MADCTL) rotation:
|
|
TFTROTATE_VALUES=(0 90 180 270)
|
|
|
|
if [ $PROJ_SELECT -lt 6 ]; then
|
|
|
|
# Use preconfigured settings per-project
|
|
|
|
# 3 elements per project; first is index (1+) into
|
|
# PITFT_VALUES, second and third are index into
|
|
# FBROTATE_VALUES and TFTROTATE_VALUES:
|
|
PROJ_VALUES=(2 1 4 1 1 4 1 1 4 2 1 2 2 2 2)
|
|
# FBROTATE index is almost always 1, except for HDMI portrait mode
|
|
|
|
PITFT_SELECT=${PROJ_VALUES[($PROJ_SELECT-1)*3]}
|
|
FBROTATE_SELECT=${PROJ_VALUES[($PROJ_SELECT-1)*3+1]}
|
|
TFTROTATE_SELECT=${PROJ_VALUES[($PROJ_SELECT-1)*3+2]}
|
|
|
|
else
|
|
|
|
# Configure options manually
|
|
|
|
echo
|
|
echo "Select display type:"
|
|
# 123456789012345678901234567890123456789
|
|
selectN "PiTFT 2.2\" HAT" \
|
|
"PiTFT / PiTFT Plus resistive 2.4-3.2\"" \
|
|
"PiTFT / PiTFT Plus 2.8\" capacitive" \
|
|
"PiTFT / PiTFT Plus 3.5\""
|
|
PITFT_SELECT=$?
|
|
|
|
echo
|
|
echo "HDMI rotation:"
|
|
selectN "Normal (landscape)" \
|
|
"90° clockwise (portrait)" \
|
|
"180° (landscape)" \
|
|
"90° counterclockwise (portrait)"
|
|
FBROTATE_SELECT=$?
|
|
|
|
echo
|
|
echo "TFT (MADCTL) rotation:"
|
|
selectN "0" \
|
|
"90" \
|
|
"180" \
|
|
"270"
|
|
TFTROTATE_SELECT=$?
|
|
|
|
fi
|
|
|
|
# START INSTALL ------------------------------------------------------------
|
|
|
|
echo
|
|
echo "Device: ${PITFT_VALUES[$PITFT_SELECT-1]}"
|
|
echo "HDMI framebuffer rotate: ${FBROTATE_VALUES[$FBROTATE_SELECT-1]}"
|
|
echo "TFT MADCTL rotate: ${TFTROTATE_VALUES[$TFTROTATE_SELECT-1]}"
|
|
echo
|
|
echo -n "CONTINUE? [y/N] "
|
|
read
|
|
if [[ ! "$REPLY" =~ ^(yes|y|Y)$ ]]; then
|
|
echo "Canceled."
|
|
exit 0
|
|
fi
|
|
|
|
# All selections are validated at this point...
|
|
# *_SELECT variables will have numeric index of 1+
|
|
|
|
echo
|
|
echo "Starting installation..."
|
|
echo "Updating package index files..."
|
|
apt-get update
|
|
|
|
# Given a filename, a regex pattern to match and a replacement string,
|
|
# perform replacement if found, else append replacement to end of file.
|
|
# (# $1 = filename, $2 = pattern to match, $3 = replacement)
|
|
reconfig() {
|
|
grep $2 $1 >/dev/null
|
|
if [ $? -eq 0 ]; then
|
|
# Pattern found; replace in file
|
|
sed -i "s/$2/$3/g" $1 >/dev/null
|
|
else
|
|
# Not found; append (silently)
|
|
echo $3 | sudo tee -a $1 >/dev/null
|
|
fi
|
|
}
|
|
|
|
# FBCP INSTALL -------------------------------------------------------------
|
|
|
|
echo "Downloading and installing fbcp..."
|
|
apt-get --yes --force-yes install cmake
|
|
cd /tmp
|
|
curl -LO https://github.com/tasanakorn/rpi-fbcp/archive/master.zip
|
|
unzip master.zip
|
|
cd rpi-fbcp-master
|
|
mkdir build
|
|
cd build
|
|
cmake ..
|
|
make
|
|
install fbcp /usr/local/bin/fbcp
|
|
cd ../..
|
|
rm -rf rpi-fbcp-master
|
|
|
|
# Add fbcp to /rc.local:
|
|
grep fbcp /etc/rc.local >/dev/null
|
|
if [ $? -eq 0 ]; then
|
|
# fbcp already in rc.local, but make sure correct:
|
|
sed -i "s/^.*fbcp.*$/\/usr\/local\/bin\/fbcp \&/g" /etc/rc.local >/dev/null
|
|
else
|
|
# Insert fbcp into rc.local before final 'exit 0'
|
|
sed -i "s/^exit 0/\/usr\/local\/bin\/fbcp \&\\nexit 0/g" /etc/rc.local >/dev/null
|
|
fi
|
|
|
|
# PITFT SETUP (/boot/config.txt mostly) ------------------------------------
|
|
|
|
echo "Configuring PiTFT..."
|
|
|
|
# Enable SPI using raspi-config
|
|
raspi-config nonint do_spi 0
|
|
|
|
# Set up PiTFT device tree overlay
|
|
reconfig /boot/config.txt "^.*dtoverlay=pitft.*$" "dtoverlay=${PITFT_VALUES[PITFT_SELECT-1]},rotate=${TFTROTATE_VALUES[TFTROTATE_SELECT-1]},speed=${HZ_VALUES[PITFT_SELECT-1]},fps=60"
|
|
|
|
# Set up framebuffer rotation
|
|
reconfig /boot/config.txt "^.*display_rotate.*$" "display_rotate=${FBROTATE_VALUES[FBROTATE_SELECT-1]}"
|
|
|
|
# Disable overscan compensation (use full screen):
|
|
raspi-config nonint do_overscan 1
|
|
# Set up HDMI parameters:
|
|
reconfig /boot/config.txt "^.*hdmi_force_hotplug.*$" "hdmi_force_hotplug=1"
|
|
reconfig /boot/config.txt "^.*hdmi_group.*$" "hdmi_group=2"
|
|
reconfig /boot/config.txt "^.*hdmi_mode.*$" "hdmi_mode=87"
|
|
reconfig /boot/config.txt "^.*hdmi_cvt.*$" "hdmi_cvt=${WIDTH_VALUES[PITFT_SELECT-1]} ${HEIGHT_VALUES[PITFT_SELECT-1]} 60 1 0 0 0"
|
|
|
|
# Use smaller console font:
|
|
reconfig /etc/default/console-setup "^.*FONTFACE.*$" "FONTFACE=\"Terminus\""
|
|
reconfig /etc/default/console-setup "^.*FONTSIZE.*$" "FONTSIZE=\"6x12\""
|
|
|
|
# Enable Retropie video smoothing
|
|
reconfig /opt/retropie/configs/all/retroarch.cfg "^.*video_smooth.*$" "video_smooth = \"true\""
|
|
|
|
# PROMPT FOR REBOOT --------------------------------------------------------
|
|
|
|
echo "Done."
|
|
echo
|
|
echo "Settings take effect on next boot."
|
|
echo
|
|
echo -n "REBOOT NOW? [y/N] "
|
|
read
|
|
if [[ ! "$REPLY" =~ ^(yes|y|Y)$ ]]; then
|
|
echo "Exiting without reboot."
|
|
exit 0
|
|
fi
|
|
echo "Reboot started..."
|
|
reboot
|
|
exit 0
|