Alteração na resolução de inicialização no initramfs no monitor do laptop e no monitor HDMI

Alteração na resolução de inicialização no initramfs no monitor do laptop e no monitor HDMI

Eu tenho Linux Mint 17 no meu laptop. Também tenho um monitor de 22 '' conectado ao laptop usando um cabo HDMI. Meu disco está totalmente criptografado com LUKS e LVM. Na inicialização, recebo um prompt gráfico para inserir a senha das partições criptografadas. A resolução da tela do laptop e do monitor externo está errada ao solicitar a senha. O prompt gráfico e o logotipo do Linux Mint são movidos para o canto superior esquerdo em ambos os monitores e o restante do espaço fica preto. A resolução só está correta depois de fazer login no meu perfil. Isto é o que xrandraparece quando estou logado:

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)

Depois de montar o disco criptografado, posso alterar a resolução dos monitores usando xrandro comando. Mas este comando não está disponível com initramfs.

Recentemente, eu estava corrigindo o brilho da tela de outro laptop na inicialização usando initramfsscript e funcionou. Este script estava definindo o brilho ecoando o valor correto para to /sys/class/backlight/acpi_video0/brightness. Também posso usar algo semelhante para alterar a resolução da tela de alguma forma?

ATUALIZAR

Eu tentei a solução @mikeserv:

  1. Arquivos EDID de monitores (não tenho certeza se estão corretos):

    # 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. Script de gancho para initramfs, carrega i915o módulo e inclui EDIDarquivos no /lib/firmware/edid/diretório interno initramfs(verifiquei e EDIDos arquivos estão dentro do 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. Na reinicialização, adicionei o parâmetro de inicialização (não tenho certeza se deveria ser HDMI-1 ou HDMI1 ou qualquer outra coisa)

    drm_kms_helper.edid_firmware=HDMI1:/lib/firmware/edid/1920x1080.bin
    
  4. Isso não mudou nada. Então eu também tentei:

    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
    

Sem sorte. Tudo está como era antes de eu dar os passos de cima.

Também quero acrescentar que, quando a identificação do monitor HDMI está desconectada, a resolução no monitor do laptop está correta.

O que estou fazendo de errado?

ATUALIZAÇÃO 2

Ainda não funciona. Passos que tomei:

  1. Descobri nomes corretos para meus monitores:

    $ 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. Instalar linux-doc(para obter documentos que descrevem a criação de pacotes personalizados EDID), dos2unix, make(para compilar EDIDarquivos)

    $ sudo apt-get install linux-doc dos2unix make
    
  3. Crie um diretório temporário para compilação e copie os arquivos fonte paraEDID

    $ 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. Edite o arquivo 1366x768.Scom o corretovalores, compilar, copiar para /lib/firmware/edid:

    • Obtenha o modelo de trabalho atual para a tela do meu laptop

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

      Eles são, por sua vez: resolution, clock MHz, hdisp, hsyncstart, hsyncend, htotal, vdisp, vsyncstart, vsyncend,vtotal

    • Calcular valores:

      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
      
    • Versão final 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"
      
    • Compile os arquivos e verifique se não há erros usando 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
      
    • Copiar arquivos para/lib/firmware/edid

      $ sudo cp *.bin /lib/firmware/edid
      
  5. Atualização initramfs, o script de gancho deve adicionar arquivos edid (eles estão lá, eu verifiquei)

    $ sudo update-initramfs -u
    
  6. Na inicialização, edite a linha de comando do grub (pressione shift na inicialização para mostrar o menu do grub e depois pressione e) em:

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

    para

    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
    

Também tentei configurá-lo apenas para um monitor. Mas sem sorte. Estou começando a pensar que não é um problema de resolução, mas sim da própria imagem do Plymouth. Quando vejo a imagem de inicialização, ela não está borrada, esticada ou algo assim e o logotipo do Linux mint é nítido e claro. É um pouco menor que a minha tela e colocado na parte superior esquerda do meu laptop e da tela HDMI.

