Existe uma maneira de adicionar margem, borda, deslocamento ou preenchimento ao console de texto do buffer de quadros do Linux para compensar o overscan HDMI?

Existe uma maneira de adicionar margem, borda, deslocamento ou preenchimento ao console de texto do buffer de quadros do Linux para compensar o overscan HDMI?

Eu tenho um display LCD TFT barato de 8 polegadas recém-comprado que está "cortando as bordas" em todos os lados (ou seja, não mostrando todos os pixels). Cheguei à conclusão de que isso se deve ao "overscan", que parece afetar principalmente as TVs que usam entrada HDMI.

Meu kernel está inicializando primeiro no efifb e depois mudando para o inteldrmfb - ambos os drivers de buffer de quadros apresentam o problema. Não estou usando o X windows e nunca vou querer usar o X nesta pequena tela. Tudo o que quero fazer é usar o console de texto do Linux. Portanto, qualquer solução usando "xrandr" está fora de questão.

eu tenteitudoPosso encontrar configurações de buffer de quadros no nível do driver (nível do kernel) para resolver esse problema, incluindo ajustes nas configurações de resolução com o parâmetro de inicialização do kernel "vídeo" e ajustes nas configurações de tempo pós-inicialização com fbset, mas não importa o que eu fazer com fbset, parece ser ignorado.

Portanto, minha pergunta é a seguinte: existe uma maneira, talvez em um nível mais alto do que no nível do driver do buffer de quadros, de adicionar margem ao console do buffer de quadros?

Eu sei que posso usar "stty" para encurtar o número de colunas e linhas que o Linux usará no console, mas isso só resolverá o problema no lado direito e no lado inferior e ainda deixará caracteres cortados no lado esquerdo e o lado superior. Existe uma maneira de usar "stty" para adicionar um deslocamento de "primeira coluna" e "primeira linha" ao console (ou seja, algum preenchimento de espaço em branco)? Se não com stty, com alguma outra ferramenta leve (não X windows)?

Responder1

Você pode fbsettentar o comando.

A execução fbset -imostrará algumas informações sobre as configurações atuais do framebuffer, incluindo uma linha de "tempos". Para mim, todos os valores são 0-s, o que provavelmente significa que eles não são usados, mas se você encontrar alguns valores reais, poderá tentar ajustá-los.

Um trecho 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

Observe os parâmetros -left, -right, -upper, -lower. fbsetainda possui um -movecomando que aumenta um desses valores e diminui o valor oposto ao mesmo tempo:

   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

Responder2

Se você tiver uma tela HDMI à esquerda do DP-1 e desejar um espaço à esquerda, poderá executar o script abaixo:

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

Ele assume que a resolução original é 1920x1080 e toma como parâmetros a altura e largura do pixel de destino.

Um efeito colateral é que o preenchimento não é preto, mas repete a seção esquerda da tela à direita (DP-1).

Notas

informação relacionada