노트북 모니터 및 HDMI 모니터의 initramfs에서 부팅 해상도 변경

노트북 모니터 및 HDMI 모니터의 initramfs에서 부팅 해상도 변경

내 노트북에는 Linux Mint 17이 있습니다. 22인치 모니터도 HDMI 케이블을 이용해 노트북에 연결했습니다. 내 디스크는 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. i915모듈을 로드하고 EDID파일을 /lib/firmware/edid/내부 디렉터리 에 포함하는 initramfs용 후크 스크립트 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(사용자 정의 생성을 설명하는 문서를 얻기 위해 EDID) dos2unix, make( 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
    

또한 하나의 모니터에서만 작동하도록 설정해 보았습니다. 그러나 전혀 행운이 없습니다. 해상도 문제가 아니라 플리머스 이미지 자체의 문제라는 생각이 들기 시작했습니다. 부팅 이미지를 보면 흐릿하거나 늘어지거나 하는 일 없이 리눅스 민트 로고가 선명하고 선명하게 보입니다. 내 화면보다 약간 작으며 내 노트북과 HDMI 화면의 왼쪽 상단에 위치합니다.

찾았어요이 오류이것은 내 문제와 매우 유사합니다. 그래서 나는 그들이 이것을 알아낼 때까지 기다려야 할 것이라고 생각합니다.

답변1

모니터는 EDID라는 디지털 표준을 사용하여 자체 정보를 제공합니다. 커널은 디스플레이 장치가 감지되면 이 정보를 읽고 디스플레이 장치의 디스플레이와 최대한 일치하도록 디스플레이를 자동으로 구성합니다.국가의해결하다. 실제로 LCD 장치는 한 가지 해상도만 지원할 수 있습니다.국가의해상도 - 및시뮬레이션다른 모든. ~에서위키피디아:

식별 데이터의 확장된 표시(EDID)비디오 소스(예: 그래픽 카드 또는 셋톱 박스)에 기능을 설명하기 위해 디지털 디스플레이에서 제공하는 데이터 구조입니다. 이를 통해 최신 개인용 컴퓨터는 연결된 모니터 유형을 알 수 있습니다. EDID는 VESA(Video Electronics Standards Association)에서 발표한 표준에 따라 정의됩니다. EDID에는 제조업체 이름 및 일련 번호, 제품 유형, 형광체 또는 필터 유형, 디스플레이 지원 타이밍, 디스플레이 크기, 밝기 데이터 및 (디지털 디스플레이에만 해당) 픽셀 매핑 데이터가 포함됩니다.

이것의 문제는 일반적으로 제공되는EDID잘못된또는 어떤 방식으로든 손상되었습니다. 이는 일반적으로 해당 정보를 장치의 펌웨어에 프로그래밍하는 제조업체 측의 게으름이나 잘못된 지시로 인해 발생합니다. HDMI 케이블이 손상되어 발생할 수도 있지만 디지털 케이블이 손상되어 발생할 가능성은 훨씬 적습니다.많은전혀 작동하지 않을 가능성이 높습니다. 그러나 다른 가능성도 있습니다. KMS를 사용하면 다음과 같은 흥미로운 사실을 발견할 수 있습니다.

요즘에는 커널 모드 설정이 등장하면서 모든 구성 요소가 표준을 따르기 때문에 그래픽 보드가 제대로 작동하거나, 부팅 후 화면이 계속 어두워지거나 잘못된 영역이 표시되어 컴퓨터를 사용할 수 없게 됩니다. 이는 다음과 같은 경우에 발생합니다.

  • 그래픽카드가 모니터를 인식하지 못합니다.

  • 그래픽 카드가 EDID 데이터를 감지할 수 없습니다.

  • 그래픽 보드가 EDID 데이터를 드라이버에 잘못 전달합니다.

  • 모니터가 잘못된 EDID 데이터를 보내지 않거나 보냅니다.

  • KVM은 연결된 모니터에 쿼리하는 대신 자체 EDID 데이터를 보냅니다.

커널 매개변수 "nomodeset"를 추가하면 대부분의 경우 도움이 되지만 나중에 제한이 발생합니다.

Δ저것Δ에서 발췌kernel.org의 HOWTO.txtKMS EDID의 경우. 텍스트 파일은 다음 위치에 있습니다.같은 폴더5개의 표준 해상도 EDID 중에서 모니터가 제공하는 EDID를 우회하기 위해 커널 매개변수 및 initramfs를 통해 부팅 시 커널을 제공할 수 있습니다.

오픈 소스 디스플레이 드라이버 중 하나를 사용하는 경우 커널 모드 설정을 사용하고 있으며 이미 언급한 5가지 KMS EDID 해상도 우회 사전 설정 중 하나를 사용할 수 있습니다. 또는 디스플레이 장치에서 제공하는 정보 대신 커널이 사용하는 자체 EDID 파일을 완전히 제공할 수 있습니다.

바라보다이 섹션의Arch Linux 위키에 대한 추가 정보가 있지만 어쩌면이 AskUbuntu 스레드배포판을 타겟팅하는 것이 좋습니다.

KMS를 사용하지 않고 대신 nvidia 또는 AMD 폐쇄 소스 드라이버를 사용하는 경우 제가 아는 한 부팅 시 해상도를 안정적으로 처리할 가능성은 거의 0입니다. 이는 grub또는 다른 부트로더에서 구성 할 수 있습니다.앞으로모든 initramfs 이미지가 설치되지만 나중에 부팅 시 폐쇄 소스 드라이버의 자체 해상도 구성을 방해할 가능성이 X매우 높습니다. 당신이라면 어떨까요?매우다행히 마더보드 제조업체에서는 부팅 시간 해상도 구성을 위한 UEFI 펌웨어 설정을 제공하며 grub보조 부트 로더가 로드되기 전에 설정할 수 있습니다. 그러나 나는 개인적으로 그렇게 운이 좋은 사람을 본 적이 없습니다.

관련 정보