有沒有辦法為 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)。

筆記

相關內容