DVB-T Realtek 2831U on Debian

Debian

How to install the device driver for a TDT receiver based on the chipset DVB-T Realtek. In my case, it’s the Zaapa ZT- DVBTSTUSB

Lets see the device identification:

# lsusb
[…]
Bus 004 Device 003: ID 0bda:2831 Realtek Semiconductor Corp. 2831U Device
[…]

Enter the next commands in a console:

$ sudo apt-get install linux-headers-$(uname -r) mercurial
$ hg clone http://linuxtv.org/hg/~jhoogenraad/rtl2831-r2
$  cd rtl2831-r2/
$ make
[…incomprehensible long long compilation output…]
$ sudo make install 
[…linux things…]

Ready! When you plug the receiver you should see something like that in the /var/log/sys.log:

kernel: [  952.777025] usb 5-1: new high speed USB device using ehci_hcd and address 7
kernel: [  952.910355] usb 5-1: configuration #1 chosen from 1 choice
kernel: [  952.910716] usb 5-1: New USB device found, idVendor=0bda, idProduct=2831
kernel: [  952.910716] usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
kernel: [  952.910716] usb 5-1: Product: RTL2831U
kernel: [  952.910716] usb 5-1: Manufacturer: Generic
kernel: [  952.910716] usb 5-1: SerialNumber: 77771111153705700
kernel: [  953.032908] dvb-usb: found a 'RTL2831U DVB-T USB2.0 DEVICE' in warm state.
kernel: [  953.032908] dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
kernel: [  953.032908] DVB: registering new adapter (RTL2831U DVB-T USB2.0 DEVICE)
kernel: [  953.032908] DVB: registering adapter 0 frontend 0 (Realtek RTL2831 DVB-T)…
kernel: [  953.032908] input: IR-receiver inside an USB DVB receiver as /class/input/input10
kernel: [  953.040575] dvb-usb: schedule remote query interval to 300 msecs.
kernel: [  953.040585] dvb-usb: RTL2831U DVB-T USB2.0 DEVICE successfully initialized and connected.
kernel: [  953.040615] usbcore: registered new interface driver dvb_usb_rtd2831u

Read the recipe Televisión digital terrestre (TDT) en GNU/Linux to see how to use the receiver with KDE and Gnome.

Comments

Thanks to oscarah.

PS:Yes, an english recipe is always a small recipe Smiling

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de oscarah

Para kernels nuevos

He estado haciendo pruebas, porque este módulo ya no compila en kernels nuevos. He aquí mis desvaríos Smiling

Resulta que en versiones modernas del kernel (por lo menos, en la 2.6.38 ocurre), se han cambiado algunas cosillas. En concreto:

  • init_MUTEX(sem) ya no existe, y se ha de reemplazar por sema_init(sem, 1)
  • La estructura file_operations, definida en linux/fs.h, ya no tiene un campo ioctl. Se puede reemplazar por algunos de los que quedan. Por ejemplo, ni no necesitamos que sea una llamada protegida, es posible usar unlocked_ioctl (The new way of ioctl())
  • Algunas constantes del módulo de I2C se han eliminado, en concreto: I2C_CLASS_TV_DIGITAL. Según ciertas fuentes, es posible omitir en algunas ocasiones su uso.
  • La función i2c_new_probed_device() ahora acepta un parámetro más (un callback para notificación). Se puede pasar NULL sin problemas.

Teniendo presentes estos cambios, y sólo aplicable a los ficheros relacionados con el driver para los RTL2831U, he escrito el siguiente parche, que soluciona problemas de compilación en versiones recientes del kernel:

A modo de referencia, también he puesto la configuración. Para simplificarlo, he eliminado el soporte para cualquier cosa que no fuera imprescindible: receptores IR, grabadores, otro hardware, etc. Si veo que esto funciona, posiblemente extienda los cambios al resto de cosas Smiling. Para aplicar el parche, se pueden seguir estos pasos:

rtl2831-r2$ wget http://arco.esi.uclm.es/~oscar.acena/crysol/rtl2831/kernel_2.6.38.patch
rtl2831-r2$ patch -p1 < kernel_2.6.38.patch

Algo que destacar del parche: el campo unclocked_ioctl de file_operations es un puntero a una función, al igual que el viejo ioctl. Sin embargo, la firma de ambos es diferente. Por suerte, no varían mucho: la nueva omite un parámetro, inode, que de todas formas es posible obtener por otro lado. También se ha eliminado una declaración extern de un vector, que ya no existe fuera del driver.

Please, si lo pruebas y funciona (o no), deja un mensaje Smiling

"aviso: la dereferencia de punteros de tipo castigado romperá las reglas de alias estricto" --GCC 4.3.1

An easier way?

I made a debian package to be compiled with module assistant.

If you have a Debian/Ubuntu/Molinux add the following in your /etc/apt/sources.list

deb http://arco.esi.uclm.es/~francisco.moya/debian ./

Update your apt database and install the rtl2831-r2 module with module assistant. For example:

# aptitude update
# m-a a-i rtl2831-r2
# dpkg -i --force-overwrite /usr/src/rtl2831-r2-modules-*.deb

As you will see, module assistant fails to install the generated package because most kernels ship with dvb and v4l modules that collides with those from the rtl2831-r2 driver. David's recipe also replaces the drivers in the linux-image-* package with those from the rtl2831-r2 driver, much like my recipe.

Debian users will probably see an advantage in using debian packages and module-assistant instead of writing unmanaged files into /lib.

Kernel version

I am trying to install this module as well, but I am not able to compile it.
When I try it with the described way with m-a a-i I get errors
File not found: /lib/modules/2.6.26-1-686-bigmem/build/.config
I am not using 2.6.26-1 but 2.6.31-19-386, can I change that anywhere?
Thanks,
Daniel