#!/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