Friday, February 1, 2008

Resolucion 1280x800 con intelfb

Ya que voy a deshacerme de Gentoo, lo primero es experimentar: total, si se rompe voy a reinstalar igual. Primero conseguí que al volver de una suspensión, la consola funcionase. Antes solo funcionaban las X y si se hacía Ctrl+Alt+F1 se veía todo negro aunque con el backlight encendido. Con un "acpi_sleep=s3_bios" como parámetro del kernel todo solucionado.

Pero seguía el problema que desde que cambié del kernel 2.6.22 dejé de tener consola a resolución nativa. La antigua opción de resolución predefinida para vesa-tng dentro de la configuración del kernel ya no estaba, asi que pasé de ello. Hoy en un momento de tiempo libre llegué a la página de uvesafb, que es el sustituto mejorado de vesafb-tng. Con unas instrucciones sencillas y simples explica como conseguir una consola con una resolución nativa de 1280x800. Miré la configuración mi kernel y vi que lo tenía activado, junto con intelfb, el driver nativo de mi 945GM. En ese momento me pregunté, porque siendo el driver nativo no se comporta como debe. Ya tenía otra solución que me valía, pero estaba dispuesto a resolver la duda. Será cabezonería, será frikismo, pero me ha dado por ahí. El caso es que no es un tema nada fácil ya que la gente se empeña en el "video=intelfb:mode=1280x800", y en la propia documentación del kernel viene:
Sample Usage
------------

In /etc/lilo.conf, add the line:

append="video=intelfb:mode=800x600-32@75,accel,hwcursor,vram=8"

This will initialize the framebuffer to 800x600 at 32bpp and 75Hz. The
framebuffer will use 8 MB of System RAM. hw acceleration of text and cursor
will be enabled.

Remarks
-------

If setting this parameter doesn't work (you stay in a 80x25 text-mode),
you might need to set the "vga=" parameter too - see vesafb.txt
in this directory.


Y en la página web de intelfb el autor ya lo explica (negritas mías):

Video mode programming is handled differently depending on the type of displays connected. Full support for programming video modes is only implemented for analog (CRT) displays.

If you have a non-CRT display (e.g., laptop LCD panel, or an external LCD panel connected via a DVI connector) active when the driver is loaded, it will refuse to load. To use the driver with non-CRT devices, the driver needs to be built in to the kernel, and the "vga=XXX" boot option used to program the video mode via the video BIOS at boot time. The following boot option should enable a 1024x768-16 mode:

vga=791

Information about other values can be found in the file Documentation/fb/vesafb.txt in the Linux kernel source tree.

Un poco escondido, pero vale. Mirando en el vesafb.txt:

The graphic modes are NOT in the list which you get if you boot with
vga=ask and hit return. The mode you wish to use is derived from the
VESA mode number. Here are those VESA mode numbers:

| 640x480 800x600 1024x768 1280x1024
----+-------------------------------------
256 | 0x101 0x103 0x105 0x107
32k | 0x110 0x113 0x116 0x119
64k | 0x111 0x114 0x117 0x11A
16M | 0x112 0x115 0x118 0x11B

The video mode number of the Linux kernel is the VESA mode number plus
0x200.

Linux_kernel_mode_number = VESA_mode_number + 0x200

So the table for the Kernel mode numbers are:

| 640x480 800x600 1024x768 1280x1024
----+-------------------------------------
256 | 0x301 0x303 0x305 0x307
32k | 0x310 0x313 0x316 0x319
64k | 0x311 0x314 0x317 0x31A
16M | 0x312 0x315 0x318 0x31B


Lo cual es estupendo, pero no viene nada de resoluciones (antiguamente) no-estándar, como la 1280x800. Buscando por internet encontré los códigos que alguien ponía para su portatil, pero nanai, se paraba el boot como si hubiera puesto vga=ask.

Al final, después de bucear entre toneladas de información, encontré la herramienta lrmi, que proporciona vbetest, para leer la BIOS de la tarjeta.

pioneer ~ # vbetest
VBE Version 3.0
Intel(r) 82945GM Chipset Family Graphics Chip Accelerated VGA BIOS
[352] 1024x600 (256 color palette)
[353] 1024x600 (5:6:5)
[354] 1024x600 (8:8:8)
[355] 1280x800 (256 color palette)
[356] 1280x800 (:6:5)
[357] 1280x800 (8:8:8)
[261] 1024x768 (256 color palette)
[279] 1024x768 (5:6:5)
[280] 1024x768 (8:8:8)
[274] 640x480 (8:8:8)
[276] 800x600 (5:6:5)
[277] 800x600 (8:8:8)
[257] 640x480 (256 color palette)
[259] 800x600 (256 color palette)
[273] 640x480 (5:6:5)
Type a mode number, or 'q' to quit - q
Y con esto está el tema solucionado, 357 = 0x165, con lo que siguiendo el consejo de vesafb.txt: 0x165 + 0x200 -> vga=0x365.

Añadir a grub, actualizar, reiniciar y ¡voilá! Bonito framebuffer a 1280x800. Lástima que no me sirva de nada, ya que necesito un driver más genérico (uvesafb) para que funcione con ambas tarjetas del portátil, intel y nvidia. Pero la satisfacción no me la quita nadie.

1 comment:

Anonymous said...

Oye que buen post andaba buscando sobre el intelfb que yo necesito una resolución de 1024x600 y he visto que todos hacen mil cosas para conseguirlo, voy a probar este haber si me evito todo eso con esta cosa tan sencilla.

Saludos.