当 EDID 不可用时,如何让 Linux 表现得更好?

dre*_*ers 7 plymouth kernel graphics radeon drivers

我将 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.
Run Code Online (Sandbox Code Playgroud)

添加 drm_kms_helper.edid_firmware 选项也会在关闭或重新启动时导致长时间延迟。即使显示器打开,它也会发生。部分原因是由于所有调用plymouth挂起一段时间,可能是由于plymouthd挂起。这会使在关机时执行的脚本挂起一段时间。不在plymouthd关机时运行会有所帮助,但仍有延迟。

延迟后,我看到:

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

这会非常快速地闪烁,然后是启动画面或重新启动。我只能用相机记录下来。这对我来说毫无意义,因为在延迟期间,计算机可以通过 SSH 完全使用。内核应该能够读取该文件。

我不认为这是普利茅斯的问题。它可能正在挂起,因为它请求的某些视频模式更改正在挂起。但是,我希望能够告诉 Plymouth 始终保持普通的 VGA 文本模式。

我也试过drm_kms_helper.poll=0drm_kms_helper.poll=N内核选项。他们可以根据 /sys 设置选项,但我没有看到任何变化。

添加nomodeset内核参数可以解决这些问题。但是,X 服务器中当前版本的 radeon 驱动程序无法正常工作,并且较新的版本拒绝运行。

更新:添加--tty=/dev/console到关机时调用 plymouthd/etc/init/plymouth.conf已修复关机挂起,即使在电视关闭时也是如此。

小智 2

我没有完全相同的问题,但是当我在打开的会话之间切换用户时,我发现 xorg 存在一些问题:

问题:我的会话分辨率为 1600x1050,然后切换到之前设置为相同 1600x1050 分辨率的另一个用户会话。但是当我切换到此会话时,屏幕变为 1280x1024,并且由于某种原因,会话的大小非常错误(它大于屏幕分辨率,我无法移动或单击大部分内容,因此我必须重新启动所有 Xorg)。

解决方法:幸运的是,我找到了一些方法以一种棘手的方式解决它:用您的分辨率文件更改分辨率文件名。

  1. 安装 get-edid 命令:

    sudo apt-get install read-edid
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个包含edid信息的bin文件:

    sudo get-edid  > 1600x1050.bin
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建一个文件夹来存储该文件:

     sudo mkdir /lib/firmware/edid
    
    Run Code Online (Sandbox Code Playgroud)
  4. 复制文件:

     sudo cp 1600x1050.bin /lib/firmware/edid
    
    Run Code Online (Sandbox Code Playgroud)
  5. 编辑 grub 编辑 linux 命令以在 kms 中加载此文件:

     sudoedit /etc/default/grub
    
    Run Code Online (Sandbox Code Playgroud)

    编辑行:

     GRUB_CMDLINE_LINUX_DEFAULT="drm_kms_helper.edid_firmware=edid/1600x1050.bin quiet" 
    
    Run Code Online (Sandbox Code Playgroud)

    更改您的 name.bin 文件并运行

     sudo update-grub
    
    Run Code Online (Sandbox Code Playgroud)
  6. 重新启动并测试。

出于某种原因,它对我来说非常有效。我有这张卡和驱动程序:
fglrxinfo
显示::0 屏幕:0
OpenGL 供应商字符串:Advanced Micro Devices, Inc.
OpenGL 渲染器字符串:AMD Radeon HD 6450
OpenGL 版本字符串:4.2.12002 兼容性配置文件上下文 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
Run Code Online (Sandbox Code Playgroud)

内核日志:

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
Run Code Online (Sandbox Code Playgroud)

我一直在寻找启动板中类似的其他错误报告,但仍在寻找正确的报告。我认为这个问题会影响KMS(内核模式切换)中的很多事情,不仅仅是用户会话之间的切换,还有不同分辨率的全屏游戏和其他事情。

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

我认为这可以在某个低级别上修复,但也可以通过这种解决方法以对用户来说更简单的方式修复:例如添加一些脚本来测试是否检测到 edid,并询问用户是否想要让脚本获取 edid 信息并将其传递给内核命令,然后询问它是否工作正常以及用户是否想要保留这些设置。

我在Arch wiki 内核模式设置页面中找到了大部分信息

我将其发布在:

https://askubuntu.com/posts/352978

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


小智 1

艾迪德必须开始于

00 FF FF FF FF FF FF 00
Run Code Online (Sandbox Code Playgroud)

但不是 FF 的 128 倍。

您没有 EDID 可能是因为它被擦除损坏,它不是带有 EDID 的芯片,或者很可能是显示器或视频卡之间的 EDID 接口上的某些物理接触损坏。或者甚至在您的显示器内。