筆記型電腦顯示器和 HDMI 顯示器上的 initramfs 中的啟動解析度更改

筆記型電腦顯示器和 HDMI 顯示器上的 initramfs 中的啟動解析度更改

我的筆記型電腦上有 Linux Mint 17。我還使用 HDMI 連接線將 22 吋顯示器連接到筆記型電腦。我的磁碟已使用 LUKS 和 LVM 完全加密。啟動時,我收到圖形提示,要求輸入加密分割區的密碼。要求輸入密碼時,筆記型電腦和外接顯示器上的螢幕解析度都是錯誤的。圖形提示和 linux mint 標誌移至兩台顯示器的左上角,其餘空間為黑色。只有在我登入我的個人資料後,解析度才是正確的。這是xrandr我登入時顯示的內容:

Screen 0: minimum 320 x 200, current 3286 x 1080, maximum 32767 x 32767
LVDS1 connected 1366x768+1920+312 (normal left inverted right x axis y axis) 344mm x 194mm
   1366x768       60.1*+   40.1
   1360x768       59.8     60.0
   1024x768       60.0
   800x600        60.3     56.2
   640x480        59.9
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 531mm x 298mm
   1920x1080      60.0*+
   1680x1050      59.9
   1600x900       60.0
   1280x1024      75.0     60.0
   1280x800       59.9
   1152x864       75.0
   1280x720       60.0
   1024x768       75.1     60.0
   832x624        74.6
   800x600        75.0     60.3
   640x480        75.0     60.0
   720x400        70.1
DP1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

安裝加密磁碟後,我可以使用xrandr命令更改顯示器上的解析度。但該命令在initramfs.

我最近正在使用initramfs腳本修復另一台筆記型電腦啟動時的螢幕亮度,並且它有效。該腳本透過將正確值回顯到 to 來設定亮度/sys/class/backlight/acpi_video0/brightness。我還可以使用類似的東西以某種方式改變螢幕解析度嗎?

更新

我嘗試過@mikeserv解決方案:

  1. 來自顯示器的 EDID 檔案(不確定它們是否正確):

    # cat /sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-LVDS-1/edid > /lib/firmware/edid/1366x768.bin
    # cat /sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-HDMI-A-1/edid > /lib/firmware/edid/1920x1080.bin
    
    # hexdump /lib/firmware/edid/1366x768.bin
    0000000 ff00 ffff ffff 00ff e430 033b 0000 0000
    0000010 1600 0401 2290 7813 610a 9ed5 5b5e 269a
    0000020 501a 0054 0000 0101 0101 0101 0101 0101
    0000030 0101 0101 0101 1de2 b456 0050 3038 3024
    0000040 0035 c258 0010 1900 13ec c656 0050 302e
    0000050 3024 0035 c258 0010 1900 0000 fe00 3500
    0000060 4833 3935 3180 3635 4857 0a34 0000 0000
    0000070 0000 3141 0096 0000 0100 0a01 2020 ac00
    0000080
    
    # hexdump /lib/firmware/edid/1920x1080.bin 
    0000000 ff00 ffff ffff 00ff d109 78a5 5445 0000
    0000010 1626 0301 3580 781e b72e a4d5 5456 279f
    0000020 500c a554 806b 0081 c081 8081 c0a9 00b3
    0000030 c0d1 0101 0101 3a02 1880 3871 402d 2c58
    0000040 0045 2a13 0021 1e00 0000 ff00 4c00 4339
    0000050 3030 3537 3039 3931 200a 0000 fd00 3200
    0000060 1e4c 1153 0a00 2020 2020 2020 0000 fc00
    0000070 4200 6e65 2051 4c47 3432 3035 200a d900
    0000080
    
  2. initramfs 的掛鉤腳本,載入i915模組並將EDID檔案包含到/lib/firmware/edid/內部目錄中initramfs(我已經檢查過並且EDID檔案位於 initramfs 內)

    # cat /etc/initramfs-tools/hooks/include-edid-data 
    #!/bin/sh
    
    PREREQ="udev"
    prereqs()
    {
       echo "$PREREQ"
    }
    
    case $1 in
    prereqs)
       prereqs
       exit 0
       ;;
    esac
    
    . /usr/share/initramfs-tools/hook-functions
    # Begin real processing below this line
    
    if [ ! -e "${DESTDIR}/lib/firmware/edid" ]; then
        mkdir -p "${DESTDIR}/lib/firmware/edid"
    fi
    
    if [ -r "/lib/firmware/edid/1366x768.bin" ]; then
       cp "/lib/firmware/edid/1366x768.bin" "${DESTDIR}/lib/firmware/edid/"
    fi
    
    if [ -r "/lib/firmware/edid/1920x1080.bin" ]; then
       cp "/lib/firmware/edid/1920x1080.bin" "${DESTDIR}/lib/firmware/edid/"
    fi
    
    manual_add_modules i915
    
    exit 0
    
    # chmod a+rx /etc/initramfs-tools/hooks/include-edid-data
    # update-initramfs -u
    
  3. 重新啟動時,我新增了啟動參數(不確定它應該是 HDMI-1 還是 HDMI1 還是其他參數)

    drm_kms_helper.edid_firmware=HDMI1:/lib/firmware/edid/1920x1080.bin
    
  4. 它沒有改變任何東西。所以我也嘗試過:

    drm_kms_helper.edid_firmware=HDMI-1:/lib/firmware/edid/1920x1080.bin
    drm_kms_helper.edid_firmware=HDMI1:edid/1920x1080.bin
    drm_kms_helper.edid_firmware=HDMI-1:edid/1920x1080.bin
    

