viernes, diciembre 05, 2008

Xorg 7.4, hotplugging, synaptics y más

Xorg input hotplugging
Recientemente Archlinux optó por pasarse a xserver 1.5. La nueva versión del servidor gráfico incluye diversas novedades, pero la que más destaca, y genera dolores de cabeza, es input hotpluggin.

La motivación tras el nuevo sistema de manejo de entrada, es la capacidad de xorg de manejar dinámicamente los dispositivos. En el pasado era necesario especificar la configuración de forma manual en el archivo xorg.conf. Esto resultaba incomodo, debido a la necesidad de reiniciar el servidor X para aplicar nuevos cambios importantes. Sin embargo, la obligación del archivo no era tan estricta, pues el servidor gráfico tenía rutinas de autodetección, donde configuraba los dispositivos al iniciarse. Ésto parecía una buena solución, sin embargo poseía un defecto: Si un dispositivo era removido, se perdía la conexión, y por lo tanto el manejo del driver. Y aunque reconectara, no era posible volver a utilizarlo. Para los usuarios de laptops ésta última afirmación puede parecer una falacia, pues es frecuente que los ratones y teclados usb funcionaran apenas conectados. Lo que quizás desconocían, es que había un truco para lograr ésto: El Kernel mantenía un dispositivo genérico (por ejemplo: /dev/input/mice). Para la mayoría de los usuarios, éste dispositivo genérico parece ideal, sin embargo, con la evolución de la tecnología, los dispositivos cada vez incluyen mas funciones. ¿que pasaba con un teclado que tuviera funciones de scrolling, teclas especiales, etc. o siendo más fantasioso.. ¿Que pasaría con el soporte para ratones con acelerómetros u otras gracias que quizás inventen en el futuro?
la respuesta es tan simple como obvia, con el sistema mencionado, no se hubieran podido manejar inmediatamente, hasta reiniciar el servidor gráfico y cargar los controladores adecuados para dichos dispositivos.

Para solucionar ésto, se invento el sistema X input event driver (evdev), el cual utilizando las ventajas de hal y dbus, monitorea los dispositivos conectados, y aplica reglas definidas en sus políticas (reglas basadas en la base de datos de hardware) asignando automáticamente configuraciones e indicando con que controlador manejar cierto dispositivo.

Las reglas se configuran en archivos XML con extensión fdi. Los cuales, si bien en un inicio pueden parecer complicados, al entender su funcionamiento, son una herramienta poderosa para personalizar la configuración del hardware.

Como ejemplo, al actualizar mi laptop, no funcionaba el touchpad como debía, pues aunque utilizaba el driver Synaptics, no configuraba opciones personalidas que me gustan (scroll con 2 dedos, botón derecho al presionar la esquina inferior derecha, desplazamiento horizontal y vertical en los bordes derecho e inferior respectivamente, tercer botón al presionar con 2 dedos, etc. Para configurarlo, antes era necesario recurrir al archivo xorg.conf, pero con ésta nueva versión que incluye hotpluggin, el servidor X ignora las configuraciones establecidas en dicho lugar. Ahora, en su lugar es necesario definir una politica de hal para el dispositivo.

política para manejar el touchpad Synaptics
El controlador de synaptics puede causar un par de problemas. Existe un controlador específico (en archlinux, el paquete se llama xf86-input-synaptics) el cual provee el driver. La política de Hal para configurarlo (en mi caso la defini en el archivo /etc/hal/fdi/policy/11-x11-synaptics.fdi) es la siguiente:



<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
<device>
<match key="info.capabilities" contains="input.touchpad">
<match key="info.product" contains="Synaptics TouchPad">
<merge key="input.x11_driver" type="string">synaptics</merge>
<merge key="input.x11_options.AlwaysCore" type="string">true</merge>
<merge key="input.x11_options.Protocol" type="string">auto-dev</merge>
<merge key="input.x11_options.Emulate3Buttons" type="string">true</merge>
<merge key="input.x11_options.SHMConfig" type="string">true</merge>
<merge key="input.x11_options.LeftEdge" type="string">1700</merge>
<merge key="input.x11_options.RightEdge" type="string">5300</merge>
<merge key="input.x11_options.TopEdge" type="string">1700</merge>
<merge key="input.x11_options.BottomEdge" type="string">4200</merge>
<merge key="input.x11_options.FingerLow" type="string">25</merge>
<merge key="input.x11_options.FingerHigh" type="string">30</merge>
<merge key="input.x11_options.MaxTapTime" type="string">180</merge>
<merge key="input.x11_options.VertEdgeScroll" type="string">true</merge>
<merge key="input.x11_options.HorizEdgeScroll" type="string">true</merge>
<merge key="input.x11_options.CornerCoasting" type="string">true</merge>
<merge key="input.x11_options.CoastingSpeed" type="string">0.30</merge>
<merge key="input.x11_options.VertScrollDelta" type="string">100</merge>
<merge key="input.x11_options.HorizScrollDelta" type="string">100</merge>
<merge key="input.x11_options.MinSpeed" type="string">0.10</merge>
<merge key="input.x11_options.MaxSpeed" type="string">0.60</merge>
<merge key="input.x11_options.AccelFactor" type="string">0.0020</merge>
<merge key="input.x11_options.VertTwoFingerScroll" type="string">true</merge>
<merge key="input.x11_options.HorizTwoFingerScroll" type="string">true</merge>
<merge key="input.x11_options.TapButton1" type="string">1</merge>
<merge key="input.x11_options.TapButton2" type="string">2</merge>
<merge key="input.x11_options.TapButton3" type="string">3</merge>
<merge key="input.x11_options.RBCornerButton" type="string">3</merge>
</match>
<match key="info.product" contains="AlpsPS/2 ALPS">
</match>
<match key="info.product" contains="appletouch">
</match>
<match key="info.product" contains="bcm5974">
</match>
</match>
</device>
</deviceinfo>



Teclado con rueda
Otro problema que tuve, fue para que el sistema reconociera la rueda de desplazamiento incorporada en mi teclado, aunque intenté de todas maneras que configurara el dispositivo leyendo desde /dev/input/event2, no fue posible, e incluso pensé en crear un nuevo driver, sin embargo, compilando la última versión del driver disponible (xf86-input-evdev-2.1.0), el sistema reconoció nuevamente mi rueda, y puedo utilizar mi teclado tranquilo. Luego de ésto, puedo decir que me encuentro satisfecho con Xorg 7.4, pues funciona perfecto tanto en mi portatil, como en mi escritorio.

Links útiles
Código fuente de controladores de xorg
Wiki de archlinux de hotplugging

PKGBUILD para xf86-input-evdev-2.1.0