Cambio de resolución de arranque en initramfs en el monitor de la computadora portátil y el monitor HDMI

Cambio de resolución de arranque en initramfs en el monitor de la computadora portátil y el monitor HDMI

Tengo Linux Mint 17 en mi computadora portátil. También tengo un monitor de 22 '' conectado a una computadora portátil mediante un cable HDMI. Mi disco está completamente cifrado con LUKS y LVM. Al arrancar, aparece un mensaje gráfico para ingresar la contraseña para las particiones cifradas. La resolución de pantalla tanto en la computadora portátil como en el monitor externo es incorrecta al solicitar la contraseña. El mensaje gráfico y el logotipo de Linux Mint se mueven a la esquina superior izquierda en ambos monitores y el resto del espacio es negro. La resolución es correcta solo después de iniciar sesión en mi perfil. Esto es lo que xrandrse muestra cuando inicio sesión:

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)

Después de montar el disco cifrado, puedo cambiar la resolución en los monitores usando xrandrel comando. Pero este comando no está disponible con initramfs.

Recientemente estuve arreglando el brillo de la pantalla de otra computadora portátil al arrancar usando initramfsun script y funcionó. Este script estaba configurando el brillo haciendo eco del valor correcto en to /sys/class/backlight/acpi_video0/brightness. ¿Puedo usar también algo similar para cambiar la resolución de la pantalla de alguna manera?

ACTUALIZAR

Probé la solución @mikeserv:

  1. Archivos EDID de monitores (no estoy seguro si son correctos):

    # 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 enlace para initramfs, carga i915el módulo e incluye EDIDarchivos en /lib/firmware/edid/el directorio interno initramfs(lo he verificado y EDIDlos archivos están dentro de 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. Al reiniciar, agregué el parámetro de arranque (no estoy seguro si debería ser HDMI-1 o HDMI1 o algo más)

    drm_kms_helper.edid_firmware=HDMI1:/lib/firmware/edid/1920x1080.bin
    
  4. No cambió nada. Entonces también probé:

    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
    

No hubo suerte en absoluto. Todo es como era antes de que diera pasos desde arriba.

También quiero agregar que cuando la identificación del monitor HDMI está desconectada, la resolución en el monitor de la computadora portátil es correcta.

¿Qué estoy haciendo mal?

ACTUALIZACIÓN 2

Sigue sin funcionar. Pasos que tomé:

  1. Descubrí los nombres correctos para mis 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 obtener documentos que describan la creación de paquetes personalizados EDID) dos2unix, make(para compilar EDIDarchivos)

    $ sudo apt-get install linux-doc dos2unix make
    
  3. Cree un directorio temporal para compilar y copiar archivos fuente 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. Editar archivo 1366x768.Scon correctovalores, compilar, copiar a /lib/firmware/edid:

    • Obtener el modelo de trabajo actual para la pantalla de mi computadora portátil

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

      Son a su 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
      
    • Versión definitiva 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 archivos y verifique si no hay errores 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 archivos a/lib/firmware/edid

      $ sudo cp *.bin /lib/firmware/edid
      
  5. Actualización initramfs, el script de enlace debería agregar archivos editados (están ahí, lo he comprobado)

    $ sudo update-initramfs -u
    
  6. En el arranque, edite la línea de comando de grub (presione Mayús en el arranque para mostrar el menú de grub y luego presione e) desde:

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

    a

    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
    

También intenté configurarlo solo para un monitor. Pero no hubo suerte en absoluto. Estoy empezando a pensar que no es un problema de resolución sino de la imagen del Plymouth en sí. Cuando veo la imagen de arranque, no está borrosa, estirada ni nada parecido y el logotipo de Linux Mint es nítido y claro. Es simplemente más pequeño que mi pantalla y está ubicado en la parte superior izquierda de mi computadora portátil y en la pantalla HDMI.

He encontradoeste errorEso es muy similar a mi problema. Entonces creo que debo esperar a que solucionen esto.

Respuesta1