一點運氣都沒有。一切都和我從上面踏出腳步之前一樣。

我還想補充一點,當 HDMI 顯示器 ID 斷開連接時,筆記型電腦顯示器上的解析度是正確的。

我究竟做錯了什麼?

更新2

還是行不通。我採取的步驟:

  1. 找到我的顯示器的正確名稱:

    $ for p in /sys/class/drm/*/status; do if [ "$(cat "$p")" == "connected" ]; then echo -n "$p" | awk -F '/' '{print $5}'; fi; done
    card0-HDMI-A-1
    card0-LVDS-1
    
  2. 安裝linux-doc(取得描述自訂建立的文件EDIDdos2unixmake(用於編譯EDID文件)包

    $ sudo apt-get install linux-doc dos2unix make
    
  3. 建立編譯暫存目錄並複製原始檔EDID

    $ mkdir ~/Tmp/edid
    $ cd ~/Tmp/edid
    $ cp /usr/share/doc/linux-doc/EDID/* .
    $ rm *.S
    $ cp /usr/share/doc/linux-doc/EDID/1920x1080.S .
    $ cp /usr/share/doc/linux-doc/EDID/1920x1080.S 1366x768.S
    
  4. 編輯文件1366x768.S正確價值觀,編譯,複製到/lib/firmware/edid

    • 取得我的筆記型電腦螢幕的目前工作模式

      $ xvidtune -show
      "1366x768"     76.50   1366 1402 1450 1546    768  771  776  824 -hsync -vsync
      

      它們依序是:resolution, clock MHz, hdisp, hsyncstart, hsyncend, htotal, vdisp, vsyncstart, vsyncend,vtotal

    • 計算值:

      CLOCK = 76500
      XPIX    = hdisp                               = 1366
      XBLANK  = htotal - hdisp        = 1546 - 1366 = 180
      XOFFSET = hsyncstart - hdisp    = 1402 - 1366 = 36
      XPULSE  = hsyncend - hsyncstart = 1450 - 1402 = 48
      
      YPIX    = vdisp = 768
      YBLANK  = vtotal - vdisp             = 824 - 768      = 56
      YOFFSET = 63 + vsyncstart - vdisp    = 63 + 771 - 768 = 66
      YPULSE  = 63 + vsyncend - vsyncstart = 63 + 776 - 771 = 68
      
      TIMING_NAME "Linux HDR"
      CRC 0xcd
      
    • 最終版本1366x768.S

      $ cat 1366x768.S
      /* EDID */
      #define VERSION 1
      #define REVISION 3
      
      /* Display */
      #define CLOCK 76500 /* kHz */
      #define XPIX 1366
      #define YPIX 768
      #define XY_RATIO XY_RATIO_16_9
      #define XBLANK 180
      #define YBLANK 56
      #define XOFFSET 36
      #define XPULSE 48
      #define YOFFSET 66
      #define YPULSE 68
      #define DPI 96
      #define VFREQ 60 /* Hz */
      #define TIMING_NAME "Linux HDR"
      #define ESTABLISHED_TIMINGS_BITS 0x00 /* none */
      #define HSYNC_POL 1
      #define VSYNC_POL 1
      #define CRC 0xcd
      
      #include "edid.S"
      
    • 編譯檔並使用edid-decode( sudo apt-get install edid-decode) 檢查是否沒有錯誤:

      $ make clean && make
      rm 1920x1080.o 1366x768.o
      
      $ ls -1 *.bin
      1366x768.bin
      1920x1080.bin
      
      $ edid-decode 1366x768.bin
      Extracted contents:
      header:          00 ff ff ff ff ff ff 00
      serial number:   31 d8 00 00 00 00 00 00 05 16
      version:         01 03
      basic params:    6d 23 14 78 ea
      chroma info:     5e c0 a4 59 4a 98 25 20 50 54
      established:     00 00 00
      standard:        8b c0 01 01 01 01 01 01 01 01 01 01 01 01 01 01
      descriptor 1:    e2 1d 56 b4 50 00 38 30 24 30 35 00 63 c8 10 00 00 1e
      descriptor 2:    00 00 00 ff 00 4c 69 6e 75 78 20 23 30 0a 20 20 20 20
      descriptor 3:    00 00 00 fd 00 3b 3d 30 32 08 00 0a 20 20 20 20 20 20
      descriptor 4:    00 00 00 fc 00 4c 69 6e 75 78 20 48 44 52 0a 20 20 20
      extensions:      00
      checksum:        cd
      
      Manufacturer: LNX Model 0 Serial Number 0
      Made week 5 of 2012
      EDID version: 1.3
      Analog display, Input voltage level: 0.7/0.7 V
      Sync: Separate Composite Serration 
      Maximum image size: 35 cm x 20 cm
      Gamma: 2.20
      DPMS levels: Standby Suspend Off
      RGB color display
      First detailed timing is preferred timing
      Established timings supported:
      Standard timings supported:
        1360x816@60Hz
      Detailed mode: Clock 76.500 MHz, 355 mm x 200 mm
                     1366 1402 1450 1546 hborder 0
                      768  771  776  824 vborder 0
                     +hsync +vsync
      Serial number: Linux #0
          Monitor ranges: 59-61HZ vertical, 48-50kHz horizontal, max dotclock 80MHz
      Monitor name: Linux HDR
         Checksum: 0xcd
      
      $ edid-decode 1920x1080.bin
      Extracted contents:
      header:          00 ff ff ff ff ff ff 00
      serial number:   31 d8 00 00 00 00 00 00 05 16
      version:         01 03
      basic params:    6d 32 1c 78 ea
      chroma info:     5e c0 a4 59 4a 98 25 20 50 54
      established:     00 00 00
      standard:        d1 c0 01 01 01 01 01 01 01 01 01 01 01 01 01 01
      descriptor 1:    02 3a 80 18 71 38 2d 40 58 2c 45 00 f4 19 11 00 00 1e
      descriptor 2:    00 00 00 ff 00 4c 69 6e 75 78 20 23 30 0a 20 20 20 20
      descriptor 3:    00 00 00 fd 00 3b 3d 42 44 0f 00 0a 20 20 20 20 20 20
      descriptor 4:    00 00 00 fc 00 4c 69 6e 75 78 20 46 48 44 0a 20 20 20
      extensions:      00
      checksum:        05
      
      Manufacturer: LNX Model 0 Serial Number 0
      Made week 5 of 2012
      EDID version: 1.3
      Analog display, Input voltage level: 0.7/0.7 V
      Sync: Separate Composite Serration 
      Maximum image size: 50 cm x 28 cm
      Gamma: 2.20
      DPMS levels: Standby Suspend Off
      RGB color display
      First detailed timing is preferred timing
      Established timings supported:
      Standard timings supported:
        1920x1152@60Hz
      Detailed mode: Clock 148.500 MHz, 500 mm x 281 mm
                     1920 2008 2052 2200 hborder 0
                     1080 1084 1089 1125 vborder 0
                     +hsync +vsync
      Serial number: Linux #0
          Monitor ranges: 59-61HZ vertical, 66-68kHz horizontal, max dotclock 150MHz
      Monitor name: Linux FHD
         Checksum: 0x5
      
    • 將文件複製到/lib/firmware/edid

      $ sudo cp *.bin /lib/firmware/edid
      
  5. 更新initramfs,鉤子腳本應該添加 edid 檔案(它們在那裡,我已經檢查過)

    $ sudo update-initramfs -u
    
  6. 啟動時,編輯 grub 命令列(啟動時按 Shift 鍵顯示 grub 選單,然後按e):

    linux   /vmlinuz-3.13.0-24-generic root=/dev/mapper/mint--vg-root ro   quiet splash $vt_handoff
    

    linux   /vmlinuz-3.13.0-24-generic root=/dev/mapper/mint--vg-root ro   quiet splash $vt_handoff drm_kms_helper.edid_firmware=card0-LVDS-1:/lib/firmware/edid/1366x768.bin drm_kms_helper.edid_firmware=card0-HDMI-A-1:/lib/firmware/edid/1920x1080.bin
    