encontreiesse bugisso é realmente semelhante ao meu problema. Então acho que devo esperar que eles resolvam isso.

Responder1

Seu monitor fornece informações sobre si mesmo usando um padrão digital chamado EDID. O kernel lê essas informações ao detectar um dispositivo de exibição e configura automaticamente sua exibição para corresponder o mais próximo possível do dispositivo de exibição.nativoresolução. Os dispositivos LCD podem, na verdade, suportar apenas uma resolução - a suanativoresolução - eemular, imitartodos os outros. DeWikipédia:

Dados de identificação de exibição estendida(EDID)é uma estrutura de dados fornecida por um display digital para descrever suas capacidades para uma fonte de vídeo (por exemplo, placa gráfica ou decodificador). É o que permite que um computador pessoal moderno saiba que tipos de monitores estão conectados a ele. EDID é definido por um padrão publicado pela Video Electronics Standards Association (VESA). O EDID inclui o nome do fabricante e número de série, tipo de produto, tipo de fósforo ou filtro, temporizações suportadas pelo monitor, tamanho do monitor, dados de luminância e (somente para monitores digitais) dados de mapeamento de pixels.

O problema com isto é que muitas vezes o fornecidoEDIéerradoou de alguma forma corrompido - isso geralmente se deve a fabricantes preguiçosos ou equivocados que precisam programar essas informações no firmware do dispositivo. Pode até resultar de um fio HDMI ruim, mas as chances de isso acontecer são muito menores, pois um cabo digital émuitoé mais provável que simplesmente não funcione. Mas existem outras possibilidades, se você usar KMS provavelmente achará isso interessante:

Hoje, com o advento da configuração do modo Kernel, uma placa gráfica está funcionando corretamente porque todos os componentes seguem os padrões - ou o computador está inutilizável, porque a tela permanece escura após a inicialização ou exibe a área errada. Os casos em que isso acontece são:

  • A placa gráfica não reconhece o monitor.

  • A placa gráfica não consegue detectar nenhum dado EDID.

  • A placa gráfica encaminha incorretamente os dados EDID para o driver.

  • O monitor não envia dados EDID ou envia dados falsos.

  • Um KVM envia seus próprios dados EDID em vez de consultar o monitor conectado.

Adicionar o parâmetro do kernel "nomodeset" ajuda na maioria dos casos, mas causa restrições posteriormente.

∆Isso∆é um trecho deHOWTO.txt do próprio kernel.orgpara KMS EDIDs. Esse arquivo de texto está localizado nomesma pastacomo cinco EDIDs de resolução padrão que você pode fornecer ao kernel na inicialização por meio de um parâmetro do kernel e initramfs para ignorar o EDID fornecido pelo seu monitor.

Se você estiver usando um dos drivers de vídeo de código aberto, você está usando a configuração do modo kernel e pode, por exemplo, usar qualquer uma das cinco predefinições de desvio de resolução KMS EDID já mencionadas. Alternativamente, você pode fornecer seu próprio arquivo EDID inteiramente que o kernel usará em vez das informações fornecidas pelo dispositivo de exibição.

Veresta seçãodo wiki do Arch Linux para mais informações, mas provavelmenteeste tópico do AskUbuntuseria melhor direcionado para sua distribuição.

Se você não estiver usando KMS e, em vez disso, usar os drivers de código fechado nvidia ou AMD, então, até onde sei, suas chances de lidar com resoluções de tempo de inicialização de maneira confiável são quase nulas. Pode ser possível configurá-los em grubou em outro gerenciador de inicializaçãoantesqualquer imagem initramfs é montada, mas a probabilidade de que isso interfira posteriormente na configuração de resolução dos próprios drivers de código fechado quando Xfor iniciada é bastante alta. Se você estivermuitosorte que o fabricante da sua placa-mãe gentilmente forneceu a você uma configuração no firmware UEFI para configurar a resolução do tempo de inicialização e você pode configurá-la antes mesmo de qualquer carregador de inicialização secundário, como grubo carregado. Mas nunca conheci pessoalmente alguém tão sortudo assim.

informação relacionada