设置:
计算机是联想 Thinkpad SL500,使用 USB 端口复制器运行 Ubuntu 12.10 的 LiveCD。
计算机具有 USB 连接至端口复制器。端口复制器具有 DVI 至 HDMI 转换器,可通过 HDMI 连接至索尼 Bravia 电视
初期症状:
端口复制器(音频、USB 端口、LAN 端口)的所有功能(视频除外)均可正常工作。在 dmesg 中,出现以下错误:
[drm:drm_edid_block_valid] *ERROR* EDID checksum is invalid, remainder is `<num>`
usb 2-4.1: DVI-I-1: EDID invalid.
当前状态:
获取 EDID 没有问题,但有很多崩溃,并且即使强制使用也只能部分使用 Displaylink 屏幕(更多详细信息:请参阅编辑 3)。
目前的结论:
因此,经过一段时间的思考,我的结论是:
- 它不是即插即用的
- 它可能有用,但我仍然缺少一些东西
- 它不太稳定
仍然欢迎任何经历过此事的人提供意见。
首次故障排除:
迄今为止的故障排除:
- 使用 Windows Vista 时,外接显示器通过 USB 端口复制器工作
- 将外接显示器直接插入 HDMI 端口时,它工作正常
- 当插入另一台本机运行 Ubuntu 12.10 的笔记本电脑(lenovo thinkpad x61t)时,会出现同样的错误。请注意,所有涉及下载软件包和编译的测试都是在这台笔记本电脑上完成的,因为它本机运行的是 12.10。
从上面可以看出:
- 外接显示器没有问题(因为它可以通过 HDMI 和 Windows 端口复制器工作)
- 一台电脑没有问题(另一台电脑也有同样的情况)
- 显卡没有问题(因为它可以通过 HDMI 和 Windows 端口复制器工作)
- 端口复制器没有问题(因为它适用于 Windows)
似乎与通过 Ubuntu 的 USB 端口复制器识别 DVI 特别相关。
有人通过 USB 端口复制器播放视频吗?如果是,需要什么配置?
这是我需要做的最后一件事,以说服我的妻子将她的电脑从 Windows 切换到 Ubuntu。我差点就成功了!
EDIT1:第二次故障排除
尝试使用 xf86-displaylink-0.3 驱动程序。这里和其他地方有很多关于此问题的帖子。不幸的是,我遇到了一个编译错误,根据一些网站的说法,这是由于 xorg 升级造成的。有人遇到过修复方法吗?似乎加载此驱动程序可能是我需要的步骤,以解决上述错误并进入下一步使其正常工作。
错误如下:
make all-recursive
make[1]: Entering directory `/home/rob/xf86-video-displaylink'
Making all in src
make[2]: Entering directory `/home/rob/xf86-video-displaylink/src'
/bin/bash ../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -fvisibility=hidden -I/usr/include/pixman-1 -I/usr/include/libdrm -I/usr/include/xorg -I/usr/include/X11/dri -g -O2 -MT displaylink.lo -MD -MP -MF .deps/displaylink.Tpo -c -o displaylink.lo displaylink.c
libtool: compile: gcc -DHAVE_CONFIG_H -I. -I.. -fvisibility=hidden -I/usr/include/pixman-1 -I/usr/include/libdrm -I/usr/include/xorg -I/usr/include/X11/dri -g -O2 -MT displaylink.lo -MD -MP -MF .deps/displaylink.Tpo -c displaylink.c -fPIC -DPIC -o .libs/displaylink.o
displaylink.c: In function ‘DisplayLinkFreeRec’:
displaylink.c:165:2: warning: ‘Xfree’ is deprecated (declared at /usr/include/xorg/os.h:234) [-Wdeprecated-declarations]
displaylink.c: In function ‘DisplayLinkProbe’:
displaylink.c:204:10: warning: assignment discards ‘const’ qualifier from pointer target type [enabled by default]
displaylink.c:226:28: warning: assignment from incompatible pointer type [enabled by default]
displaylink.c:237:2: warning: ‘Xfree’ is deprecated (declared at /usr/include/xorg/os.h:234) [-Wdeprecated-declarations]
displaylink.c: In function ‘DisplayLinkPreInit’:
displaylink.c:285:7: error: ‘struct _ScrnInfoRec’ has no member named ‘racMemFlags’
displaylink.c:285:23: error: ‘RAC_FB’ undeclared (first use in this function)
displaylink.c:285:23: note: each undeclared identifier is reported only once for each function it appears in
displaylink.c:285:32: error: ‘RAC_COLORMAP’ undeclared (first use in this function)
displaylink.c:285:47: error: ‘RAC_CURSOR’ undeclared (first use in this function)
displaylink.c:285:60: error: ‘RAC_VIEWPORT’ undeclared (first use in this function)
displaylink.c:287:7: error: ‘struct _ScrnInfoRec’ has no member named ‘racIoFlags’
displaylink.c:290:2: warning: passing argument 3 of ‘fbdevHWInit’ discards ‘const’ qualifier from pointer target type [enabled by default]
In file included from displaylink.c:52:0:
/usr/include/xorg/fbdevhw.h:21:23: note: expected ‘char *’ but argument is of type ‘const char *’
displaylink.c:351:2: warning: ‘Xalloc’ is deprecated (declared at /usr/include/xorg/os.h:215) [-Wdeprecated-declarations]
displaylink.c: In function ‘DisplayLinkScreenInit’:
displaylink.c:474:2: warning: passing argument 1 of ‘fbdevHWAdjustFrame’ makes pointer from integer without a cast [enabled by default]
In file included from displaylink.c:52:0:
/usr/include/xorg/fbdevhw.h:50:23: note: expected ‘ScrnInfoPtr’ but argument is of type ‘int’
displaylink.c:474:2: error: too many arguments to function ‘fbdevHWAdjustFrame’
In file included from displaylink.c:52:0:
/usr/include/xorg/fbdevhw.h:50:23: note: declared here
displaylink.c:554:23: warning: assignment from incompatible pointer type [enabled by default]
displaylink.c: In function ‘DisplayLinkCloseScreen’:
displaylink.c:575:2: warning: passing argument 1 of ‘pScreen->CloseScreen’ makes pointer from integer without a cast [enabled by default]
displaylink.c:575:2: note: expected ‘ScreenPtr’ but argument is of type ‘int’
displaylink.c:575:2: error: too many arguments to function ‘pScreen->CloseScreen’
make[2]: *** [displaylink.lo] Error 1
make[2]: Leaving directory `/home/rob/xf86-video-displaylink/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/rob/xf86-video-displaylink'
make: *** [all] Error 2
EDIT2:第三次故障排除:
我设法进入绿屏。我需要更改函数的返回语句,DisplayLinkCloseScreen
注释掉fbdevhw.h
源代码中的包含语句。
返回语句现在是:
return pScreen->CloseScreen;
这样驱动程序就安装成功了。(警告:我不是软件工程师。)
但是,在创建了xorg.conf
下的文件后xorg.conf.d
,我仍然无法让 displaylink 监视器运行。displaylink 被识别,但随后被删除(从日志中可以看到)。
这是当前的 xorg 配置文件,它有几个细微的变化:
Section "Device"
Identifier "Configured Video Device"
Driver "intel"
BusID "PCI:00:02:0"
EndSection
Section "Monitor"
Identifier "Configured Monitor"
EndSection
Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
Device "Configured Video Device"
EndSection
#################################################
Section "ServerLayout"
Identifier "Server Layout"
Screen 1 "Default Screen" 0 0
Screen 0 "DisplayLinkScreen" rightof "Default Screen"
Option "Xinerama" "on"
Option "Clone" "off"
EndSection
#################################################
Section "Files"
ModulePath "/usr/lib/xorg/modules"
ModulePath "/usr/local/lib/xorg/modules"
ModulePath "/usr/local/lib/xorg/modules/drivers"
EndSection
############### DisplayLink Stuff
###############
Section "Device"
Identifier "DisplayLinkDevice"
driver "displaylink"
Option "fbdev" "/dev/fb1"
Option "ModeValidation" "NoEdidModes"
EndSection
Section "Monitor"
Identifier "DisplayLinkMonitor"
Option "ExactModeTimingsDVI" "TRUE"
HorizSync 15.0 - 70.0
VertRefresh 58.0 - 62.0
Modeline "1024x768" 65.00 1024 1048 1184 1344 768 771 777 806 -h
sync -vsync
EndSection
Section "Screen"
Identifier "DisplayLinkScreen"
Device "DisplayLinkDevice"
Monitor "DisplayLinkMonitor"
SubSection "Display"
Depth 16
Modes "1024x768"
EndSubSection
EndSection
这是 Xorg.0.log 中的部分,以我这个不熟练的眼光来看,它似乎是在取消 displaylink:
[ 33.383] (II) LoadModule: "displaylink"
[ 33.436] (II) Loading /usr/local/lib/xorg/modules/drivers/displaylink_drv.so
[ 33.444] (II) Module displaylink: vendor="X.Org Foundation"
[ 33.445] (II) DL: driver for : displaylink
[ 33.445] (WW) Falling back to old probe method for displaylink
[ 33.484] (II) UnloadModule: "displaylink"
[ 33.484] (II) Unloading displaylink
以下网站对我目前所处的位置很有帮助: http://mulchman.org/blog/?p=90
有任何想法吗?
EDIT3:第四次故障排除
好的,经过更多的工作和更多的浏览(有太多的人尝试这一点,不幸的是,我发现没有人对 12.10 有一个好的答案),我意识到了一些事情:
屏幕不必是绿色。使用 udlfb(在 12.10 中已列入黑名单)时屏幕会显示绿色,使用 udl(在 12.10 中)时屏幕不会显示任何颜色。
不一定需要加载 12.10 之外的任何模块。事实上,如果你这样做,如上所示,它会在 12.10 中引起问题,因为 xorg 1.13 的 API 已经更改,你会遇到很多编译问题
当我尝试修改以前的模块以使其在 12.10 中工作时,我最终在 xorg 中遇到了分段错误
使用本机 12.10 功能(无论是使用 udl 还是 udlfb)都不是即插即用的
我可以在测试设置中使用 udl 或 udlfb 使外接显示器工作,其中我通过运行 强制使用 xorg.conf 文件
startx -- :2 -config <name of xorg.conf file>
。但是:- 它经常导致 xorg 崩溃
- 当它不工作时,我只能让 displaylink 显示器工作,而失去笔记本电脑显示器的显示
:2
;此外,我无法在 displaylink 显示器上看到 Unity - 我只能通过命令让它使用 displaylink 监视器
startx
;否则,尽管存在相同的 conf 文件,它也不会看到 displaylink 监视器,也不会使用它/etc/X11/xconf.d
。