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. :-)

8 Responses to “Probando un sintonizador TDT USB en Linux” »»

  1. Comentario by Diego Sevilla | 08/16/06 at 1:08 pm

    Vaya, interesantísimo post. Quiero comprarme uno, y el típico problema de la compatibilidad Linux siempre acucia. ¿Dónde te compraste exactamente este?

    Un saludo y gracias por la información
    diego.

  2. Comentario by Juanjo | 08/16/06 at 2:46 pm

    Pues este se puede conseguir en varios sitios, aunque yo lo encontré de oferta (80 euros) en la mayor red de grandes almacenes de España ;-)

    De todas formas en el wiki de linuxtv.org tienes una lista de dispositivos que soportan los drivers de Linux (aunque a veces hay que currárselo un poco, como en mi caso).

  3. Comentario by Jonatan72 | 08/26/06 at 10:27 am

    Hola,
    yo fui seducido por el mismo logotipo del pingüino en la Avermedia Volar (tipo llave). Había otras como la hauppauge o la pinaccle al mismo precio, pero en la caja no decía “compatible con linux”.
    en fin mi pregunta concreta es ¿cómo se aplica el parche? pues hasta ese punto llego…
    ¿es simplemente abrir el fichero “a800.c” con un editor y añadir el texto del parche al final? ¿al principio? ¿en alguna posición en particular? ¿en cualquier parte? espero haber dejado en evidencia mi ignorancia sobre programación…
    ¿hay algún script para aplicar el parche?

    Gracias por tu ayuda

  4. Comentario by Juanjo | 08/26/06 at 12:09 pm

    Hola Jonatan72, el parche se puede aplicar con la orden patch (patch -p1 fichero-con-el-parche.txt, ejecutado en el directorio donde está a800.c). Si lo que quieres es añadir las líneas del parche, añade al fichero a800.c la función:

    /* 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;
    }

    justo antes de la línea

    static struct dvb_usb_rc_key a800_rc_keys[] = {

    Y te vas a la línea 113 del fichero, buscas por ahí la línea

    tuner_attach     = dibusb_dib3000mc_tuner_attach,

    y añades a continuación esta otra línea:

    .identify_state   = a800_identify_state,

    De todas formas, si te bajas ahora el conjunto de drivers de linuxtv.org, ya han incluido el parche en la distribución oficial. Espero que para el resto de las cosas (compilar, cargar los módulos, etc) no tengas ningún problema. Me imagino que en la próxima versión del kernel (2.6.18) o la siguiente se incluirá ya la corrección.
    Suerte!

  5. Comentario by Blog TDT | 09/23/06 at 12:45 am

    Pues anda que no es complicado… No se le pueden poner unas ventanias a eso?

  6. TDT
    Comentario by TDT | 10/18/06 at 10:49 am

    A sólo 3 años vista del apagón análogico es curioso comprobar como la mayoría de las comunidades autónomas no han siquiera abierto los concursos para la TDT local. Un desastre…

  7. Comentario by Asier | 01/09/07 at 12:49 pm

    Muchas gracias por el tutorial Juanjo! Me ha ido a las mil maravillas…

    He seguido tu tutorial, y la A800 me funciona en Ubuntu. Utilizo Kaffeine para ver la televisión.

    Sólo tengo dos cosillas que querría solucionar (una muy importante y la otra no tanto…):

    Primero la muy importante:

    Uso la sintonizadora con un portátil. Sé que la antenita que traía de la casa era demasiado justa, y me he comprado una un poco mayor. Mi gran problema es que, con la antena grande, y sin moverme de donde estoy, no consigo saber porque en Windows las cadenas parecen disfrutar de una mayor potencia de señal que en Linux y muchas cadenas en Kaffeine se ven con fallos en la imagen por errores en la recepción.

    Estoy seguro de que no es problema de mi equipo porque uno un core 2 duo t7200, y reproduce con perfecta facilidad videos en HD desde el disco duro, asi que supongo que el problema debo tenerlo en alguna parte en la configuracion de la sintonizadora, aunque no sé donde mirar…

    Y luego la menos importante:

    He apreciado que, aun habilitando la opcion de desentrelazar en el kaffeine, las pocas cadenas que puedo ver bien se ven muy entrelazadas… hay alguna forma de mejorar esto?

    Muchisimas gracias por cualquier ayuda!

  8. Comentario by juliwoodbcn | 01/16/07 at 9:49 am

    En la pagina oficial de avermedia (solo en la version inglesa) ya se puede bajar un script que permite instalar de forma sencilla los drivers:
    la direccion es esta:

    http://www.avermedia.com/cgi-bin/support_driverbympdpro.asp?category=TV%20USB%20Box&category2=Digital&proname=150

Leave a Reply »»