From f962a4b2b6df0990ebd15ca1879f6a34af3f1a29 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Tue, 23 Mar 2021 16:20:22 +0100 Subject: [PATCH] busybox: add script to modify edid override with RPi bootloader The script supports two operations: "set" enables initramfs cpio in config.txt and adds edid and video override kernel options for the specified connectors to cmdline.txt "delete" removes edid.cpio initramfs loading in config.txt and removes all edid override and video options from cmdline.txt Signed-off-by: Matthias Reichl --- packages/sysutils/busybox/package.mk | 3 + .../scripts/update-bootloader-edid-rpi | 95 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100755 packages/sysutils/busybox/scripts/update-bootloader-edid-rpi diff --git a/packages/sysutils/busybox/package.mk b/packages/sysutils/busybox/package.mk index 59c1034f07..a84111a2b6 100644 --- a/packages/sysutils/busybox/package.mk +++ b/packages/sysutils/busybox/package.mk @@ -128,6 +128,9 @@ makeinstall_target() { cp ${PKG_DIR}/scripts/dump-active-edids-drm ${INSTALL}/usr/bin/dump-active-edids fi cp ${PKG_DIR}/scripts/create-edid-cpio ${INSTALL}/usr/bin/ + if [ "${PROJECT}" = "RPi" ]; then + cp ${PKG_DIR}/scripts/update-bootloader-edid-rpi ${INSTALL}/usr/bin/update-bootloader-edid + fi cp ${PKG_DIR}/scripts/createlog ${INSTALL}/usr/bin/ cp ${PKG_DIR}/scripts/dthelper ${INSTALL}/usr/bin ln -sf dthelper ${INSTALL}/usr/bin/dtfile diff --git a/packages/sysutils/busybox/scripts/update-bootloader-edid-rpi b/packages/sysutils/busybox/scripts/update-bootloader-edid-rpi new file mode 100755 index 0000000000..1516f3e9d1 --- /dev/null +++ b/packages/sysutils/busybox/scripts/update-bootloader-edid-rpi @@ -0,0 +1,95 @@ +#!/bin/sh + +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) + +EDID_DIR="/storage/.config/firmware/edid" +EDID_CPIO="/flash/edid.cpio" +CONFIG_TXT="/flash/config.txt" +CMDLINE_TXT="/flash/cmdline.txt" + +usage() { + echo "$0 set CONNECTOR... | delete | help" +} + +check_args() { + if [ $# -eq 0 ]; then + echo "error: no connector(s) specified!" + exit 1 + fi + if [ ! -f "${EDID_CPIO}" ]; then + echo "error: ${EDID_CPIO} not present" + exit 1 + fi + for conn in "$@"; do + if [ ! -f "${EDID_DIR}/edid-${conn}.bin" ]; then + echo "error: ${EDID_DIR}/edid-${conn}.bin not present" + exit 1 + fi + done +} + +cleanup_config_txt() { + sed -i "/^initramfs edid\.cpio/d" ${CONFIG_TXT} +} + +get_cleaned_cmdline_txt() { + sed \ + -e 's| drm\.edid_firmware=[^ ]*||g' \ + -e 's| video=[^ ]*||g' \ + ${CMDLINE_TXT} +} + +add_initramfs() { + # make sure config.txt ends with a newline + if [ "$(tail -c 1 ${CONFIG_TXT} | tr -c -d '\n' | tr '\n' 'X')" != "X" ]; then + echo "" >> ${CONFIG_TXT} + fi + echo "initramfs edid.cpio" >> ${CONFIG_TXT} +} + +add_cmdline() { + CMDLINE=$(get_cleaned_cmdline_txt) + FIRMWARE="" + VIDEO="" + for conn in "$@"; do + VIDEO="${VIDEO} video=${conn}:D" + [ -n "${FIRMWARE}" ] && FIRMWARE="${FIRMWARE}," + FIRMWARE="${FIRMWARE}${conn}:edid/edid-${conn}.bin" + done + echo "${CMDLINE} drm.edid_firmware=${FIRMWARE}${VIDEO}" > ${CMDLINE_TXT} +} + +set_edids() { + check_args "$@" + mount -o remount,rw /flash + cleanup_config_txt + add_initramfs + add_cmdline "$@" + mount -o remount,ro /flash +} + +delete_edids() { + mount -o remount,rw /flash + cleanup_config_txt + CMDLINE=$(get_cleaned_cmdline_txt) + echo "${CMDLINE}" > ${CMDLINE_TXT} + mount -o remount,ro /flash +} + +case $1 in + set) + shift + set_edids "$@" + ;; + delete) + delete_edids + ;; + help) + usage + ;; + *) + usage + exit 1 + ;; +esac