From 90df2f19971b5f861e45d462980ae192caa5ac83 Mon Sep 17 00:00:00 2001 From: NiLuJe Date: Wed, 13 Mar 2019 19:24:30 +0100 Subject: [PATCH] Fix fb rotation on the Forma w/ KSM (#4779) * Enforce Portrait rotation on the Forma *everywhere*, KSM included. KSM is currently emulating a bogus rotation, which causes issues with FBInk, but also happens to be insidiously quirky in weird corner-cases. --- platform/kobo/koreader.sh | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/platform/kobo/koreader.sh b/platform/kobo/koreader.sh index 6967da139..3a5be709d 100755 --- a/platform/kobo/koreader.sh +++ b/platform/kobo/koreader.sh @@ -108,13 +108,13 @@ else fi # check whether PLATFORM & PRODUCT have a value assigned by rcS -if [ ! -n "${PRODUCT}" ]; then +if [ -z "${PRODUCT}" ]; then PRODUCT="$(/bin/kobo_config.sh 2>/dev/null)" export PRODUCT fi # PLATFORM is used in koreader for the path to the WiFi drivers (as well as when restarting nickel) -if [ ! -n "${PLATFORM}" ]; then +if [ -z "${PLATFORM}" ]; then PLATFORM="freescale" if dd if="/dev/mmcblk0" bs=512 skip=1024 count=1 | grep -q "HW CONFIG"; then CPU="$(ntx_hwconfig -s -p /dev/mmcblk0 CPU 2>/dev/null)" @@ -128,7 +128,7 @@ if [ ! -n "${PLATFORM}" ]; then fi # Make sure we have a sane-ish INTERFACE env var set... -if [ ! -n "${INTERFACE}" ]; then +if [ -z "${INTERFACE}" ]; then # That's what we used to hardcode anyway INTERFACE="eth0" export INTERFACE @@ -139,14 +139,12 @@ fi # Because NTX likes mounting panels in weird native rotations, this is actually FB_ROTATE_CCW (3). # And because shit gets even weirder, we have to echo 1 to get 3 (because the kernel inverts Landscape FB constants, and 3 ^ 2 = 1). if [ "${PRODUCT}" = "frost" ]; then - # Only mess with this if we were started from Nickel - if [ "${FROM_NICKEL}" = "true" ]; then - # Don't do anything if we're already in the right orientation. - if [ "$(cat /sys/class/graphics/fb0/rotate)" -ne "3" ]; then - echo 1 >/sys/class/graphics/fb0/rotate - # Sleep a bit, for good measure - usleep 250000 - fi + # NOTE: We enforce this *everywhere*, because KSM is currently emulating a bogus pickel rotation (UR (0), instead of CCW (3)), + # and current kernels are surreptitiously broken when UR @ 8bpp (especially as far as A2 handling is concerned)... + ORIG_FB_ROTA="$(cat /sys/class/graphics/fb0/rotate)" + # Don't do anything if we're already in the right orientation. + if [ "${ORIG_FB_ROTA}" -ne "3" ]; then + echo 1 >/sys/class/graphics/fb0/rotate fi fi # NOTE: We don't have to restore anything on exit, nickel's startup process will take care of everything (pickel -> nickel). @@ -155,9 +153,9 @@ fi # because 16bpp is the worst idea in the history of time, as RGB565 is generally a PITA without hardware blitting, # and 32bpp usually gains us nothing except a performance hit (we're not Qt5 with its QPainter constraints). # The reduced size & complexity should hopefully make things snappier, -# (and hopefully prevent the JIT for going crazy on high-density screens...). -# NOTE: Even though pickel/Nickel appear to restore their preferred fb setup, we'll have to do it ourselves, -# because things are a bit wonky otherwise. Plus, we get to play nice with every launch method that way. +# (and hopefully prevent the JIT from going crazy on high-density screens...). +# NOTE: Even though both pickel & Nickel appear to restore their preferred fb setup, we'll have to do it ourselves, +# as they fail to flip the grayscale flag properly. Plus, we get to play nice with every launch method that way. # So, remember the current bitdepth, so we can restore it on exit. ORIG_FB_BPP="$(./fbdepth -g)" echo "Original fb bitdepth is set @ ${ORIG_FB_BPP}bpp" >>crash.log 2>&1 @@ -217,6 +215,15 @@ if [ -n "${ORIG_FB_BPP}" ]; then ./fbdepth -d "${ORIG_FB_BPP}" >>crash.log 2>&1 fi +# Restore original fb rotation on the Forma, for KSM +if [ "${PRODUCT}" = "frost" ]; then + # Only needed for KSM, pickel -> Nickel will restore its own rota properly + if [ "${FROM_NICKEL}" != "true" ]; then + # The Forma kernel inverts odd rotation constants, counteract that, à la Plato, because one-liner ;p. + echo "$(((4 - ORIG_FB_ROTA) % 4))" >/sys/class/graphics/fb0/rotate + fi +fi + # Restore original CPUFreq governor if need be... if [ -n "${ORIG_CPUFREQ_GOV}" ]; then echo "${ORIG_CPUFREQ_GOV}" >"/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"