我也嘗試將其設定為僅適用於一台顯示器。但一點運氣都沒有。我開始認為這不是解析度的問題,而是普利茅斯圖像本身的問題。當我看到啟動圖像時,它沒有模糊、拉伸或任何其他情況,而且 Linux mint 標誌清晰銳利。它比我的螢幕小一些,位於我的筆記型電腦和 HDMI 螢幕的左上角。

我發現了這個錯誤這與我的問題非常相似。所以我想我必須等待他們解決這個問題。

答案1

您的顯示器使用稱為 EDID 的數位標準提供有關其自身的資訊。內核在檢測到顯示設備時讀取此信息,並自動配置其顯示以盡可能匹配顯示設備的顯示本國的解決。事實上,LCD 設備只能支援一種分辨率 - 它們的分辨率本國的解析度 - 和模擬所有其他人。從維基百科:

擴展顯示識別數據(EDID)是數位顯示器提供的資料結構,用於向視訊來源(例如顯示卡或機上盒)描述其功能。它使現代個人電腦能夠知道連接到它的顯示器類型。 EDID 由視訊電子標準協會 (VESA) 發布的標準定義。 EDID 包括製造商名稱和序號、產品類型、磷光體或濾光片類型、顯示器支援的時序、顯示器尺寸、亮度資料和(僅適用於數位顯示器)像素對映資料。

