ノートパソコンのモニターと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が、うまくいきました。このスクリプトは、正しい値を にエコーすることで明るさを設定していました/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にファイルを含めます(確認したところ、ファイルは initramfs 内にあります)/lib/firmware/edid/initramfsEDID

    # 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(カスタムの作成を説明するドキュメントを取得するためEDID)、、dos2unixmakeファイルをコンパイルするため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 MHzhdisphsyncstarthsyncendhtotalvdispvsyncstartvsyncendvtotal

    • 値を計算します:

      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
    

また、1 つのモニターのみに設定してみました。しかし、まったくうまくいきませんでした。解像度の問題ではなく、プリマス イメージ自体の問題ではないかと考え始めています。ブート イメージを見ると、ぼやけたり、引き伸ばされたりすることはなく、Linux Mint のロゴは鮮明ではっきりしています。画面よりも小さく、ラップトップと HDMI 画面の左上部分に配置されています。

私は見つけたこのバグそれは私の問題と本当に似ています。だから、彼らがこれを修正するまで待つ必要があると思います。

答え1

モニターはEDIDと呼ばれるデジタル規格を使用して自分自身の情報を提供します。カーネルはディスプレイデバイスを検出するとこの情報を読み取り、ディスプレイデバイスのディスプレイ設定にできるだけ近い値になるように自動的にディスプレイを設定します。ネイティブ解像度。LCDデバイスは実際には1つの解像度しかサポートできません。ネイティブ解像度 - そして模倣するその他すべて。ウィキペディア:

拡張ディスプレイ識別データ(EDID)デジタル ディスプレイがビデオ ソース (グラフィック カードやセットトップ ボックスなど) にその機能を説明するために提供するデータ構造です。これにより、最新のパーソナル コンピュータは接続されているモニターの種類を認識できます。EDID は、Video Electronics Standards Association (VESA) が発行した標準によって定義されています。EDID には、製造元の名前とシリアル番号、製品の種類、蛍光体またはフィルターの種類、ディスプレイでサポートされているタイミング、ディスプレイ サイズ、輝度データ、および (デジタル ディスプレイのみ) ピクセル マッピング データが含まれます。

問題は、提供されるEDID間違っているまたは何らかの形で破損している - これは通常、デバイスのファームウェアに情報をプログラムしなければならない怠慢または誤った製造元によるものです。HDMIケーブルの不良が原因である可能性もありますが、デジタルケーブルは多くのまったく機能しない可能性の方が高いです。ただし、他にも可能性があり、KMS を使用している場合は、これが興味深いと思われるでしょう。

現在、カーネル モード設定の登場により、すべてのコンポーネントが標準に準拠しているためグラフィック ボードは正常に動作するか、起動後に画面が暗いままになったり間違った領域が表示されたりしてコンピューターが使用できなくなります。これが発生するケースは次のとおりです。

  • グラフィックボードがモニターを認識しません。

  • グラフィック ボードは EDID データを検出できません。

  • グラフィック ボードが EDID データをドライバーに誤って転送します。

  • モニターは EDID データを送信しないか、偽の EDID データを送信します。

  • KVM は、接続されたモニターを照会する代わりに、独自の EDID データを送信します。

カーネル パラメータ「nomodeset」を追加すると、ほとんどの場合に役立ちますが、後で制限が発生します。

∆それ∆からの抜粋ですkernel.org 独自の HOWTO.txtKMS EDID用です。このテキストファイルは同じフォルダ5 つの標準解像度 EDID として、カーネル パラメータと initramfs を介して起動時にカーネルに提供し、モニターが提供する EDID をバイパスできます。

オープン ソースのディスプレイ ドライバーのいずれかを使用している場合は、カーネル モード設定を使用しているため、たとえば、すでに説明した 5 つの KMS EDID 解像度バイパス プリセットのいずれかを使用できます。または、ディスプレイ デバイスによって提供される情報の代わりに、カーネルが使用する独自の EDID ファイルを完全に提供することもできます。

見るこのセクション詳細についてはArch Linux wikiを参照してください。この AskUbuntu スレッドあなたの配信に的を絞った方が良いでしょう。

KMSを使用せず、代わりにnvidiaまたはAMDのクローズドソースドライバを使用している場合、私が知る限り、ブート時の解像度を確実に処理できる可能性はほぼゼロです。grubまたは別のブートローダーでこれらを構成することは可能です。前にinitramfsイメージをマウントすることは可能ですが、そうすることでクローズドソースドライバの解像度設定に干渉する可能性が高くなります。X起動時の解像度設定に干渉する可能性がかなり高くなります。とても幸運なことに、マザーボードの製造元が UEFI ファームウェアでブート時の解像度を構成する設定を提供してくれているので、セカンダリ ブートローダーなどがgrubロードされる前に設定することができます。ただし、私は個人的に、それほど幸運な人を知りません。

関連情報