¿Hay alguna manera de agregar margen, borde, desplazamiento o relleno a la consola de texto del frame buffer de Linux para compensar la sobreexploración HDMI?

¿Hay alguna manera de agregar margen, borde, desplazamiento o relleno a la consola de texto del frame buffer de Linux para compensar la sobreexploración HDMI?

Tengo una pantalla LCD TFT barata de 8 pulgadas recién comprada que "corta los bordes" en todos los lados (es decir, no muestra todos los píxeles). He llegado a comprender que esto se debe a la "sobreexploración" que parece afectar principalmente a los televisores que utilizan entrada HDMI.

Mi kernel primero arranca en efifb y luego cambia a inteldrmfb; ambos controladores de frame buffer presentan el problema. No estoy usando X Windows y nunca querré usar X en esta pequeña pantalla. Todo lo que quiero hacer es usar la consola de texto de Linux. Por lo tanto, cualquier solución que utilice "xrandr" está descartada.

Yo he tratadotodoPuedo encontrar información sobre la configuración del buffer de cuadros a nivel del controlador (nivel del kernel) para resolver este problema, incluido el ajuste de la configuración de resolución con el parámetro de arranque del kernel "video" y el ajuste de la configuración de tiempo después del arranque con fbset, pero no importa lo que ver con fbset, parece ser ignorado.

Entonces mi pregunta es la siguiente: ¿Hay alguna manera, quizás a un nivel más alto que en el nivel del controlador del frame buffer, de que pueda agregar margen alrededor de la consola del frame buffer?

Sé que puedo usar "stty" para acortar el número de columnas y filas que Linux usará en la consola, pero eso solo resolverá el problema en el lado derecho y en la parte inferior y aún dejará caracteres cortados en el lado izquierdo y el lado superior. ¿Hay alguna forma de utilizar "stty" para agregar un desplazamiento de "primera columna" y "primera fila" a la consola (es decir, algo de relleno de espacios en blanco)? Si no es con stty, ¿con alguna otra herramienta liviana (no X windows)?

Respuesta1

Puedes fbsetprobar el comando.

La ejecución fbset -ile mostrará información sobre la configuración actual de su framebuffer, incluida una línea de "tiempos". Para mí, todos los valores son 0-s, lo que probablemente significa que no se utilizan, pero si ve algunos valores reales allí, puede intentar modificarlos.

Un extracto de 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

Tenga en cuenta los parámetros -left, -right, -upper. Incluso tiene un comando que aumenta uno de estos valores y disminuye el opuesto al mismo tiempo:-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

Respuesta2

Si tiene una pantalla HDMI a la izquierda del DP-1 y desea un espacio a la izquierda, puede ejecutar el siguiente script:

#!/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!"

Asume que la resolución original es 1920x1080 y toma como parámetros la altura y el ancho del píxel de destino.

Un efecto secundario es que el relleno no es negro, sino que se repite la sección izquierda de la pantalla a la derecha (DP-1).

Notas

información relacionada