Artículo 1: Sintonizadoras de TV en Linux

Autor: (c) Santiago Romero
Revista: TodoLinux (Todo Linux) nº 1, Noviembre-2000

Las tarjetas sintonizadoras de TV se han hecho tan habituales en los equipos PC como puedan serlo las tarjetas de red o las de sonido. Pese a que suelen venir únicamente con drivers y programas para Windows, estas tarjetas funcionan sin problemas bajo GNU/Linux, como veremos a continuación.


Las tarjetas sintonizadoras de TV son tarjetas de expansión (normalmente para slot PCI) capaces de sintonizar los diferentes canales de televisión a partir de la señal localizada en un cable coaxial de TV (sea cual sea la procedencia física de la señal, haya venido por cable coaxial, HFB, por antena parabólica, etc.). Esta señal se introduce en la tarjeta de TV por medio del conector BNC exterior de modo que la tarjeta se encargue de sintonizar un determinado canal de TV de la gama de canales modulados en frecuencia que recibamos en nuestra instalación local. De todo esto se encargan los drivers y programas que vienen en la tarjeta, normalmente únicamente en versión Microsoft Windows.

Afortunadamente GNU/Linux dispone de la herramientas necesarias para la sintonización y visualización de los diferentes canales de TV utilizando los más habituales modelos de sintonizadoras del mercado (TVCapture98, EasyTV, etc.) o sus clones (tarjetas con otros nombres pero que siguen el mismo comportamiento que las originales), como puede apreciarse en la figura 1.


xawtv



BTTV Y VIDEO4LINUX

Dado un dispositivo cualquiera de hardware (tarjeta de red, de sonido, de TV, etc.) si se desea poder utilizarlo bajo GNU/Linux, se necesitará que el núcleo (kernel) entienda a dicho dispositivo y sea capaz de mantener una comunicación con el mismo. Para ello el núcleo de Linux necesita, bien integrado dentro de él, o mediante módulos, soporte para dicho hardware. Este soporte suele ser diseñado por programadores independientes, usuarios que quieren poder utilizar dicho hardware bajo Linux, o bien directamente por el fabricante de la tarjeta, si bien este último caso es bastante esporádico (por desgracia), aunque últimamente más habitual.

En el caso de las versiones actuales del núcleo de Linux, existe un amplio soporte para sintonizadoras de TV (no todas aunque sí las más habituales, cubriendo casi el 100% del mercado). Este soporte viene en forma de controlador integrado en el núcleo en la sección Video4Linux o en forma de módulos (bajándose los drivers bttv o usando el mismo Video4Linux pero en módulos).

Los pasos a seguir son los siguientes:


HARDWARE SOPORTADO

Necesitaremos una tarjeta sintonizadora de TV soportada por Linux. En general están soportadas la mayoría de tarjetas con chipset BT848, BT878, BT849 y BT879 (utilizadas además para la decodificación por software de la señal codificada de Canal Plus, siempre, por supuesto, con fines educativos).

Si queremos oir el sonido obtenido de la sintonizadora de TV necesitaremos además una tarjeta de sonido soportada por Linux (preferiblemente FullDuplex) y una conexión mediante un cable macho-macho de la salida de Audio de la sintonizadora de TV a la entrada de línea de la tarjeta de sonido instalada en nuestro PC. Podemos utilizar directamente la salida de la tarjeta de TV si la conectamos a unos altavoces, pero en ese caso no será posible decodificar el audio de emisiones codificadas. Es importante que en el mixer (mezclador, como aumix, kmix o similares) tengamos habilitada y con suficiente volumen la señal de entrada de línea. Podemos utilizar la entrada de micrófono si no disponemos de entrada de línea, siempre y cuando nuestra tarjeta soporte el suficiente volumen por dicha entrada sin dañarla (como en el caso de la Sound Blaster 64 PCI, la cual no tiene entrada de línea externa pero sí una entrada de micrófono bastante robusta).

