armbian-build/scripts/h3disp

141 lines
4.9 KiB
Bash
Executable File

#!/bin/bash
#
# h3disp
#
# Patches fex/script.bin settings to modify display settings. Currently
# rather limited and only supporting HDMI and the available presets.
#
#############################################################################
#
# Background informations:
#
# Only a certain amount of predefined video modes is available on H3 devices
# as can be seen here: http://linux-sunxi.org/Fex_Guide#disp_init_configuration
#
# Purpose of this script is to display the available reasonable settings and
# let the user choose from them to adjust fex file accordingly afterwards.
#
# If HDMI-to-DVI adapters are used another fix has to be applied to the fex
# file: http://linux-sunxi.org/Orange_Pi_One#HDMI_to_DVI_converters -- so ask
# user whether he plans to use such an adapter and adjust fex file accordingly
#
#############################################################################
#
# CHANGES:
#
# v0.1: Initial release to adjust display settings in script.bin on commonly
# used Debian based OS images for H3 devices running Linux.
#
#############################################################################
#
# TODO:
#
# - implement real user interaction: dialog that asks which of the available
# HDMI modes to choose and whether a HDMI-to-DVI converter is used or not
#
# - maybe implement live resolution switching as outlined by Jernej:
# http://forum.armbian.com/index.php/topic/617-wip-orange-pi-one-support-for-the-upcoming-orange-pi-one/?p=5305
# (we would also need a working set of fbset modes in /etc/fb.modes
# of course)
#
# - maybe add the chosen mode to /boot/boot.cmd and create /boot/boot.scr
# afterwards?
#
#############################################################################
Main() {
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# ensure script is running as root
if [ "$(id -u)" != "0" ]; then
echo "This script must be executed as root. Exiting" >&2
exit 1
fi
# Provide a list with possible HDMI display settings and store the chosen
# one in the HDMIMode variable
:
# ask the user whether he uses a HDMI-to-DVI converter and if true then
# set DVIUsed=TRUE
:
HDMIMode=4
DVIUsed=TRUE
echo -e "Now trying to patch script.bin with your settings. \c"
PatchScriptBin ${HDMIMode} ${DVIUsed}
echo "Successfully finished. Please reboot for changes to take effect"
} # Main
PatchScriptBin() {
# This function will be called with 2 arguments:
# $1 HDMI mode to set
# $2 wether HDMI-to-DVI converter should be used or not (has to be TRUE)
# check whether we've the necessary tools available
Fex2Bin="$(which fex2bin)"
if [ "X${Fex2Bin}" = "X" ]; then
apt-get -f -qq -y install sunxi-tools >/dev/null 2>&1 || InstallSunxiTools >/dev/null 2>&1
fi
which fex2bin >/dev/null 2>&1 || (echo -e "Aborted\nfex2bin/bin2fex not found and unable to install. Exiting" >&2 ; exit 1)
# try to find location of script.bin
Path2ScriptBin=/boot
if [ ! -f "${Path2ScriptBin}/script.bin" ]; then
Path2ScriptBin="$(df | awk -F" " '/^\/dev\/mmcblk0p1/ {print $6}')"
if [ ! -f "${Path2ScriptBin}/script.bin" ]; then
echo -e "Aborted\nCan not find script.bin. Ensure boot partition is mounted" >&2
logger "Can not find script.bin. Ensure boot partition is mounted"
exit 1
fi
fi
# resolve symlink to modify the original instead of the link
ScriptBin="$(readlink -f "${Path2ScriptBin}/script.bin")"
# create temp file
MyTmpFile="$(mktemp /tmp/${0##*/}.XXXXXX)"
# trap "rm \"${MyTmpFile}\" ; exit 0" 0 1 2 3 15
# convert script.bin to temporary fex file
bin2fex <"${ScriptBin}" 2>/dev/null | grep -v "^screen0_output" \
| grep -v "^screen1_output" | grep -v "hdcp_enable" \
| grep -v "hdmi_cts_compatibility" >"${MyTmpFile}"
if [ $? -ne 0 ]; then
echo -e "Aborted\nCould not convert script.bin to fex. Exiting" >&2
logger "Could not convert script.bin to fex"
exit 1
fi
# create backup to be able to recover from failed conversion
cp -p "${ScriptBin}" "${Path2ScriptBin}/script.bin.bak"
sed -i "/\[disp_init\]/a screen0_output_type = 3\nscreen0_output_mode = $1\nscreen1_output_type = 3\nscreen1_output_mode = $1" "${MyTmpFile}"
if [ "X$2" = "XTRUE" ]; then
# add entries necessary for HDMI-to-DVI adapters
sed -i '/\[hdmi_para\]/a hdcp_enable = 0\nhdmi_cts_compatibility = 1' "${MyTmpFile}"
fi
# convert temporary fex file back to script.bin
fex2bin "${MyTmpFile}" "${ScriptBin}" 2>/dev/null
if [ $? -ne 0 ]; then
mv "${Path2ScriptBin}/script.bin.bak" "${ScriptBin}"
echo -e "Aborted\nWriting script.bin went wrong. Nothing changed" >&2
logger "Writing script.bin went wrong. Nothing changed"
exit 1
fi
} # PatchScriptBin
InstallSunxiTools() {
sleep 1
apt-get -f -qq -y install libusb-1.0-0-dev || (echo -e "Aborted\nNot possible to install a sunxi-tools requirement" ; exit 1)
cd /tmp
git clone https://github.com/linux-sunxi/sunxi-tools
cd sunxi-tools
make
make install
} # InstallSunxiTools
Main