Samstag, 13. November 2010

WinTV-HVR-1900 under Ubuntu 10.04 and 10.10

A few weeks ago I bought a Hauppauge WinTV-HVR-1900 (USB id 2040:7300) which I wanted to use with a (32 bit) Ubuntu 10.04 and 10.10 system.
Quick installation summary:
  • Does it work out of the box: No
  • Does it work at all: Yes
  • If you are able to update to Ubuntu 10.10, do it.
This post only describes how to get the basic functionality working (i.e. display/record a signal on the composite video input).
The HVR 1900 is a small box which is connected via a USB2 port (USB1 is not supported for bandwidth reasons). There are inputs for composite video (e.g. VCR or set-top box) an antenna input and a S-VHS input. The device comes with a UK power supply (with a UK mains plug) and a bulky mains plug adapter for continental Europe.
In order to get the digitizer running, this device needs firmware.  Ubuntu comes with a selection of firmware images for various Hauppauge systems, but none was suitable for this device.
The firmware is included on the Windows driver disk you get with the device, but which files do you need?  Fortunately there is a perl script available that scans the CD and extracts the files you need based on a bunch of MD5 sums stored in that script.  Perl is installed by default on a Ubuntu system, so slide in the CD, open a terminal and enter
perl /media/XXXXXXXXXX
(where XXXXX is the CD title)
In my case the following files were found:
  • v4l-cx2341x-enc.fw
  • v4l-cx25840.fw
  • v4l-pvrusb2-29xxx-01.fw
  • v4l-pvrusb2-73xxx-01.fw
For the next steps you need root privileges:
  • Change the ownership of those files to root (for security reasons)
    sudo chown root:root *fw 
  • Copy the extracted files to /lib/firmware
    sudo cp *fw /lib/firmware
 If you're running Ubuntu 10.10, that's all you have to do.
Keep an eye on the system log when you now plug the digitizer into the USB port.
tail -f /var/log/syslog
Among other messages, it should confirm that the firmware was uploaded successfully.
cx25840 5-0044: firmware: requesting v4l-cx25840.fw
cx25840 5-0044: loaded v4l-cx25840.fw firmware (16382 bytes)

Utilities for controlling the device from the command line can be found in the package ivtv-utils (from the Ubuntu repo).
v4l2-ctl --set-input 1
 switches to the composite video input
v4l2-ctl --set-ctrl=brightness=128,hue=0,contrast=68,volume=54000
 sets basic parameters for the digitizer.
Call v4l2-ctl without parameters for more help, and you will definitively want to try the switch -L
Recording is as simple as:
cp /dev/video0 video.mp2
This works most of the time.  Approx. 5% of the recordings contain a distorted audio stream. This distortion is present for the whole length of the recording and usually ends the next time the device /dev/video0 is opened. 
If the audio is ok at the beginning, it stays that way.  This looks like an initialization problem when the device is opened.  I haven't found a fix, yet.
Now to the more difficult part:

Getting the device to work under Ubuntu 10.04.
As mentioned before, many Hauppauge devices need firmware, which is uploaded to the unit when you plug it into the USB port.  Older hardware only needed 8192 bytes of firmware.  The firmware for this device however is 16382 bytes long (see the above firmware upload message from the log).  The device driver controlling the HVR-1900 (pvrusb2) that comes with kernel 2.6.32 and earlier is only capable of transferring 8192 bytes. And Ubuntu 4.10 LTS uses... 2.6.32.
Newer versions of the pvrusb2 driver can also upload the larger firmware.  For older kernels (like the one used in Ubuntu 4.10), you have to compile the updated driver yourself.
Compiling a kernel is usually a simple task, because the kernel source code already contains all dependencies. But this time, there were complications.
You need:
  •  the kernel source
  •  the tools to compile the kernel
  •  and the source of the updated driver
The easiest way to get the Ubuntu Linux source is by installing a package named "linux-source". It will store the source code as an archive in /usr/src/linux-source-2.6.32.tar.bz2 
You have to unpack it - make sure that you have plenty of disk space available:
cd /usr/src
tar xvfj linux-source-2.6.32.tar.bz2

Then run the following commands
cd linux-source-2.6.32
make oldconfig
make prepare

This will "regenerate" the .config file used by your distribution's kernel.  This file is needed during the kernel compilation.
Now we have to download the source code of the current pvrusb2 driver which can be found here. Unpack it and copy the content of the directory driver to /usr/src/linux-source-2.6.32/drivers/media/video/pvrusb2/ overriding the current files with the same name.
(Please note: the pvrusb2 documentation is describing a different approach, that did not work for me (modprobe rejected the module))
The next step would be:
make modules
But due to a totally unrelated bug  the compilation will fail, while trying to compile the "omnibook" files.
Download the patch for this bug from here and apply it
cd /usr/src
patch -p0 _name_of_the_path_file_

Now it's time to compile the modules:
cd /usr/src/linux-source-2.6.32
make modules

This step is very time consuming. If you have a multi core processor use the -j# option (where # is the number of cores you have).
Copy the new module from
/lib/modules/`uname -r`/kernel/drivers/media/video/pvrusb2/pvrusb2.ko
(where `uname -r` (backticks!) will be replaced by the name of your current kernel)
Keep in mind that you have to repeat that process after each kernel update.
After the next reboot the new module should be active. If you can't wait, unload the old one and load the new module manually:
rmmod pvrusb2
modprobe pvrusb2

Again, check /var/log/syslog for any problems.