Con esto podremos ver sin problemas la TV bajo X-Window. Si deseamos ver la TV bajo la consola de Linux, necesitaremos una tarjeta de vídeo con soporte para VESA 2.0, requisito indispensable para utilizar el programa fbTV, aunque esto es algo que queda fuera del alcance de este artículo, centrado en la utilización de X-Window como entorno de trabajo habitual para aplicaciones gráficas como pueda serlo la visualización de TV.

Las diferentes tarjetas sintonizadoras soportadas (y su identificador, que más tarde necesitaremos) son las que pueden verse en la tabla 1.

ID   TARJETA
0    Auto-Detect
1    Miro BestBuy Easy TV
2    Hauppauge (bt848)
3    STB
4    Intel
5    Diamond
6    AVerMedia
7    MATRIX Vision MV-Delta
8    FlyVideo
9    TurboTV
10   Hauppauge (bt878)
11   Miro Pro
12   TV-Boostar
13   Hauppauge WinCam
14   MAXI
15   Terratec TerraTV+
16   Aimslab VHX Pixelview Play TV
17   PXC200
18   AVermedia98
19   FlyVideo98 (newer FlyVideo cards)

Otras tarjetas que no aparecen en la lista son también soportadas por compatibilidad con alguna de las anteriores (puede averiguarse testeando nuestra tarjeta con el ID de otra de la lista).


SOFTWARE NECESARIO

Necesitaremos el código fuente del núcleo de Linux (versión 2.2.x ó 2.4.x) o bien la última distribución de drivers BTTV localizable en http://www.strusel007.de/linux/bttv/ . Esto proporciona 2 maneras diferentes de instalar los controladores: ya sea recompilando el núcleo o bien simplemente compilando los drivers BTTV como módulos e instalándolos en el directorio apropiado. Posteriomente veremos ambas maneras de incorporar los controladores al núcleo.

Por otra parte, también necesitaremos programas de televisión como XawTV o KwinTV.


A). CONTROLADORES INCORPORADOS EN EL KERNEL

Para activar los controladores de video4linux procederemos a recompilar el núcleo como se hace normalmente, pero prestando especial atención a la sección Character Devices subsección Video4linux de la configuración del mismo. El proceso de compilación del kernel se describe en una gran cantidad de documentos y howto's, como por ejemplo http://www.linux-es.com/Faq o http://nop.islalinux.org/linux/kernelht.html, o el mismísimo Kernel-COMO de http://www.hispalinux.es. El proceso consiste normalmente en realizar los siguientes pasos:

cd /usr/src/linux
make xconfig
(seleccionamos las opciones y grabamos)
make dep clean bzImage
mv arch/i386/boot/bzImage /boot
lilo -v
make modules modules_install
make clean

En concreto, si tan sólo vamos a cambiar módulos no necesitamos realizar toda la compilación:

cd /usr/src/linux
make xconfig
(seleccionamos las opciones y grabamos)
make dep modules modules_install clean

Para seleccionar las opciones (en el paso make xconfig), en la sección Video For Linux deberemos marcar los como módulos que necesitemos para la instalación de la TV. La descripción de los diferentes módulos es la siguiente:

Módulo Descripción Bttv Módulo general BTTV. msp3400 Sonido estéreo. Videodev Driver de la API Video4linux i2c Driver del bus i2c tuner Driver del sintonizador de TV.

Un ejemplo de módulos a marcar sería el siguiente:

 M - Video For Linux
 M - BT848 Video For Linux
 M - MSP3400 (en la sección Additional Low Level Sound Drivers).


B). INSTALACION A PARTIR DE LOS DRIVERS BTTV

En caso de no desear utilizar los drivers del kernel de Linux, podemos utilizar la última version de los drivers bttv de la página oficial del creador de BTTV de forma que no haga falta realizar ninguno de los pasos del anterior apartado. Para realizar esto obtenemos el fichero bttv-version.tar.gz y lo desenpaquetamos en algún directorio temporal:

mkdir temp
cd temp
tar xvzf ../bttv-version.tar.gz

A continuación compilamos e instalamos los módulos en /lib/modules/:

make
make install

Deberemos repetir el proceso si cambiamos nuestro kernel (simplemente con make y make install), de forma que los módulos sean compilados con la versión del kernel que estemos utilizando.


CREACIÓN DE LOS DISPOSITIVOS