這樣做的問題是,通常所提供的EDID錯誤的或以某種方式損壞 - 這通常是由於製造商懶惰或誤導,必須將該資訊編程到設備的韌體中。它甚至可能是由於 HDMI 線損壞造成的,但這種情況的可能性要小得多,因為數位電纜是很多更有可能根本不起作用。但還有其他可能性,如果您使用 KMS,您可能會發現這很有趣:

如今,隨著內核模式設定的出現,圖形板要么可以正常工作,因為所有組件都遵循標準,要么電腦無法使用,因為螢幕在啟動後保持黑暗或顯示錯誤的區域。發生這種情況的情況有:

  • 顯示卡無法辨識顯示器。

  • 顯示卡無法偵測到任何 EDID 資料。

  • 圖形板錯誤地將 EDID 資料轉送到驅動程式。

  • 顯示器不發送或發送虛假 EDID 資料。

  • KVM 發送自己的 EDID 數據,而不是查詢連接的顯示器。

新增核心參數「nomodeset」在大多數情況下會有所幫助,但會在以後造成限制。

Δ那個Δ摘自kernel.org 自己的 HOWTO.txt對於 KMS EDID。該文字檔案位於同一資料夾作為五個標準解析度 EDID,您可以在啟動時透過內核參數和 initramfs 提供內核,以便繞過顯示器提供的 EDID。

如果您使用的是開源顯示驅動程式之一,則您正在使用核心模式設置,並且可以使用已經提到的五個 KMS EDID 解析度旁路預設中的任何一個。或者,您可以完全提供自己的 EDID 文件,核心將使用該文件來代替顯示設備提供的資訊。

本節Arch Linux wiki 的更多信息,但可能這個 AskUbuntu 線程會更好地針對您的發行版。

如果您不使用 KMS,而是使用 nvidia 或 AMD 閉源驅動程序,那麼據我所知,您可靠處理啟動時分辨率的機會幾乎為零。可以在grub或其他引導程式中配置這些任何 initramfs 映像都會被安裝,但這樣做以後在啟動時幹擾閉源驅動程式自己的解析度配置的可能性X非常高。如果你是非常幸運的是,您的主機板製造商在 UEFI 韌體中為您提供了一個用於配置啟動時間解析度的設置,您甚至可以在grub加載任何輔助啟動載入程式之前對其進行設定。不過,我個人從未見過如此幸運的人。

相關內容