Probando un sintonizador TDT USB en Linux

Hacía tiempo que no escribía el típico post geek, que cuenta al detalle cómo configurar algún cacharro para que funcione con Linux. Pero por fin toca. A continuación relataré los pasos a seguir para poner en marcha en Linux el sintonizador de TDT "AverTV DVB-T USB2.0", de AverMedia.

AverTV DVB-T USB2.0Este pequeño aparato atrae a simple vista. Consta de una pequeña caja algo más grande que un paquete de cigarrillos, con una antenita portátil y un mando a distancia. Naturalmente, configurarlo en Windows es tan simple como instalar el software que trae, enchufar el aparato y dejarse guiar por el programa, que te ayuda a escanear el espectro para sintonizar todos los canales de tu zona.

Pero es que además este modelo trae una pegatina en la caja que pone claramente "Linux Compatible". Así que no debería ser difícil ... pero no, fácil no es.

Lo primero que hice, iluso de mí, fue enchufar directamente el aparato en mi Ubuntu Dapper. Al momento, se detectó y cargó un driver aparentemente preparado para el cacharro: el driver dvb-usb-a800. Pero no hizo nada más. Mirando los mensajes del núcleo vi que necesitaba un firmware. A partir de aquí comencé a documentarme en linuxtv.org, de donde obtuve el mencionado firmware y lo dejé en el directorio /lib/firmware/`uname -r`/.

Finalmente, sin embargo, los drivers que venían con Ubuntu Dapper no eran suficientes para que el aparato se pusiera en marcha. Mirando por ahí vi un blog que aconsejaba bajárselo todo en código fuente y recompilarlo. Sin embargo, siguiendo los pasos del blog anterior y cargando a mano los módulos, cuando enchufaba el aparato seguía sin encenderse la luz azul y sin crear los dispositivos en /dev. La solución definiva la encontré muy escondida, en una lista de correo, y con pocas esperanzas ya de que funcionase: el problema es que, probablemente, y según la versión que tengas del aparato, sea necesario modificar una línea del driver. El autor de ese mensaje me comentó mientras escribía esto que había otro parche mejor que se incluirá en el código oficial. Así que luego probaré el otro parche para ver si también me sirve y confirmárselo a los desarrolladores. He probado el nuevo parche y ¡funciona! Además, con este nuevo parche, no necesito el firmware (depende del modelo, pero el mío es de los que no lo necesitan). Así que un trocito menos de código propietario en mi portátil ;-)
En resumen, los pasos a seguir fueron:

  • Obtener las fuentes del driver. He utilizado, tal como recomiendan en su página, el sistema de control de versiones Mercurial. Así que lo instalamos y bajamos las fuentes:

# apt-get install mercurial
# hg clone http://linuxtv.org/hg/v4l-dvb

  • Modificamos el fichero v4l-dvb/linux/drivers/media/dvb/dvb-usb/a800.c con el siguiente parche:
#### beginning of patch
#Applies against: 2.6.17
#Signed-off-by: Klaus Frahm and Martin Habbecke
#Changes: fixes initialization problem with new model of AVerTV DVB-T USB2.0,
# A800, by correctly identifying warm or cold state according to iManufacturer
--- a/drivers/media/dvb/dvb-usb/a800.c    2006-06-22 21:24:51.000000000 +0200
+++ b/drivers/media/dvb/dvb-usb/a800.c    2006-06-29 18:55:14.000000000 +0200
@@ -26,6 +26,14 @@
return 0;
}
+/* assure to put cold to 0 for iManufacturer == 1 */
+static int a800_identify_state(struct usb_device *udev, struct dvb_usb_properties *props,struct dvb_usb_device_description **desc, int *cold)
+{
+  *cold=(udev->descriptor.iManufacturer != 1);
+
+  return 0;
+}
+
static struct dvb_usb_rc_key a800_rc_keys[] = {
{ 0x02, 0x01, KEY_PROG1 },       /* SOURCE */
{ 0x02, 0x00, KEY_POWER },       /* POWER */
@@ -113,6 +121,7 @@
.power_ctrl       = a800_power_ctrl,
.frontend_attach  = dibusb_dib3000mc_frontend_attach,
.tuner_attach     = dibusb_dib3000mc_tuner_attach,
+    .identify_state   = a800_identify_state,
.rc_interval      = DEFAULT_RC_INTERVAL,
.rc_key_map       = a800_rc_keys,
#### end of patch
  • Compilamos todo:

# make install