El siguiente paso es la creación de los ficheros de dispositivo en /dev de forma que los programas utilicen estos ficheros para comunicarse con la tarjeta a través del kernel de Linux, pudiendo así acceder a la señal de TV y mostrarla por pantalla.

En el caso de los drivers BTTV, incluyen un script llamado MAKEDEV que creará todos los ficheros necesarios para que los programas se comuniquen con la tarjeta. Sólo hará falta ejecutarlo una vez en el sistema, aunque cambiemos de versión de drivers o de kernel. El script se ejecuta (estando en el mismo directorio que dicho script) con:

./MAKEDEV

El código del script es el siguiente (por si no disponemos de él o queremos saber cómo se crean los diferentes dispositivos):


#!/bin/bash

function makedev () {
   for dev in 0 1 2 3; do
       echo "/dev/$1$dev: char 81 $[ $2 + $dev ]"
       rm -f /dev/$1$dev
       mknod /dev/$1$dev c 81 $[ $2 + $dev ]
       chmod 666 /dev/$1$dev
   done
   # symlink for default device
   rm -f /dev/$1
   ln -s /dev/${1}0 /dev/$1
}

makedev video 0
makedev radio 64
makedev vtx 192
makedev vbi 224
ln -s /dev/video0 /dev/bttv0
ln -s /dev/radio0 /dev/radio
ln -s /dev/radio0 /dev/bttv-fm
ln -s /dev/vbi0 /dev/bttv-vbi


CONFIGURACIÓN DE LOS MÓDULOS

Para insertar los módulos en memoria hay diferentes opciones, como utilizar insmod directamente en la línea de comandos, insertando uno a uno los módulos con sus opciones, crear un script para insertar todos los módulos con una sola llamada, o dejar que el kernel los inserte automáticamente cuando haga falta. Esto último es lo más apropiado, pero antes de poder configurar esto deberemos probar los controladores a mano, y afinar la configuración.

Lo ideal en este caso es crear un script que inserte los módulos en memoria para así poder probar diferentes configuraciones, fácilmente testeando si funcionan con algún programa de TV como XawTV o KwinTV. Utilizaremos otro script para descargar los módulos de memoria cuando no los necesitemos.

Primero crearemos el script inicia_tv:


#!/bin/sh
if test "$UID" = "0"; then
        # running as root anyway, don't need sudo
        INSMOD="/sbin/insmod"
        RMMOD="/sbin/rmmod"
fi

function xrmmod () {
        grep -qe "^$1" /proc/modules || return
        echo rmmod $1
        $RMMOD $1 || exit 1
}
function xinsmod () {
        echo insmod $*
        $INSMOD -f $* || exit 1
}
# prepare for crashing the box -- flush dirty buffers
sync; sleep 1; sync

# kill old modules ...
xrmmod bttv
xrmmod msp3400
xrmmod tda8425
xrmmod tea6300
xrmmod tuner
xrmmod i2c_chardev
xrmmod i2c-dev
xrmmod algo-bit
xrmmod i2c
xrmmod videodev

# ... and load the new ones
xinsmod videodev
xinsmod i2c             verbose=1 scan=1 i2c_debug=0
test -f i2c_chardev.o && xinsmod i2c_chardev
xinsmod tuner           debug=0 type=0
xinsmod msp3400         debug=0 #simple=0
#xinsmod tda8425
#xinsmod tea6300
xinsmod bttv            radio=0 card=6 pll=1 triton1=0 
#------ fin

Tecleamos eso en un fichero, lo grabamos como inicia_tv, le damos permisos de ejecución con chmod +x inicia_tv, cambiamos los parámetros de las últimas líneas del script a aquellos que se corresponda nuestra tarjeta, y lo ejecutamos mediante ./inicia_tv .

Para el correcto funcionamiento de este script necesitaremos crear otro en /usr/local/bin, llamado xinsmod, con permisos de ejecución (chmod +x) y con el siguiente contenido:


function xinsmod () {
       echo insmod $*
       $INSMOD -f $* || exit 1 
        sleep 2 
        sync 
}

Finalmente, creamos otro script llamado descarga_tv (también con permisos de ejecución):


