141 lines
4.9 KiB
Bash
Executable File
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
|