有没有办法向 Linux 帧缓冲区文本控制台添加边距、边框、偏移或填充,以补偿 HDMI 过扫描?

有没有办法向 Linux 帧缓冲区文本控制台添加边距、边框、偏移或填充,以补偿 HDMI 过扫描?

我有一个新买的便宜的 8 英寸 TFT LCD 显示器,它的所有侧面都“切掉了边缘”(即不显示所有像素)。我了解到这是由于“过扫描”造成的,这似乎主要影响使用 HDMI 输入的电视。

我的内核首先启动到 efifb,然后切换到 inteldrmfb——两个帧缓冲区驱动程序都出现了这个问题。我不使用 X windows,也永远不想在这个小显示器上使用 X。我只想使用 Linux 文本控制台。所以任何使用“xrandr”的解决方案都已经过时了。

我努力了一切我可以找到有关驱动程序级(内核级)帧缓冲区设置来解决此问题,包括使用“视频”内核启动参数调整分辨率设置以及使用 fbset 调整启动后的计时设置,但无论我做什么用fbset做的,好像被忽略了。

所以我的问题是:有没有一种方法,也许比帧缓冲区驱动程序级别更高,我可以在帧缓冲区控制台周围添加边距?

我知道我可以使用“stty”来缩短 Linux 将在控制台上使用的列数和行数,但这只能解决右侧和底部的问题,并且仍然会在左侧留下字符被切断顶部。有没有办法使用“stty”向控制台添加“第一列”和“第一行”偏移量(即一些空白填充)?如果不使用 stty,使用其他一些轻量级工具(不是 X windows)?

答案1

您可以fbset尝试一下该命令。

运行fbset -i将向您显示有关当前帧缓冲区设置的一些信息,包括“计时”行。对我来说,所有值都是 0-s,这可能意味着它们没有被使用,但是如果您看到那里的一些实际值,您可以尝试调整它们。

摘录自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

请注意-left, -right, -upper,-lower参数。fbset甚至有一个-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

答案2

如果 DP-1 左侧有一个 HDMI 屏幕,并且您希望左侧有一个间隙,则可以运行以下脚本:

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

它假设原始分辨率为 1920x1080,并将目标像素高度和宽度作为参数。

副作用是填充不是黑色,而是在右侧重复屏幕的左侧部分 (DP-1)。

笔记

相关内容