#!/bin/sh
if test "$UID" = "0"; then
        # running as root anyway, don't need sudo
        INSMOD="/sbin/insmod"
        RMMOD="/sbin/rmmod"
fi

function xrmmod () {
        grep -qe "^$1" /proc/modules || return
        echo rmmod $1
        $RMMOD $1 || exit 1
}
function xinsmod () {
        echo insmod $*
        $INSMOD -f $* || exit 1
}

# prepare for crashing the box -- flush dirty buffers
sync; sleep 1; sync

# kill old modules ...
xrmmod bttv
xrmmod msp3400
xrmmod tda8425
xrmmod tea6300
xrmmod tuner
xrmmod i2c_chardev
xrmmod i2c-dev
xrmmod algo-bit
xrmmod i2c
xrmmod videodev

¿Qué hemos conseguido con este proceso? Tenemos los módulos preparados en /lib/modules y ahora disponemos de un script (ejecutable con ./inicia_tv) que instala esos módulos en memoria con los parámetros adecuados. Tras ejecutar dicho script ya podremos iniciar cualquier programa de TV y visualizar los diferentes canales con su audio incluído. Una vez acabemos de ver la TV, podremos descargar los drivers de memoria (liberando así recursos del sistema) mediante la ejecución del script descarga_tv (con ./descarga_tv). Esto nos permitirá hacer las pruebas necesarias (cambiando los parámetros de las líneas finales del script inicia_tv) hasta conseguir visualizar la TV en algún programa como XawTV, que permite buscar canales mediante las teclas de cursor :

./inicia_tv
xawtv
(aquí comprobamos el correcto funcionamiento de la TV)
(si algún parámetro es incorrecto, modificamos inicia_tv).
./descarga_tv

Las opciones de módulos más importantes son:

verbose = Indica si el driver debe (1) o no (0) dar información extra.
Scan = Indica si se debe o no (1/0) escanear los buses i2c.
Radio = Indica si disponemos o no (1/0) de radio en nuestra tarjeta de TV.
Card = Identificador de la tarjeta de TV (ver tabla 1).
Pll = Suele ser 0, 1 o 2.2 según tarjeta.

Para más información sobre las diferentes opciones, consultar el BTTV-Mini-Como de http://lucas.hispalinux.es sección Insflug COMOS o bien la documentación de /usr/src/linux/Documentation/video4linux/ y /usr/src/linux/Documentation/video4linux/bttv.

Tras averiguar la perfecta configuración de la tarjeta ya será posible configurar el sistema para que inicialice los módulos automáticamente, como se describe en el siguiente apartado.


LEVANTAMIENTO AUTOMÁTICO DE LOS DRIVERS

Si queremos evitar la ejecución de los scripts de inicialización y eliminado de los drivers cada vez que deseemos visualizar la TV podemos utilizar las habilidades del kernel para insertar los módulos automáticamente en memoria al utilizar la TV y de descargarlos al dejar de usarla, liberando al usuario de dicha tarea. Para ello debemos utilizar el fichero /etc/conf.modules especificando allí los parámetros necesarios para que el kernel levante los módulos cuando sean necesarios, algo así como:

videodev
i2c 		verbose=1 scan=0 i2c_debug=1
msp3400 	debug=1
tuner 	debug=1 type=5
bttv 	card=6 radio=0 pll=1

Otro ejemplo (con la Avermedia TV Capture98 del autor) sería:

alias char-major-89     i2c-dev
options i2c-core        verbose=1 scan=1 i2c_debug=0
options i2c-algo-bit    bit_test=1
alias char-major-81     bttv
alias char-major-81-0   bttv
pre-install bttv        modprobe -k msp3400; modprobe -k tuner
options bttv            radio=0 card=6 pll=1 triton1=0
options tuner           debug=0 type=0
options msp3400         debug=0

De esta forma informamos al kernel de todas las opciones de los diferentes módulos (options) y las dependencias entre ellos (pre-install) de forma que éste sea capaz de instalar los módulos en memoria y de eliminarlos automáticamente. Con el comando lsmod podremos ver los módulos instalados en memoria y sus opciones.


