我最近购买了一台 BenQ W600+ 投影仪,想将它与运行 Ubuntu 12.10 的配备 Nvidia 显卡的 ThinkPad T410 一起使用。投影仪的原始分辨率为 1280x720(即 720p),但我无法配置 Nvidia 驱动程序以实际使用此分辨率。投影仪连接到 VGA 端口。驱动程序是nvidia-current
(我认为)。
以下是“显示”系统设置提供的分辨率。请注意,未列出 1280x720:
我按照“添加未检测到的分辨率“在 wiki.ubuntu.com,但它们会导致错误:
xrandr --newmode "1280x720"x0.0 74.25 1280 1390 1430 1650 720 725 730 750 -hsync -vsync
xrandr --addmode VGA-0 1280x720x0.0
这是第二条命令的错误消息xrandr
:
X Error of failed request: BadMatch (invalid parameter attributes)
Major opcode of failed request: 140 (RANDR)
Minor opcode of failed request: 18 (RRAddOutputMode)
Serial number of failed request: 39
Current serial number in output stream: 40
我也在以下位置看到此错误消息/var/log/Xorg.0.log
:
[ 2284.687] (WW) NVIDIA(GPU-0): Unable to read EDID for display device CRT-0
[ 2284.687] (**) NVIDIA(0): Using HorizSync/VertRefresh ranges from the EDID for display
[ 2284.687] (**) NVIDIA(0): device CRT-0 (Using EDID frequencies has been enabled on
[ 2284.687] (**) NVIDIA(0): all display devices.)
我还有另一台机器,ThinkPad T510,配有英特尔显卡,运行的是较早版本的 Ubuntu。在那台机器上,投影仪工作正常,Xorg 日志文件中显示以下内容:
(II) intel(0): EDID vendor "BNQ", prod id 52737
(II) intel(0): Using hsync ranges from config file
(II) intel(0): Using vrefresh ranges from config file
(II) intel(0): Printing DDC gathered Modelines:
(II) intel(0): Modeline "1280x720"x0.0 74.25 1280 1390 1430 1650 720 725 730 750 -hsync -vsync (45.0 kHz)
该nvidia-settings
程序同样没有帮助。“获取 EDID”选项呈灰色:
而且它也不提供 1280x720 分辨率:
我没有任何/etc/X11/xorg.conf
文件。我尝试过nvidia-xconfig
创建一个 xorg.conf 文件,但这似乎让一切变得更糟:投影仪只能以 640x480 分辨率显示,并且鼠标光标会“卡”在其中一个显示器上。当 X 使用此 xorg.conf 文件启动时,我还收到此错误消息弹出框:
如何让投影仪在 T410 上以 1280x720 的分辨率工作?
答案1
成功!
经过几个小时的盲目摆弄xorg.conf
和之后xrandr
,我找到了一个可行的解决方案。
问题似乎是:
- Nvidia 驱动程序坚持使用来自显示器的 EDID 数据,而不是 xrandr 或 xorg.conf 中设置的任何数据。
- 由于某种原因,Nvidia 驱动程序无法阅读我的投影仪的 EDID 数据。
因此,解决方案是提供 EDID 覆盖。我找不到适合我的特定显示器的 EDID 覆盖,但我能找到适合其他 720p 投影仪的 EDID 覆盖。它有效!
获取 EDID 文件并将其放在某个位置后,通过在xorg.conf 的xorg.conf
“ ”部分中添加如下行来将其安装在文件中:Screen
Option "CustomEDID" "CRT-0:/path/to/edid.bin"
这里的“ CRT-0
”是投影仪的连接位置:VGA 端口。
另一个额外的麻烦是,我实际上找不到二进制 EDID 文件。相反,通过搜索“720p EDID 文件”,我找到了一些 .INF 文件,其中包含由某些 Windows 程序提取的 EDID 信息。这些是 Windows .ini 格式的文件。它们包含实际的 EDID 信息,信息块如下所示:
[OVERRIDDEN-EDID_AddReg]
;Base EDID
HKR,EDID_OVERRIDE,"0",0x01,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x3D,0xCB,0x81,0x07,0x00,0x00,0x00,0x0
0,0x00,0x11,0x01,0x03,0x80,0x6E,0x3E,0x78,0x0A,0xEE,0x91,0xA3,0x54,0x4C,0x99,0x26,0x0F,0x50,0x54,0x20,0x0
0,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1D,0x00,0x7
2,0x51,0xD0,0x1E,0x20,0x6E,0x28,0x55,0x00,0x53,0x6F,0x42,0x00,0x00,0x1E,0x01,0x1D,0x80,0x18,0x71,0x1C,0x1
6,0x20,0x58,0x2C,0x25,0x00,0x53,0x6F,0x42,0x00,0x00,0x9E,0x00,0x00,0x00,0xFC,0x00,0x54,0x58,0x2D,0x53,0x5
2,0x38,0x30,0x35,0x0A,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0xFD,0x00,0x3B,0x3D,0x1E,0x2E,0x08,0x00,0x0A,0x2
0,0x20,0x20,0x20,0x20,0x20,0x01,0x5A
为了将其转换为二进制文件,我编写了以下小 Python 脚本:
#!/usr/bin/python
# first item was 0x01
s = "0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x3D,0xCB,0x81,0x07,0x00,0x00,0x00,0x00,0x00,0x11,0x01,0x03,0x80,0x6E,0x3E,0x78,0x0A,0xEE,0x91,0xA3,0x54,0x4C,0x99,0x26,0x0F,0x50,0x54,0x20,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1D,0x00,0x72,0x51,0xD0,0x1E,0x20,0x6E,0x28,0x55,0x00,0x53,0x6F,0x42,0x00,0x00,0x1E,0x01,0x1D,0x80,0x18,0x71,0x1C,0x16,0x20,0x58,0x2C,0x25,0x00,0x53,0x6F,0x42,0x00,0x00,0x9E,0x00,0x00,0x00,0xFC,0x00,0x54,0x58,0x2D,0x53,0x52,0x38,0x30,0x35,0x0A,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0xFD,0x00,0x3B,0x3D,0x1E,0x2E,0x08,0x00,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x01,0x5A"
s = "".join(map(lambda x : chr(int(x, 16)), s.split(",")))
f = open("edid.bin", "w")
f.write(s)
f.close()
请注意,您必须从 .inf 文件的行中删除前三个字段:“HKR,EDID_OVERRIDE,"0",0x01”。
为了验证生成的 EDID 文件是否有效,我使用了parse-edid
(read-edid
软件包的一部分):
tobin@thinktop:~/pathname/$ parse-edid edid.bin
parse-edid: parse-edid version 2.0.0
parse-edid: EDID checksum passed.
# EDID version 1 revision 3
Section "Monitor"
# Block type: 2:0 3:fc
Identifier "TX-SR805"
VendorName "ONK"
ModelName "TX-SR805"
# Block type: 2:0 3:fc
# Block type: 2:0 3:fd
HorizSync 30-46
VertRefresh 59-61
# Max dot clock (video bandwidth) 80 MHz
# DPMS capabilities: Active off:no Suspend:no Standby:no
Mode "1280x720" # vfreq 60.000Hz, hfreq 45.000kHz
DotClock 74.250000
HTimings 1280 1390 1430 1650
VTimings 720 725 730 750
Flags "+HSync" "+VSync"
EndMode
Mode "1920x540" # vfreq 60.053Hz, hfreq 33.750kHz
DotClock 74.250000
HTimings 1920 2008 2052 2200
VTimings 540 542 547 562
Flags "Interlace" "+HSync" "+VSync"
EndMode
# Block type: 2:0 3:fc
# Block type: 2:0 3:fd
EndSection
所以它看起来是有效的。事实上,在重新启动 X 服务器后,我能够进入 Ubuntu 显示设置并单击“检测显示器”。它看到我的假“ONKYO Corporation 50”显示器,并愉快地以 1280x720 驱动它。需要再重置一次 X 才能使一切正常工作。
...这就是我们热爱 Linux 的原因。 (-:
答案2
您需要使用nvidia-设置为此。不是 Ubuntu 提供的显示设置。这是因为驱动程序是专有的,在使用这类东西时不太友好。在阅读之前,我强烈建议你阅读如何安装 Nvidia 驱动程序?
这是我的测试用例:
我有一台 Epson 视频光束和计算机显示器。没有视频光束时,显示如下:
现在,连接视频光束并点击检测显示器Nvidia 显示配置部分显示以下内容:
然后,我根据自己的喜好和分辨率拖动布局框(代表视频光束和监视器的框)。它们看起来像这样:
确保选择要默认显示的那个主显示器在选项的底部。
现在,如果你想让两个屏幕显示相同的内容,你需要首先确保两个屏幕支持相同的分辨率,或者至少支持一个共同的分辨率。就我而言,我有这个:
视频光束支持所有4:3分辨率高达 1280x1024
电视监视器支持所有16:9分辨率高达 1920x1080
因此我需要找到两者最高分辨率。我的是 1280x720 或 1024x768。为了更轻松地完成此操作,请选择 Video Beam 并选择克隆如下图“Position”选项中所示:
确保另一台显示器(我这里是电视显示器)是主显示器。至少其中一台必须是主显示器,另一台是克隆显示器才能正常工作。
现在开始选择您需要的分辨率。如果选错了,请按ESC并重复,直到找到最适合显示器和视频光束的分辨率。
再次强调,所有这些都必须通过 Nvidia 设置面板完成。并非所有 Nvidia 显卡都能与 Ubuntu 的显示设置兼容,因为专有驱动程序还不够友好,无法让显示设置正常工作。
答案3
这是 VGA 线!
我用一条更短但质量更高的电缆替换了 3 米长的 BELKIN 电缆,现在 Nvidia 驱动程序可以自动检测 BenQ 投影仪,一切正常。
据一位亚马逊评论员称,BELKIN 线缆设计缺陷:
这是一根结构良好的电缆,但缺少第 9 针,并且无法传递即插即用显示器/电视的 EDID 数据,因此不建议购买。
我使用 Dell Dimension 8250(ATI 9700)、Dell Vostro 1500(NVIDIA 8600)和 Samsung LE40B652 40 英寸电视进行了测试,该电视被检测为“非即插即用”显示器,并使用此 VGA 电缆正确显示高达 1440 x 900 @ 60Hz 的分辨率。
图像质量足够好,但目前的基本要求是 VGA 电缆支持 XP/Vista 的即插即用功能。