Su monitor proporciona información sobre sí mismo mediante un estándar digital llamado EDID. El kernel lee esta información cuando detecta un dispositivo de visualización y configura automáticamente su pantalla para que coincida lo más posible con la del dispositivo de visualización.nativoresolución. En realidad, los dispositivos LCD sólo pueden admitir una resolución: sunativoresolución - yemulartodos los otros. DeWikipedia:

Datos de identificación de pantalla ampliada(EDID)es una estructura de datos proporcionada por una pantalla digital para describir sus capacidades a una fuente de vídeo (por ejemplo, tarjeta gráfica o decodificador). Es lo que permite a una computadora personal moderna saber qué tipos de monitores están conectados a ella. EDID está definido por un estándar publicado por la Video Electronics Standards Association (VESA). El EDID incluye el nombre del fabricante y el número de serie, el tipo de producto, el tipo de fósforo o filtro, los tiempos admitidos por la pantalla, el tamaño de la pantalla, los datos de luminancia y (solo para pantallas digitales) los datos de mapeo de píxeles.

El problema con esto es que muy a menudo el proporcionadoedidesequivocadoo de alguna manera corrupto; esto generalmente se debe a que los fabricantes son perezosos o equivocados y tienen que programar esa información en el firmware del dispositivo. Incluso puede deberse a un cable HDMI defectuoso, pero las posibilidades de que esto ocurra son mucho menores ya que un cable digital esmuchoes más probable que simplemente no funcione en absoluto. Pero hay otras posibilidades, si usas KMS probablemente encontrarás esto interesante:

Hoy en día, con la llegada de la configuración del modo Kernel, una tarjeta gráfica funciona correctamente porque todos los componentes siguen los estándares, o la computadora no se puede utilizar porque la pantalla permanece oscura después del arranque o muestra el área incorrecta. Los casos en los que esto sucede son:

  • La tarjeta gráfica no reconoce el monitor.

  • La tarjeta gráfica no puede detectar ningún dato EDID.

  • La tarjeta gráfica envía incorrectamente datos EDID al controlador.

  • El monitor no envía datos EDID falsos o no los envía.

  • Un KVM envía sus propios datos EDID en lugar de consultar el monitor conectado.

Agregar el parámetro del kernel "nomodeset" ayuda en la mayoría de los casos, pero causa restricciones más adelante.

∆Eso∆es un extracto deEl propio HOWTO.txt de kernel.orgpara KMS EDID. Ese archivo de texto se encuentra en elmisma carpetacomo cinco EDID de resolución estándar que puede proporcionar al kernel en el arranque a través de un parámetro del kernel e initramfs para omitir el EDID proporcionado por su monitor.

Si está utilizando uno de los controladores de pantalla de código abierto, está utilizando la configuración del modo kernel y puede, por ejemplo, utilizar cualquiera de los cinco ajustes preestablecidos de omisión de resolución KMS EDID ya mencionados. Alternativamente, puede proporcionar su propio archivo EDID completo que utilizará el kernel en lugar de la información proporcionada por el dispositivo de visualización.

Veresta secciónde la wiki de Arch Linux para obtener más información, pero probablementeeste hilo de AskUbuntuestaría mejor orientado hacia su distribución.

Si no está utilizando KMS y en su lugar utiliza los controladores de código cerrado nvidia o AMD, hasta donde yo sé, sus posibilidades de manejar las resoluciones de tiempo de arranque de manera confiable son casi nulas. Es posible configurarlos en grubotro gestor de arranque.antesse monta cualquier imagen initramfs, pero la probabilidad de que hacerlo interfiera más tarde con la configuración de resolución de los controladores de código cerrado cuando Xse inicia es bastante alta. Si usted esmuyAfortunadamente, el fabricante de su placa base le ha proporcionado amablemente una configuración en el firmware UEFI para configurar la resolución del tiempo de arranque y puede configurarla allí incluso antes de que se grubcargue cualquier cargador de arranque secundario. Aunque personalmente nunca he conocido a nadie con tanta suerte.

información relacionada