[LUG.ro] Haciendo funcionar la placa de Sonido Intel HDA en una Laptop
Guillermo Ibañez
lugro@lugro.org.ar
Wed, 24 Oct 2007 01:22:18 -0300
Hola amigos, espero que éste sea una adelanto de un mail mayor que
pienso mandar cuando termine de configurar mi laptop TOSHIBA Satellite
P100 bajo linux.
La razón por la que adelanto esta parte referente al sonido es porque en
una sola semana vi 2 laptops de otra marca pero problemas similares para
la placa Intel.
No voy hacer aquí el paso a paso, dado que existen una infinidad de
páginas donde lo detallan con mucha claridad. Me voy a limitar a dar
una introducción al problema de las DSDT, tirar algunos lineamientos
generales y referenciarlos a las páginas adecuadas.
Si tienen una placa Intel HDA y una Laptop, probablemente vean los
módulos alsa haciendo "lsmod" pero no tendrán sonido.
Lo primero que hay que tener en cuenta es que esa placa no funciona con
las librerias de Alsa-1.0.13, que son las que están en la mayoría de las
distribuciones. Para que la placa funcione correctamente necesita de
unos codecs que se encuentran recién en la versión 1.0.14 de alsa. Por
lo tanto, les recomiendo que antes que nada, verifiquen que tienen la
1.0.14 o superior, y en caso contrario bajar la última versión de la
página oficial de alsa:
http://www.alsa-project.org
Si aún así no funciona, la razón puede ser tu DSDT:
Lo segundo a tener en cuenta, y para nada menos importante, es que el
problema de la placa Intel HDA con las Laptops es en realidad una
consecuencia de un problema mayor asocido con las ACPI. Las ACPI es una
interfaz normalizada definida por TOSHIBA, Microsoft, Intel, HP, y
Phoenix (Advanced Configuration & Power Interface http://www.acpi.info
). La idea es que una serie de rutinas ayudan al SO a configurar el
Hardware. Es la misma que maneja el control de Encendido en las
Desktops, pero en las Laptops, es responsable de la configuración de la
mayor parte del Hardware de las mismas.
Uno de los componente vitales en la ACPI es un programa llamado DSDT,
que básicamente es un programita en "aml" (ACPI Machine Language) y éste
es el corazón del problema.
Este programa se escribe en un leguaje llamado "asl" (ACPI Source
Language) y existen 2 compiladores que se encargan de traducir el
DSDT.asl al DSDT.aml. Uno es de Intel y el otro de Microsoft.
Uno de los problemas que surgen es que el compilador de Microsoft no
cumple con el estandar ACPI al 100% y falla al no dar determinados
"Warnings" ni Errores. Sin embargo eso no es muy grave si corres un
Windows, dado que el Windows no se preocupa justamente por esos errores,
pero si corres un LINUX, que cumple estrictamente con el estandar ACPI,
muchos de los componentes podrían ser no reconocidos por culpa de fallas
en el DSDT no detectadas en la compilación.
El otro de los problemas, es que en el DSDT, para algunos hardware, y
creo que es el caso de la Intel HDA, está escrito EXPLICITAMENTE que no
se active el hardware salvo que se esté ejecutando Windows, e incluso
algunos windows determinados (XP, vista, etc).
La mejor solución a estos problemas es la de corregir el DSDT, pero no
es siempre fácil y posiblemente no sea necesario. Por eso antes
recomiendo dos pruebas básicas que pueden funcionar como soluciones
parciales o totales.
Antes que nada recuerden que si no tienen el Alsa 1.0.14, ninguna pruba
funcionará- Instálenlo!
La primera prueba es un parche pero muy util para saber si el problema
está en la DSDT. Consiste en pedirle al kernel que nó ejecute la DSDT y
que en su lugar trate de activar el Hard a mano.
Para esto hay que pasar al kernel (en el LILO o en el GRUB) el
parámetro: acpi=off
Si prueban y tienen sonido, es porque sin duda es la DSDT. Eso sí,
perderán el manejo del encendido de la PC y probablemente pierdan otros
Hards, incluso el video. Si les sirve es una solución temporal.
La otra prueba, a mí no me funcionó. Probablemente porque tenía una
combinación de los dos problemas descriptos arriba de las DSDT (el
compilador MS y la restricción de Intel para otros OS no Windows).
Consiste en pedirle al kernel que le mienta a la DSDT cuando le pregunte
su nombre.
Para esto se agrega al GRUB o LILO el parámetro de kernel:
acpi_os_name="Windows"
(o "Windows XP" o "Windows 2000" o "Microsoft Windows" o "Windows
2006",.... hagan varias pruebas).
Una de las cosas interesantes es que se puede detectar si su DSDT fue
compilado por el compilador Intel o Microsoft, viendo los mensajes del
Log de arranque de Linux. Si descubren que su DSDT fue compilado con un
compilador de Intel, entonces estimo que usar el parámetro acpi_os_name,
será suficiente para tener sonido y DSDT sin necesidad de correcciones
del mismo (GRAN VENTAJA).
Sin embargo, parte del proceso para corregir la DSDT consiste en
desensamblar el DSDT.aml a un DSDT.asl, lo que permite averiguar que
string específico espera la DSDT para el parámetro acpi_os_name.
Pasamos al ogro:
El proceso para corregir la DSDT es el siguiente:
1) Averiguar si tu DSDT fue compilado por Microsoft
2) Bajar e instalar el compilador y descompilador de Intel
3) Obtener el DSDT.aml de /proc/acpi/dsdt, con un simple cp de dicho
archivo a un directorio de trabajo (yo lo copié al directorio del
compilador de Intel)
4) Descompilarlo para obtener el fuente.
5) Recompilar el fuente para detectar los errores
6) Tratar de corregir los errores (y crackear la parte donde
pregunta el nombre del SO)
7) Agregar el nuevo DSDT en el Initrd para que el kernel lo cargue
en lugar del original al booteo (el original sigue en la PC, el kernel
simplemente carga el nuestro en lugar del original, con lo que no hay
peligro de dañar el DSDT original por error). Este último punto puede
requerir (dependiendo de la distribución de linux que tengas) que
instales un parche que permite al kernel cargar el nuevo DSDT desde el
Initrd.
Los puntos 1,2,3,4 y 5 y casi toda la introducción está muy bien
detallada en la siguiente página:
http://gentoo-wiki.com/HOWTO_Fix_Common_ACPI_Problems (la biblia del
asunto)
Por otro lado, en la página:
http://www.linuxquestions.org/questions/susenovell-60/howto-fix-acpi-ich7-family-conexant-driver-on-toshiba-p100105-series-531575/#post2642299
Se dan otros ejemplos para corregir la DSDT (paso 5), justo los de mi
Laptop (que suerte!) y al final muestra como crackear la DSDT para que
no discrimine por SO (paso 6).
Finalmente, el paso 7, necesita como ya les dije de un parche en el Kernel.
Para saber si tienen el parche, intenten configurar el kernel con "make
menuconfig" o su preferido, y fíjensen si está la opción:
Power Managment Options-->
ACPI Support-->
Read DSDT from Initrd [*]
(por supuesto que se necesita tener la opción Initrd activada)
Si no lo tienen, pueden bajar el parche adecuado de:
http://gaugusch.at/kernel.shtml
Si no tenian el parche o si la opción no estaba activada, hay que
recompilar el kernel.
Luego hay que grabar el DSDT.aml corregido en /etc/InitrdTools (o algo
así) y ejecutar:
mkinitrd con las opciones necesarias.
por ejemplo, en mi caso:
mkinitrd -k -o /boot/initrd-2.6.18-conDSDT 2.6.18
-o es el nombre de la imagen, el -k es para que preserve los temporales
y uno pueda revisar el contenido de la imagen creada (y revisar que el
DSDT colocado en el initrd sea el correcto), y finalmente la última
opción es la versión, que le dice de donde sacar los módulos
(/lib/modules/2.6.18) para generar el initrd.
En mi caso, tengo Debian y me costó un poco indicarle de donde sacar los
módulos, asique finalmente opté por compilarlos como partes del kernel
(no como módulos) a los drivers de SATA-scsi y ext3, de tal modo que en
el initrd no se necesite nada más que el DSDT, sin módulos. Funcionó
perfectamente.
Ahora tengo sonido con ACPI! Suerte a quién le corresponda!
PD: No lo especifiqué pero hay que generar una nueva entrada en el GRUB
o LILO que apunte al nuevo kernel y nuevo initrd.img, siempre
resguardando una copia y una entrada en el GRUB/LILO de los antiguos por
las dudas algo falle.