Configurar el Touchpad Synaptics de una HP Pavilion dm4 en Debian

lunes, octubre 31, 2011

En un artículo anterior expliqué cómo configurar el video Intel i915 con KMS en una HP Pavilion dm4. Esta vez explicaré cómo configurar el Touchpad Synaptics de esa misma laptop.

Leer el manual

Lo primero que debes hacer si deseas configurar correctamente el Touchpad es leer el manual (RTFM).
$ man synaptics

Yo configuré el touchpad a mi gusto, así que puedes probarlo y si no te gusta lo adaptas al tuyo. Sin embargo es una tarea de ensayo y error que no podrás completar a menos que conozcas todas las opciones que tienes disponibles.

Dependencias

Lo único que necesitamos es un Xorg bien configurado y los drivers synaptics. Para instalar los drivers ejecutamos:

En Debian:
# aptitude install xserver-xorg-input-synaptics


Entender cómo funciona el Touchpad

Básicamente no es un Touchpad, es un ClickPad y eso lo hace un poco especial. ¿Diferencias? Pues la superficie táctil también funciona como botón, que actua como uno u otro (left, right) dependiendo de la zona que se presione. No tenemos un área táctil con unos botones separados, tenemos con todo incluido, eso debe quedar muy claro.



Configuración

Xorg provee una serie de plantillas predeterminadas para la configuración de dispositivos. Estas plantillas se encuentran en /usr/share/X11/xorg.conf.d/ y basta con copiar a /etc/X11/xorg.conf.d/ la que necesitemos y comenzar a modificarla. Xorg se encargará de cargar estos valores luego de los valores predeterminados. Para nuestro caso usaremos la plantilla 50-synaptics.conf.

# mkdir /etc/X11/xorg.conf.d/
# cp /usr/share/X11/xorg.conf.d/50-synaptics.conf /etc/X11/xorg.conf.d/

Lo que haremos será modificar el InputClass para agregar los parámetros que deseamos configurar. En el manual de synaptics tenemos bien documentados cada una de las opciones con su descripción y posibles valores.

Mi configuración quedó así:
Section "InputClass"
    Identifier  "touchpad catchall"
    Driver      "synaptics"
    MatchIsTouchpad "on"
    MatchDevicePath "/dev/input/event*" 
        Option      "Protocol" "auto-dev"
        Option      "SHMConfig" "true"
        # Edges
        Option      "LeftEdge" "1500"
        Option      "RightEdge" "5200"
        Option      "TopEdge" "1350"
        Option      "BottomEdge" "3500"
        # Finger press
        Option      "FingerLow" "28"
        Option      "FingerHigh" "35"
        Option      "FingerPress" "70"
        # Taps time
        Option      "MaxTapTime" "180"
        Option      "MaxTapMove" "220"
        Option      "MaxDoubleTapTime" "180"
        Option      "SingleTapTimeout" "180"
        Option      "ClickTime" "100"
        Option      "FastTaps" "0"
        # Emulate
        Option      "EmulateMidButtonTime" "75"
        Option      "EmulateTwoFingerMinZ" "70"
        Option      "EmulateTwoFingerMinW" "5"
        # Scrolling
        Option      "VertScrollDelta" "100"
        Option      "HorizScrollDelta" "0"
        Option      "VertEdgeScroll" "1"
        Option      "HorizEdgeScroll" "0"
        Option      "CornerCoasting" "0"
        Option      "VertTwoFingerScroll" "1"
        Option      "HorizTwoFingerScroll" "1"
        # Pointer speed
        Option      "MinSpeed" "0.5"
        Option      "MaxSpeed" "7.0"
        Option      "AccelFactor" "0.35"
        Option      "TrackstickSpeed" "0"
        Option      "EdgeMotionMinZ" "29"
        Option      "EdgeMotionMaxZ" "59"
        Option      "EdgeMotionMinSpeed" "1"
        Option      "EdgeMotionMaxSpeed" "40"
        Option      "EdgeMotionUseAlways" "0"
        # Scrolling flags
        Option      "UpDownScrolling" "0"
        Option      "LeftRightScrolling" "0"
        Option      "UpDownScrollRepeat" "0"
        Option      "LeftRightScrollRepeat" "0"
        Option      "ScrollButtonRepeat" "100"
        # Touchpad mouse on/off
        Option      "TouchpadOff" "0"
        Option      "GuestMouseOff" "0"
        # Dragging
        Option      "LockedDrags" "0"
        Option      "LockedDragsTimeout" "5000"
        # Corners
        Option      "RTCornerButton" "0"
        Option      "RBCornerButton" "2"
        Option      "LTCornerButton" "0"
        Option      "LBCornerButton" "1"
        # Tap
        Option      "TapButton1" "1"
        Option      "TapButton2" "3"
        Option      "TapButton3" "2"
        # Click
        Option      "ClickFinger1" "1"
        Option      "ClickFinger2" "0"
        Option      "ClickFinger3" "0"
        # Circular
        Option      "CircularScrolling" "0"
        Option      "CircScrollDelta" "0.1"
        Option      "CircScrollTrigger" "0"
        Option      "CircularPad" "0"
        # Palm
        Option      "PalmDetect" "1"
        Option      "PalmMinWidth" "7"
        Option      "PalmMinZ" "40"
        Option      "CoastingSpeed" "0"
        # Grab
        Option      "GrabEventDevice" "1"
        Option      "TapAndDragGesture" "1"
        # Area
        Option      "AreaLeftEdge" "0"
        Option      "AreaRightEdge" "0"
        Option      "AreaTopEdge" "0"
        Option      "AreaBottomEdge" "3500"
