Gibt es eine Möglichkeit, der Textkonsole des Linux-Frame-Buffers Ränder, Rahmen, Versätze oder Auffüllungen hinzuzufügen, um den HDMI-Overscan auszugleichen?

Gibt es eine Möglichkeit, der Textkonsole des Linux-Frame-Buffers Ränder, Rahmen, Versätze oder Auffüllungen hinzuzufügen, um den HDMI-Overscan auszugleichen?

Ich habe ein neu gekauftes, billiges 8-Zoll-TFT-LCD-Display, das an allen Seiten „die Kanten abschneidet“ (d. h. nicht alle Pixel anzeigt). Ich bin zu dem Schluss gekommen, dass dies auf „Overscan“ zurückzuführen ist, das hauptsächlich bei Fernsehern mit HDMI-Eingang auftritt.

Mein Kernel bootet zuerst in efifb und wechselt dann zu inteldrmfb – beide Frame-Buffer-Treiber weisen das Problem auf. Ich verwende kein X-Windows und werde X auf diesem winzigen Display auch nie verwenden wollen. Ich möchte lediglich die Linux-Textkonsole verwenden. Daher scheidet jede Lösung mit „xrandr“ aus.

Ich habe versuchtallesIch kann Frame-Buffer-Einstellungen auf Treiberebene (Kernelebene) finden, um dieses Problem zu lösen. Dazu gehört das Optimieren der Auflösungseinstellungen mit dem Kernel-Boot-Parameter „Video“ und das Optimieren der Timing-Einstellungen nach dem Booten mit fbset. Aber egal, was ich mit fbset mache, es scheint ignoriert zu werden.

Meine Frage ist also folgende: Gibt es eine Möglichkeit, möglicherweise auf einer höheren Ebene als der Ebene des Frame-Buffer-Treibers, mit der ich einen Rand um die Frame-Buffer-Konsole hinzufügen kann?

Ich weiß, dass ich „stty“ verwenden kann, um die Anzahl der Spalten und Zeilen zu verringern, die Linux auf der Konsole verwendet, aber das löst nur das Problem auf der rechten und unteren Seite und lässt auf der linken und oberen Seite weiterhin Zeichen abgeschnitten. Gibt es eine Möglichkeit, „stty“ zu verwenden, um der Konsole einen Offset für die „erste Spalte“ und die „erste Zeile“ hinzuzufügen (also etwas Leerzeichen aufzufüllen)? Wenn nicht mit stty, dann mit einem anderen einfachen Tool (nicht X Windows)?

Antwort1

Sie können den fbsetBefehl ausprobieren.

Beim Ausführen fbset -iwerden Ihnen einige Informationen zu Ihren aktuellen Framebuffer-Einstellungen angezeigt, einschließlich einer Zeile „Timings“. Bei mir sind alle Werte 0, was wahrscheinlich bedeutet, dass sie nicht verwendet werden, aber wenn Sie dort tatsächliche Werte sehen, können Sie versuchen, sie zu optimieren.

Ein Auszug aus man fbset:

   Display timings:

          -pixclock <value>
                 set  the  length  of one pixel (in picosec‐
                 onds). Note that the  frame  buffer  device
                 may only support some pixel lengths

          -left <value>
                 set left margin (in pixels)

          -right <value>
                 set right margin (in pixels)

          -upper <value>
                 set upper margin (in pixel lines)

          -lower <value>
                 set lower margin (in pixel lines)

          -hslen <value>
                 set horizontal sync length (in pixels)

          -vslen <value>
                 set vertical sync length (in pixel lines)

          --timings, -t ...
                 set  all  timing  parameters at once in the
                 order  <pixclock>  <left>  <right>  <upper>
                 <lower>  <hslen> <vslen>, e.g.  -t 35242 64
                 96 35 12 112 2

Beachten Sie bitte die Parameter -left, -right, -upper, . Es gibt sogar einen Befehl, der einen dieser Werte erhöht und gleichzeitig den anderen verringert:-lowerfbset-move

   Display positioning:

          -move {left|right|up|down}
                 move the visible part of the display in the
                 specified direction

          -step <value>
                 set  step  size for display positioning (in
                 pixels or pixel lines),  if  -step  is  not
                 given  display will be moved 8 pixels hori‐
                 zontally or 2 pixel lines vertically

Antwort2

Wenn Sie links vom DP-1 einen HDMI-Bildschirm haben und links eine Lücke wünschen, können Sie das folgende Skript ausführen:

#!/bin/bash

# Usage: .script pixel_height pixel_width

new_mode_spec=$(cvt "$1" "$2" 60 | sed -n 's/Modeline *//p')
new_mode_name=$(echo "$new_mode_spec" | grep -o '"[^"]*"')
new_mode_res=$(echo "$new_mode_name" | sed 's/"//g' | sed 's/_.*$//')

xrandr --newmode "${new_mode_spec}"
xrandr --addmode HDMI-1 "${new_mode_name}"
xrandr --output HDMI-1 --left-of DP-1 \
       --mode "${new_mode_name}" \
       --panning "${new_mode_res}" \
       --scale-from 1920x1080 \
       --output DP-1 --mode 1920x1080

echo "Changed to ${new_mode_res}, remember that it must be a multiple of 8!"

Dabei wird davon ausgegangen, dass die Originalauflösung 1920 x 1080 beträgt, und als Parameter werden die Zielpixelhöhe und -breite verwendet.

Ein Nebeneffekt besteht darin, dass die Polsterung nicht schwarz ist, sondern den linken Bildschirmbereich rechts wiederholt (DP-1).

Anmerkungen

verwandte Informationen