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

2

Eu tenho o Linux Mint 17 no meu laptop. Também tenho 22 '' monitor conectado ao laptop usando o cabo HDMI. Meu disco se totalmente criptografado com LUKS e LVM. Na inicialização, recebo uma solicitação gráfica para inserir a senha para partições criptografadas. Resolução de tela em ambos laptop e monitor externo está errado ao pedir senha. O prompt gráfico e o logotipo do mint são movidos para o canto superior esquerdo em ambos os monitores e o restante do espaço é preto. A resolução está correta somente depois de efetuar login no meu perfil. Isto é o que o xrandr mostra 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)

Após a montagem do disco criptografado, posso alterar a resolução nos monitores usando o comando xrandr . Mas este comando não está disponível com initramfs .

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

UPDATE

Eu tentei a solução @mikeserv:

  1. Arquivos EDID dos 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. Gancho de script para initramfs, carrega i915 module e inclui EDID arquivos no diretório /lib/firmware/edid/ dentro de initramfs (eu verifiquei e EDID 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 deve ser HDMI-1 ou HDMI1 ou qualquer outra coisa)

    drm_kms_helper.edid_firmware=HDMI1:/lib/firmware/edid/1920x1080.bin
    
  4. 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 é como era antes de eu dar passos de cima.

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

O que estou fazendo de errado?

UPDATE 2

Ainda não está funcionando. Etapas que tomei:

  1. Descobri os nomes corretos dos 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. Instale linux-doc (para obter docs descrevendo a criação de pacotes personalizados EDID ), dos2unix , make (para compilar EDID files)

    $ sudo apt-get install linux-doc dos2unix make
    
  3. Crie um diretório temporário para compilar e copiar arquivos de origem para 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. Edite o arquivo 1366x768.S com os valores corretos, copie para /lib/firmware/edid :

    • Obtenha a modelagem 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
      
    • Copie os arquivos para /lib/firmware/edid

      $ sudo cp *.bin /lib/firmware/edid
      
  5. Atualize 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 alguma. Estou começando a pensar que não é um problema com resolução, mas com a própria imagem plymouth. Quando vejo a imagem de inicialização, ela não está borrada, esticada ou qualquer coisa, e o logotipo do Linux Mint é nítido e claro. É apenas menor do que a minha tela e colocado na parte superior esquerda do meu laptop e tela HDMI.

Eu encontrei este bug que é muito parecido com o meu problema. Então, acho que devo esperar que eles consertem isso.

    
por piotrekkr 17.06.2014 / 12:01

1 resposta

2

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 da resolução nativa do dispositivo de exibição. Os dispositivos LCD podem, na verdade, suportar apenas uma resolução - sua resolução nativa - e emular todos os outros. De wikipedia :

Extended display identification data (EDID) is a data structure provided by a digital display to describe its capabilities to a video source (e.g. graphics card or set-top box). It is what enables a modern personal computer to know what kinds of monitors are connected to it. EDID is defined by a standard published by the Video Electronics Standards Association (VESA). The EDID includes manufacturer name and serial number, product type, phosphor or filter type, timings supported by the display, display size, luminance data and (for digital displays only) pixel mapping data.

O problema com isto é que muitas vezes o EDID errado está errado ou de alguma forma corrupto - isto é geralmente devido a fabricantes preguiçosos ou mal orientados que têm que programar isso informações no firmware do dispositivo. Pode até resultar de um fio HDMI ruim, mas as chances disso são muito menores, já que um cabo digital é muito mais propenso a simplesmente não funcionar. Mas há outras possibilidades, se você usar o KMS, provavelmente achará isso interessante:

Today, with the advent of Kernel Mode Setting, a graphics board is either correctly working because all components follow the standards - or the computer is unusable, because the screen remains dark after booting or it displays the wrong area. Cases when this happens are:

  • 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 envia dados não EDID falsos ou não.

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

Adding the kernel parameter "nomodeset" helps in most cases, but causes restrictions later on.

∆That∆ é um excerto do próprio HOWTO.txt do kernel.org para o KMS EDID. Esse arquivo de texto está localizado na mesma pasta como cinco EDIDs de resolução padrão que você pode fornecer ao kernel durante a inicialização um parâmetro do kernel e initramfs para ignorar o EDID fornecido pelo seu monitor.

Se você estiver usando um dos drivers de exibição de software livre, 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 EDGE do KMS 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.

Veja esta seção do wiki do Arch Linux para mais informações, mas provavelmente Este tópico do AskUbuntu seria melhor direcionado para a sua distribuição.

Se você não estiver usando o KMS e estiver usando os drivers nvidia ou AMD de código fechado, então, até onde eu saiba, suas chances de lidar com as resoluções de tempo de inicialização de forma confiável são quase nulas. Pode ser possível configurá-los em grub ou outro carregador de inicialização antes de qualquer imagem do initramfs ser montada, mas a probabilidade de isso interferir posteriormente na configuração de resolução do próprio driver de código fechado quando X starts é bem alto. Se você tiver muito sorte, o fabricante da sua placa-mãe forneceu a você uma configuração no firmware UEFI para configurar a resolução da hora de inicialização e você pode configurá-la antes mesmo de qualquer carregador de inicialização secundário como grub ser carregado em absoluto. Eu nunca conheci pessoalmente alguém tão sortudo assim.

    
por 17.06.2014 / 19:28