EndSection

Section "InputClass"
    Identifier  "Ignore mouse devs"
    MatchDevicePath "/dev/input/mouse*"
    Driver      "synaptics"
    Option      "Ignore" "on"
EndSection

Actualización: Acá pueden ver la configuración actual que tengo en mi repo github

No explicaré en detalle cada una de las opciones (para eso está el manual de synaptics), solo explicaré las más relevantes o las "problemáticas". Lo primero es ignorar las pulsaciones en el área de los botones. Para eso definimos el rango de acción del dispositivo (límites):
        # Edges
        Option      "LeftEdge" "1500"
        Option      "RightEdge" "5200"
        Option      "TopEdge" "1350"
        Option      "BottomEdge" "3500"

        # Area
        Option      "AreaLeftEdge" "0"
        Option      "AreaRightEdge" "0"
        Option      "AreaTopEdge" "0"
        Option      "AreaBottomEdge" "3500"

Colocando el límite inferior (BottomEdge y AreaBottomEdge) en 3500 evitamos que el cursor se mueva al pasar sobre el área de botones. Estableciendo el límite derecho (RightEdge) a 5200 evitamos que el cursor se mueva en la columna derecha (para habilitar la zona de scrolling vertical). La imagen a continuación ilustra estos ajustes:



El dispositivo solo tiene un botón y a simple vista no encontré la forma de configurarlo para que funcione como ambos. Estuve compilando el driver synaptics con un patch para agregar el soporte de clickpads pero no he logrado generar el .ko, así que simplemente dejé su funcionamiento por defecto (left click) y configuré el click izquierdo con tap, el doble click con doble tap y el click derecho con tap de dos dedos.

Eso podemos verlo en:
        # Tap
        Option      "TapButton1" "1"
        Option      "TapButton2" "3"
        Option      "TapButton3" "2"

El botón para activar/desactivar el clickpad tampoco pude hacerlo funcionar pero creo que es cuestión de seguir trasteando hasta lograr una solución. Además de eso, el resto de la configuración es el ajuste de valores para la sensibilidad, aceleración y velocidad del puntero, pero eso lo dejo como tarea para el lector.

Tarea para la casa

Una de las herramientas más importantes para lograr una efectiva configuración es synclient. Gracias a esta herramienta pude determinar las coordenadas que definen los límites de mi dispositivo (que en las imágenes de arriba están marcados con azul y rojo) y verificar los valores de configuración

Usando el siguiente comando podemos verificar la actividad del touchpad en vivo:
$ synclient -m 10

La salida debería ser algo como:
   time     x    y   z f  w  l r u d m     multi  gl gm gr gdx gdy
 874.169  5392 4317   3 0  0  0 0 0 0 0  00000000
 874.269  5392 4317   0 0  0  0 0 0 0 0  00000000
 874.670  5392 4317   1 0  0  0 0 0 0 0  00000000
 874.770  5392 4317   7 0  0  0 0 0 0 0  00000000
 874.870  4143 1708   9 1 11  0 0 0 0 0  00000000
 874.970  4225 1811   3 0  0  0 0 0 0 0  00000000
 875.070  4225 1811   2 0  0  0 0 0 0 0  00000000

Donde:
  • x, y: definen las coordenadas de la pulsación
  • z: la presión aplicada
  • f: el número de dedos tocando la superficie
  • w: es una medida del ancho del dedo
  • l,r,m: el estado de los botones left, right y middle

Para más información:
$ man synclient

Espero que con esta guía puedas configurar tu ClickPad y usarlo decentemente. Me queda pendiente por investigar la función de deshabilitar el touchpad mientras se escribe, los botones left-right y el botón para activar. Cuando lo logré postearé nuevamente :)