  • Copiamos el firmware en su sitio:

# mv dvb-usb-avertv-a800-02.fw /lib/firmware/`uname -r`

  • Cargamos los módulos en memoria:

cd v4l
insmod ./dvb-pll.ko
insmod ./dvb-core.ko
insmod ./dvb-usb.ko
insmod ./dib3000-common.ko
insmod ./dib3000mc.ko
insmod ./dvb-usb-dibusb-common.ko
insmod ./dvb-usb-a800.ko

  • Ahora pinchamos el dispositivo y veremos que se inicia completamente (se enciende el piloto azul) y los mensajes del núcleo serán similares a:

[17205584.720000] usb 4-3: new high speed USB device using ehci_hcd and address 6
[17205584.948000] dvb-usb: found a 'AVerMedia AverTV DVB-T USB 2.0 (A800)' in cold state, will try to load a firmware
[17205585.020000] dvb-usb: downloading firmware from file 'dvb-usb-avertv-a800-02.fw'
[17205585.084000] dvb-usb: found a 'AVerMedia AverTV DVB-T USB 2.0 (A800)' in warm state.
[17205585.084000] dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
[17205585.084000] DVB: registering new adapter (AVerMedia AverTV DVB-T USB 2.0 (A800)).
[17205585.492000] dib3000: Found a DiBcom 3000P.
[17205585.492000] DVB: registering frontend 0 (DiBcom 3000P/M-C DVB-T)...
[17205585.492000] input: IR-receiver inside an USB DVB receiver as /class/input/input8
[17205585.492000] dvb-usb: schedule remote query interval to 150 msecs.
[17205585.492000] dvb-usb: AVerMedia AverTV DVB-T USB 2.0 (A800) successfully initialized and connected.

Ahora viene el cómo usarlo. En primer lugar una forma rápida de sintonizar un canal con mplayer:

  • Instalamos del repositorio universe de Ubuntu Dapper, el paquete dvb-utils:

# apt-get install dvb-utils

  • Buscamos los canales y lo volcamos en channels.conf:

# scan /usr/share/doc/dvb-utils/examples/scan/dvb-t/es-Madrid > $HOME/.mplayer/channels.conf

  • En el fichero channels.conf queda almacenada la información de unos 23 canales (los que recibo correctamente desde mi casa de Madrid, a unos 2.5 Km del pirulí, en habitación interior y un primer piso). Cada canal es una línea del fichero anterior que empieza con el nombre del mismo. Por ejemplo, la cadena de noticias de PRISA, que se llama `CNN+'.
  • Si tenemos mplayer instalado, basta con ejecutar: mplayer dvb://CNN+ para ver ese canal. Por supuesto, podemos usar mencoder para capturar la señal y grabarla en DivX, etc.

Una segunda forma de utilizar el sintonizador, algo más cómodo, es usar el programa kaffeine, de KDE (no, no conseguí encontrar nada funcional en GNOME).
Kaffeine-ScanningBasta con instalar el paquete (`apt-get install kaffeine'), lanzarlo, y en la pestaña DVB hacer la búsqueda de canales. Esta aplicación permite, además, grabar la señal (en el formato original MPEG2) y además podremos hacer zapping usando el ratón.

No obstante, lo ideal sería usar el mando a distancia. Para ello habría que usar un programa que lea el mando y realice acciones sobre el programa utilizado, en este caso kaffeine. Pero bueno, por hoy está bien. :-)

BORING STORIES · FRIKADAS

Discusión