modulos


SOFTWARE DE VISUALIZACIÓN DE TV

En estos momentos tenemos un kernel de Linux que entiende a nuestra tarjeta y que dispone de una serie de ficheros para que los programas se comuniquen con ella. Obviamente nos falta el interface final, es decir, programas que utilicen estos ficheros de comunicaciónes y por tanto los controladores del kernel para obtener la señal de TV final y mostrárnosla por pantalla, con algún interface sencillo que nos permita cambiar de canal, tomar capturas, grabar vídeo, etc.

- KwinTV: Este programa para KDE incorpora gran cantidad de menúes y opciones para escaneo de canales, capturas de pantalla, configuración, etc. En la figura 5 puede apreciarse este programa sintonizando un canal nacional.

- XAWTV: Sencillo programa con variadas opciones pero algo tosco en cuanto a interface. Se configura mediante menúes o creando un fichero de configuración en el directorio HOME llamado .xawtv que incluya las opciones y los diferentes canales, como el siguiente fichero de ejemplo:

norm = pal
capture = overlay
source = television
mixer = line
freqtab = pal-europe
fullscreen=800x600

[TVE1]
channel = E5
key=1

[La2]
channel = 22
key=2
(etc..)

- XawTV-fbtv: Este programa viene incluido dentro de xawtv y permite (si tenemos soporte de framebuffer en el kernel) utilizar la TV bajo la consola de Linux utilizando /dev/fd0. Para más información se recomienda consultar la ayuda en línea y documentación de XawTV y fbTV.

- XawTV-nagra, nagraTV: son programas que permite decodificar la señal de canales privados de TV (como Canal+), programado con fines educacionales (dado que la decodificación de estos canales es ilegal). Estos programas decodifican sólo el vídeo de la señal, siendo necesarios otros programas para la decodificación simultánea del audio junto con el vídeo (nagraudio, so_plus, etc).

- lirc: LIRC nos permite controlar la tarjeta de TV con el mando a distancia que algunas de ellas incorporan. En principio lo más sencillo es utilizarlo para controlar los programas de TV y de radio, pero en realidad el programa es mucho más amplio y puede ser utilizado para controlar con dicho mando cualquier programa de GNU/linux, pudiendo utilizarse para navegar, como ratón, lanzar reproducción de unos MP3 determinados, etc.

- gradio: Este programa permite oir la radio bajo Linux en aquellas tarjetas sintonizadoras de TV con soporte para radio. Un ejemplo de uso sería el siguiente (para escuchar la emisora 94.2 de FM):

gradio -d /dev/radio -f 94.2 -c -v1

- aleVT: esta pequeña aplicación permite visudalizar las páginas de teletexto de los diferentes canales en una ventana Xwindow. Esto nos permitirá consultar la programación o cualquier otro servicio de teletexto de los diferentes canales que sintonicemos Al ser ejecutado, el programa lee todas las páginas de teletexto con lo cual posteriormente la navegación por el mismo es instantánea, sin espera alguna para cargar las páginas.


alevt


Todos estos programas están disponibles para su descarga en Internet. La página oficial de cada uno de estos programas puede encontrarse a través de http://www.freshmeat.net, introduciendo el nombre del programa en la celdilla de texto y pulsando enter. De este modo accederemos a las diferentes páginas oficiales con las últimas versiones de los programas. Los usuarios de paquetes RPM podrán encontrar este tipo de paquetes en la de http://www.rpmfind.net mientras que los usuarios de Debian puede utilizar apt-get install programa para realizar la descarga e instalación del mismo.


EN RESUMEN

La configuración de las sintonizadoras de TV bajo Linux es algo laboriosa debido a la negativa de los diferentes fabricantes de tarjetas TV a realizar drivers para Linux, pero una vez realizada permite una correcta visualización bastante más estable que los drivers oficiales para otros Sistemas Operativos. No obstante, lo importante es poder visualizar la TV bajo nuestro S.O. favorito: GNU/Linux, cosa que el lector podrá realizar a partir de este momento mediante esta introducción a Video4Linux.

Santiago Romero


Volver a la tabla de contenidos.