Fuentes:

Configurar video Intel i915 + KMS en Debian Wheezy

viernes, octubre 28, 2011

Es esta receta explicaré como configurar y activar el KMS (Kernel Mode Setting) con el driver Intel i915 en una HP Pavilion dm4 . Las instrucciones están hechas para Debian Wheezy (testing a la fecha) y requiere de un kernel >= 2.6.29.

Instalar dependencias

Suponiendo que tenemos Xorg instalado y corriendo (quizás funcionando con el driver vesa) procedemos instalar el driver intel y sus dependencias:
# aptitude install libgl1-mesa-glx libglu1-mesa xserver-xorg-video-intel mesa-utils

Activar el KMS

Luego vamos al archivo /etc/modprobe.d/i915-kms.conf y agregamos la línea:
options i915 modeset=1

Regeneramos la imagen del kernel con:
# update-initramfs -u

Editamos el archivo /etc/default/grub y modificamos esta línea:
GRUB_CMDLINE_LINUX_DEFAULT="quiet i915.modeset=1 video=LVDS-1:e"

El parámetro i915.modeset=1 habilita el KMS al momento del booteo y para que la pantalla no se quede en negro luego de cargar el módulo, debemos agregar el parámetro video=LVDS-1:e.

Es importante no cargar ningún otro driver para framebuffer que no sea el de Intel y eliminar de los parámetros de booteo cualquier opción del tipo vga=xxx o video=xxx.

El parámetro video=LVDS-1:e tiene una razón de ser muy particular. El BIOS de esta máquina tiene un bug; cuando inicia, indica erróneamente que la tapa de la laptop está cerrada. El kernel, basándose en esa información, manda a apagar la pantalla y por eso todo se queda en negro, no es que se congela ni que deja de funcionar. Pueden corroborar esto cerrando y abriendo la tapa de la laptop cuando se apaga. Verán que el video vuelve mágicamente y que el equipo no se había detenido, seguía funcionando pero a ciegas.

Es bien conocido que el kernel no usa el BIOS para casi ninguna de sus tareas, sin embargo a partir del kernel 2.6.32 los desarrolladores decidieron "escuchar" al BIOS en este tipo de eventos, así que hasta que no se masifique el patch que corrige la situación debemos aplicar este correctivo.

Si desean más información pueden revisar el reporte y la resolución del bug en Launchpad o el reporte del error en fredesktop.org

Luego de ese paréntesis técnico continuamos con nuestra configuración. Reconfiguramos el grub para que se apliquen los cambios anteriores:
# update-grub

Configuración de Xorg

Lo siguiente es crear y personalizar el archivo de configuración de Xorg.

A partir de la versión 1.8, Xorg ya no necesita archivos de configuración. En lugar de eso intenta detectar y configurar todo el hardware (video y dispositivos de entrada) por si mismo. Sin embargo existen casos especiales que requieren algunos "ajustes". Este es uno de esos casos.

Procedemos entonces a detener el servidor X. Si tenemos un entorno de escritorio basta con detener el gestor de sesión (gdm, kdm, slim, xdm, etc), sino matamos las X.

Hecho esto pasamos a ejecutar:
# Xorg -configure

Eso debería generarnos un archivo xorg.conf.new que servirá como base. A ese archivo le editamos la sección "Device" para que nos quede algo como:
Section "Device"
        Option      "DRI"                       "True"
        Option      "Tiling"                    "True"
        Option      "XAANoOffscreenPixmaps"     "True"
        Identifier  "Card0"
        Driver      "intel"
        BusID       "PCI:0:2:0"
EndSection

Y agregamos al final del archivo la siguiente sección:
Section "Extensions"
        Option          "Composite" "enable"
EndSection

Observen que indicamos el driver de video y algunas opciones para mejorar el desempeño gráfico. Si conocen otras opciones (que apliquen para tarjetas Intel) también pueden agregarlas acá.

Con esto terminamos nuestra configuración del servidor X.

Reiniciar

Reiniciamos y ya deberíamos disfrutar de nuestro video usando KMS. Verán que la transición entre modos de video es casi instantánea y el parpadeo se redujo considerablemente. Además de que compiz y todas esas yerbas aromáticas se ven con una suavidad asombrosa.

Deshabilitar el KMS

Si desean deshabilitar el KMS basta con desactivar el modeset en la línea:
GRUB_CMDLINE_LINUX_DEFAULT="quiet i915.modeset=0 video=LVDS-1:e"

Reconfiguramos el grub:
# update-grub

Y KMS desactivado.

Espero que esta receta les haya servido de ayuda. En un próximo post explicaré cómo configurar el Touchpad Synaptics.

Fuentes: