硬件
我的硬件配置如下:
- 电脑运行Ubuntu 10.04
- 带有一个 VGA 输出的板载显卡(Intel P4M800 - Via Unichrome)
- VGA 分配器:1 个输入,4 个输出。最高可达 2048x1536(根据规格)
- 一台 42 英寸电视/显示器通过其 VGA 输入连接到分配器
- 两台 32 英寸电视/显示器通过 VGA 输入连接到分配器
问题
在该配置下,Ubuntu 仅显示 640x480 和 800x800 作为可能的分辨率。但是,如果我将任何电视/显示器直接连接到 PC(通过 VGA),Ubuntu 会显示一长串可能的分辨率(我尝试了其中几种,效果很好)。
看起来X 窗口系统自动配置无法正常工作。我该如何手动配置它?事先应该了解涉及的不同设备的哪些信息?
语境:监视器安装在一栋建筑的公共区域,用于显示在电脑中处理的动态信息(在 Firefox 中以全屏模式运行的 Flash 演示文稿)。
更新:
我尝试了以下操作,如答案中提供的链接所述:
使用以下方法获取分辨率的模式行:
cvt
使用创建新模式
xrandr --newmode
使用以下方式将模式添加到输出显示
xrandr --addmode
尝试使用更改分辨率
xrandr --output ... --mode ...
但我明白这一点:xrandr screen cannot be larger than 800x600 (desired size ...)
答案1
显示器自动检测的工作原理如下:每个显示器的固件都包含一个称为 EDID 的数据块,该数据块对显示器的分辨率和刷新率等进行编码。视频驱动程序通过视频卡/显示器连接进行硬件调用来检索这些数据。
分离器(如 KVM)控制从卡到显示器的路径。有些 KVM 可以正确传递 EDID,有些则不行。我猜是您的分离器不允许 EDID 传回。
事实上,我猜测系统调用有一个内置假设,即在给定的连接器上只存在一个 EDID 块,所以即使它返回了某些东西,也可能不是你想要的。
此外,虽然所有显示器都会返回 EDID,但有些电视不会,或者会返回损坏的 EDID。但由于您在没有分路器的情况下进行了测试并且工作正常,因此我认为这个问题不会影响您。
不同的显示器支持不同的分辨率和频率,但 VESA 标准要求所有显示器至少支持两种分辨率:640x480 和 800x600。因此,当 X 对所连接的显示器一无所知时,它会回退到这两种分辨率。这就是为什么您只能看到这两种分辨率。
无论如何,我认为在这种情况下您不能依赖 EDID 来神奇地自动配置您的显示器。相反,您需要自己手动指定数据。
如果您指定了视频驱动程序或链接到了 Xorg.0.log,我可以为您提供更具体的信息。具体过程取决于您使用的视频驱动程序。如果是支持 KMS 的驱动程序(如 -intel 或 -ati),则必须通过内核指定它。如果您已关闭 KMS 或正在使用非 KMS 驱动程序,但该驱动程序支持 RANDR(例如 -fglrx),则可以使用 xrandr 命令行工具(如底部所述)添加 modelinehttps://wiki.ubuntu.com/X/Config/Resolution。如果您使用的是非 KMS、非 RANDR 驱动程序(例如 -nvidia),则完全由您的 /etc/X11/xorg.conf 控制;在后一种情况下,您需要查找所有显示器的垂直和水平刷新率(希望它们都接近相同的范围,否则您就麻烦了),然后通过 xorg.conf 中的 HorizSync 和 VertRefresh 选项指定它们。您还需要在 xorg.conf 中添加分辨率。 有可能您可能还需要构建一个 ModeLine,但我敢打赌,仅 HorizSync 和 VertRefresh 就足够了。
祝你好运,如果你遇到困难请务必发布你的 /var/log/Xorg.0.log。
答案2
看起来 X 无法正确检测分离器的分辨率。
您可以使用 xrand 强制它使用任意分辨率。有一些 文档在上面,检查添加未检测到的分辨率部分和设置 Xrand 更改持久性。