如何在EDID不可用时使Linux运行更好?

我正在使用Mythbuntu 12.04和一台电视,只有在打开电视时才提供EDID信息。由于计算机将用于通过MythTV录制视频,我不希望在计算机运行时始终保持电视开启。

我将EDID保存到文件中,放置在/lib/firmware目录下,并在内核命令行中添加drm_kms_helper.edid_firmware=DVI-I-1:LT26-A.VGA.EDID.bin。内核从此文件加载EDID,并以正确的分辨率启动X。然而,内核仍然尝试从设备读取EDID,导致我的日志被类似以下的消息刷屏:

[   31.926373] [drm:drm_edid_block_valid] *ERROR* EDID checksum is invalid, remainder is 128
[   31.927144] Raw EDID:
[   31.927352]          ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[   31.927882]          ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[   31.928454]          ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[   31.928984]          ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[   31.929513]          ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[   31.930042]          ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[   31.930569]          ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[   31.931097]          ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[   31.931630] radeon 0000:01:00.0: DVI-I-1: Ignoring invalid EDID block 1.
[   31.990143] i2c i2c-3: sendbytes: NAK bailout.
[   31.993215] [drm:radeon_dvi_detect] *ERROR* DVI-I-1: probed a monitor but no|invalid EDID
[   32.023802] [drm] Got external EDID base block and 0 extensions from "LT26-A.VGA.EDID.bin" for connector "DVI-I-1"
[   32.774355] i2c i2c-3: sendbytes: NAK bailout.

添加drm_kms_helper.edid_firmware选项也会在关机或重启时导致长时间延迟。即使显示器开启,这种情况仍然发生。部分原因是所有对plymouth的调用都会暂时挂起,可能是由于plymouthd挂起所致。这会导致在关机时执行的脚本暂停一段时间。不在关机时运行plymouthd可以解决问题,但仍然存在延迟。

延迟结束后,我看到:

[drm:edid_load] *ERROR* Requesting EDID firmware "LT26-A.VGA.EDID.bin" failed (err=-2)

这闪过得非常快,然后出现闪屏或重新启动。我只能用相机录下来。对我来说毫无意义,因为在延迟期间,计算机通过SSH是完全可用的。内核应该能够读取该文件。
我认为这不是一个Plymouth问题。它可能挂起是因为请求的某个视频模式更改挂起了。然而,我希望能够告诉Plymouth始终保持普通的VGA文本模式。
我还尝试了 drm_kms_helper.poll=0drm_kms_helper.poll=N 内核选项。它们可以根据 /sys 设置选项,但我没有看到任何变化。
添加 nomodeset 内核参数可以解决这些问题。不过,X服务器中当前版本的radeon驱动程序无法正常工作,而更新的版本则拒绝运行。
更新:在 /etc/init/plymouth.conf 中关闭时调用plymouthd时添加 --tty=/dev/console 已经修复了关机挂起的问题,即使电视关闭了也是如此。
2个回答

我没有完全相同的问题,但是当我在打开的会话之间切换用户时,我发现了一些与xorg相关的问题:
问题:我有一个分辨率为1600x1050的会话,然后切换到另一个用户的会话,该会话之前也设置为相同的1600x1050分辨率。但是当我切换到这个会话时,屏幕变成了1280x1024,并且由于某种原因,会话的大小非常非常错误(它比屏幕分辨率要大,我无法移动或点击大部分内容,所以不得不重新启动整个Xorg)。
解决方法:幸运的是,我找到了一种巧妙的解决方法: 将分辨率文件名更改为您的分辨率文件名。
  1. 安装get-edid命令:

    sudo apt-get install read-edid
    
  2. 创建一个包含edid信息的bin文件:

    sudo get-edid  > 1600x1050.bin
    
  3. 创建一个用于存储该文件的文件夹:

    sudo mkdir /lib/firmware/edid
    
  4. 复制文件:

    sudo cp 1600x1050.bin /lib/firmware/edid
    
  5. 编辑grub以修改Linux命令以加载此文件到kms:

    sudoedit /etc/default/grub
    

    编辑以下行:

    GRUB_CMDLINE_LINUX_DEFAULT="drm_kms_helper.edid_firmware=edid/1600x1050.bin quiet"
    

    将"your name.bin"文件更改为您的文件名,并运行:

    sudo update-grub
    
  6. 重新启动并进行测试。
出于某种原因,这对我非常有效。 我有这张卡和驱动程序:
fglrxinfo
显示器::0 屏幕:0
OpenGL供应商字符串:Advanced Micro Devices, Inc.
OpenGL渲染器字符串:AMD Radeon HD 6450
OpenGL版本字符串:4.2.12002 Compatibility Profile Context 9.012

我的edid信息如下,在运行命令后显示
# parse-edid < 1600x1050.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 "22T41-H-AN"
        VendorName "KTC"
        ModelName "22T41-H-AN"
        # Block type: 2:0 3:fc
        # Block type: 2:0 3:fd
        HorizSync 15-68
        VertRefresh 49-61
        # Max dot clock (video bandwidth) 150 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    "1680x1050"     # vfreq 59.883Hz, hfreq 64.674kHz
                DotClock        119.000000
                HTimings        1680 1728 1760 1840
                VTimings        1050 1053 1059 1080
                Flags   "-HSync" "+VSync"
        EndMode
        # Block type: 2:0 3:fc
        # Block type: 2:0 3:fd
EndSection

kernel.log:

2139 Oct  2 21:45:06 dans679-computer kernel: [    0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-3.8.0-30-generic root=UUID=939b3111-4906-46ae-9ad7-7faa783d490d ro drm_kms_helper.edid_firmware=edid/1600x1050.bin quiet

我在Launchpad上寻找其他类似的错误报告,但仍在寻找正确的报告。我认为这个问题会影响到KMS(内核模式切换)中的许多事物,不仅仅是用户会话之间的切换,还包括全屏游戏以及不同分辨率下的其他事物。

很难找到正确的报告方式,我希望能得到一些Xorg/Kernel团队的帮助。

我认为这个问题可以在某个低层级上修复,但也可以通过一些更容易的用户解决方法进行修复:例如,在脚本中添加一些测试,检测是否检测到EDID,并询问用户是否允许脚本获取EDID信息并传递给内核命令,然后询问是否正常运行以及用户是否想保留这些设置。

我在Arch wiki kernel mode setting页面上找到了大部分相关信息。

我发表在:

https://askubuntu.com/posts/352978

https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-ati/+bug/579292


Edid必须以

开头

00 FF FF FF FF FF FF 00

但不要是128倍的FF。
可能是因为你没有EDID,可能是因为它被擦除坏了,或者是没有带有EDID芯片,或者很有可能,在显示器或显卡之间的EDID接口上有一些物理接触损坏。甚至可能是在你的显示器内部出了问题。