Installing (ivtv) driver for Hauppauge 250/350 TV-card

1) Try the original Ubuntu guide first.

If you are not happy with that guide or you run Linux-kernel 2.6.19 then continue with the steps below.

0) Important prerequisite: Configure multimedia support in kenel 2.6.19

I have explained the kernel configuration more thoroughly in this document…, but the most important thing here is the inclusion of various multimedia (pvr) drivers.

Hauppauge WinTV PVR 350 TV-card has CX2341x MPEG decoder/encoder chipset (what I know). We must activate that driver in the kernel configuration among other things.

Browse to kernel 2.6.19’s source directory and reconfigure the kernel.

$ sudo -s
# cd /usr/src/linux
# make menuconfig

Browse to

Device Drivers —>
Multimedia devices —>
Video Capture Adapters —>

[ ] Enable advanced debug functionality

Deselect this option
[ ] Autoselect pertinent encoders/decoders and other helper chips

Browse further to
Encoders/decoders and other helper chips —>

and include all drivers as loadable modules, i.e set “M” to all options in the list.
— Audio decoders
<M> Simple audio decoder chips
<M> Philips TDA7432 audio processor
<M> Philips TDA9840 audio processor
<M> Philips TDA9875 audio processor
<M> Philips TEA6415C audio processor
<M> Philips TEA6420 audio processor
<M> Micronas MSP34xx audio decoders
<M> Cirrus Logic CS53L32A audio ADC
<M> Texas Instruments TLV320AIC23B audio codec
<M> Wolfson Microelectronics WM8775 audio ADC with input mixer
<M> Wolfson Microelectronics WM8739 stereo audio ADC
— Video decoders
<M> BT819A VideoStream decoder
<M> BT856 VideoStream decoder
<M> BT866 VideoStream decoder
<M> KS0127 video decoder
— Philips SAA7110 video decoder
<M> Philips SAA7111 video decoder
<M> Philips SAA7114 video decoder
<M> Philips SAA7113/4/5 video decoders
<M> Philips SAA7191 video decoder
<M> Texas Instruments TVP5150 video decoder
<M> vpx3220a, vpx3216b & vpx3214c video decoders
— Video and audio decoders
<M> Conexant CX2584x audio/video decoders
— MPEG video encoders
— Conexant CX2341x MPEG encoders <— It seems to me that this is included by default.
— Video encoders
<M> Philips SAA7127/9 digital video encoders
<M> Philips SAA7185 video encoder
<M> Analog Devices ADV7170 video encoder
<M> Analog Devices ADV7175 video encoder
— Video improvement chips
<M> NEC Electronics uPD64031A Ghost Reduction
<M> NEC Electronics uPD64083 3-Dimensional Y/C separation

Save the settings, recompile and install your 2.6.19 kernel.
Reboot to your new kernel.

Now lets’s move on and prepare the “ivtv” driver.

1) Install compiler suite and maketools

$ sudo apt-get update
$ sudo apt-get install build-essential

2) Install kernel-headers or kernel-source

Check first your kernel version. I have manually compiled and installed version 2.6.19 of the kernel…
$ uname -r

What header packages does the repo offer?
$ sudo apt-cache search linux-headers

Install appropriate header (kernel header files) package. I drop this step because I rolled the v2.6.19 kernel sources manually.
$ sudo apt-get install linux-headers-$(uname -r)

3) Create a working directory

$ mkdir $HOME/ivtv
$ cd $HOME/ivtv

4) Download source code for the ivtv driver

First, read this note carefully:
The ivtv-0.9.x release is for the 2.6.19 kernel. It does NOT compile with older kernels. If you want to use ivtv on older kernels, then you should use ivtv-0.4.X, ivtv-0.6.X, ivtv-0.7.X or ivtv-0.8.X instead. The ivtv-0.4 series provides support for kernels up to 2.6.15 only. The 0.6 release is for kernel 2.6.16. The 0.7 release is for kernel 2.6.17, and the 0.8 release is for the 2.6.18 kernel. The 0.9 release is unlikely to work with kernels >= 2.6.20.

Now browse to and pick the driver package that match your kernel. Be careful with this choice.

Check also the changelogs on

The latest ivtv-0.9.0.tar.gz code is strictly for kernel v2.6.19 only. You will probably need the version 0.7 or 0.8. Check your kernel version with “uname -r” command.

I download this driver ball
$ wget -c

Unzip og untar it
$ tar -xvzf ivtv-0.9.0.tar.gz

5) Study README and doc/REDAME.install files

Cd into the code directory (change the name to match what ever version you have)
$ cd ivtv-0.9.0

$ cat README

The doc directory contains other very important documents
$ ls -l doc/

Use gedit or kate to study the doc/README.install file.
$ gedit doc/README.install

6) Rename old driver modules

We must rename some old modules that are provided by the Linux-kernel.
$ cd /lib/modules/$(uname -r)/kernel/drivers/media/video/

$ sudo mv msp3400.ko msp3400.ko.old
$ sudo mv tveeprom.ko tveeprom.ko.old
$ sudo mv tuner.ko tuner.ko.old

7) Compile and install the new ivtv driver

Again, the directory name maybe different in your case. Anyway cd into the source folder.
$ cd $HOME/ivtv/ivtv-0.9.0

Where are we now?
$ pwd

Compile it
$ make

Very important ! Check if you see any error messages.

If you see error messages similar to these

> WARNING: "cx2341x_mpeg_ctrls" [/usr/src/ivtv-0.8.1/driver/ivtv.ko] undefined!
> WARNING: "cx2341x_fill_defaults" [/usr/src/ivtv-0.8.1/driver/ivtv.ko] undefined!
> WARNING: "cx2341x_log_status" [/usr/src/ivtv-0.8.1/driver/ivtv.ko] undefined!

Then you've failed to configure your 2.6.19 kernel properly. Return to step 0) in this document.

Install the driver !
$ sudo make install

Check wheather the drivers were installed under current kernel
$ find /lib/modules/$(uname -r) -name “ivtv*”

Looks good 🙂

Update module dependencies
$ sudo depmod -a

8) Install firmware files

Firmware are small binary files that initialize the electronics of the TV-card. Firmware files should be placed either in the /lib/firmware/$(uname -r) or directly
under /lib/firmware/ directory. As you know, the uname -r returns the current kernel version.

Create a temporary working directory for the firmware

$ cd $HOME/ivtv
$ mkdir firmware

Let’s make this easy way !

Download ready-made firmware package and unzip it.

$ cd $HOME/ivtv
$ wget
$ tar -xvzf firmware.tar.gz -C firmware

Copy the files to /lib/firmware
$ sudo cp firmware/* /lib/firmware

You should see these 6 files
$ ls -l /lib/firmware

-rw-r–r– 1 root root 262144 2006-12-06 15:38 v4l-cx2341x-dec.fw
-rw-r–r– 1 root root 262144 2006-12-06 15:38 v4l-cx2341x-enc.fw
-rw-r–r– 1 root root 155648 2006-12-06 15:38 v4l-cx2341x-init.mpg
-rw-r–r– 1 root root 16382 2006-12-06 15:38 v4l-cx25840.fw
-rw-r–r– 1 root root 8192 2006-12-06 15:38 v4l-pvrusb2-24xxx-01.fw
-rw-r–r– 1 root root 8192 2006-12-06 15:38 v4l-pvrusb2-29xxx-01.fw

So good so far.

9) Set driver parameters

Create a new or edit an existing “ivtv” file in /etc/modutils/. I use gedit editor here.
$ sudo gedit /etc/modutils/ivtv

Copy these 4 lines into that file. Save the file.

# Parametere
for ivtv:
alias char-major-81 videodev
alias char-major-81-0 ivtv
# options ivtv ivtv_debug=1 ivtv_std=2

10) Put “ivtv” driver name into /etc/modules

Insert “ivtv” driver name to the /etc/modules. It is then loaded automatically at system startup.

Edit /etc/modules and insert ivtv name into that file.
$ sudo gedit /etc/modules

11) Load the ivtv driver und test it

Close mplayer, tvtime und other programs that can hold on the ivtv driver.
$ killall mplayer
$ killall tvtime

Load the driver
$ sudo modprobe -r ivtv # Remove old driver
$ sudo modprobe ivtv # Reload it

Check the system messages. This is a very important step.

$ dmesg

Look between START INIT IVTV and END INIT IVTV tags.
Especially check if the firmware files were found and loaded with success.

This is a sample of a good and successful system report.

[ 2973.077769] ivtv: ==================== START INIT IVTV ====================
[ 2973.077772] ivtv: version 0.9.0 (tagged release) loading
[ 2973.077774] ivtv: Linux version: 2.6.19-686 SMP mod_unload 586 REGPARM
[ 2973.077776] ivtv: In case of problems please include the debug info between
[ 2973.077777] ivtv: the START INIT IVTV and END INIT IVTV lines, along with
[ 2973.077779] ivtv: any module options, when mailing the ivtv-users mailinglist.
[ 2973.078061] ivtv0: Autodetected Hauppauge card (cx23415 based)
[ 2973.078091] ACPI: PCI Interrupt 0000:02:09.0[A] -> Link [APC4] -> GSI 19 (level, low) -> IRQ 22
[ 2973.712595] ivtv0: loaded v4l-cx2341x-enc.fw firmware (262144 bytes)
[ 2973.728571] ivtv0: loaded v4l-cx2341x-dec.fw firmware (262144 bytes)
[ 2973.935600] tuner 5-0043: chip found @ 0x86 (ivtv i2c driver #0)
[ 2973.936017] tda9887 5-0043: tda988[5/6/7] found @ 0x43 (tuner)
[ 2973.940529] tuner 5-0061: chip found @ 0xc2 (ivtv i2c driver #0)
[ 2973.997117] saa7115 5-0021: saa7115 found (1f7115d0e100000) @ 0x42 (ivtv i2c driver #0)
[ 2974.222917] saa7127 5-0044: saa7129 found @ 0x88 (ivtv i2c driver #0)
[ 2974.238996] msp3400 5-0040: MSP4418G-B3 found @ 0x80 (ivtv i2c driver #0)
[ 2974.239001] msp3400 5-0040: MSP4418G-B3 supports nicam and radio, mode is autodetect and autoselect
[ 2974.304942] tveeprom 5-0050: The eeprom says no radio is present, but the tuner type
[ 2974.304946] tveeprom 5-0050: indicates otherwise. I will assume that radio is present.
[ 2974.304950] tveeprom 5-0050: Hauppauge model 48139, rev K257, serial# 8206014
[ 2974.304952] tveeprom 5-0050: tuner model is Philips FM1216 ME MK3 (idx 57, type 38)
[ 2974.304955] tveeprom 5-0050: TV standards PAL(B/G) PAL(I) SECAM(L/L’) PAL(D/D1/K) (eeprom 0x74)
[ 2974.304957] tveeprom 5-0050: audio processor is MSP4418 (idx 25)
[ 2974.304959] tveeprom 5-0050: decoder processor is SAA7115 (idx 19)
[ 2974.304961] tveeprom 5-0050: has radio, has IR remote
[ 2974.304963] ivtv0: Autodetected Hauppauge WinTV PVR-350
[ 2974.361437] ivtv0: Encoder revision: 0x02050032
[ 2974.371448] ivtv0: Decoder revision: 0x02020023
[ 2974.371907] ivtv0: Registered device video0 for encoder MPEG
[ 2974.372401] ivtv0: Registered device video32 for encoder YUV
[ 2974.372879] ivtv0: Registered device vbi0 for encoder VBI
[ 2974.373303] ivtv0: Registered device video24 for encoder PCM audio
[ 2974.374005] ivtv0: Registered device radio0 for encoder radio
[ 2974.374358] ivtv0: Registered device video16 for decoder MPEG
[ 2974.374845] ivtv0: Registered device vbi8 for decoder VBI
[ 2974.375579] ivtv0: Registered device vbi16 for decoder VOUT
[ 2974.375946] ivtv0: Registered device video48 for decoder YUV
[ 2974.573653] ivtv0: loaded v4l-cx2341x-init.mpg firmware (155648 bytes)
[ 2974.701964] tuner 5-0061: type set to 38 (Philips PAL/SECAM multi (FM1216ME MK3))
[ 2975.120217] ivtv0: Initialized Hauppauge WinTV PVR-350, card #0
[ 2975.120344] ivtv: ==================== END INIT IVTV ====================

Check the device names.
Ivtv driver will automatically create device names for /dev/video*. Check if these devices exist. The names are explained in the doc/README.devices file (in the ivtv’s source dir).

$ ls -l /dev/video*
lrwxrwxrwx 1 root root 7 2006-12-06 14:45 /dev/video -> video48
crw-rw—- 1 root video 81, 0 2006-12-06 14:45 /dev/video0
crw-rw—- 1 root video 81, 16 2006-12-06 14:45 /dev/video16
crw-rw—- 1 root video 81, 24 2006-12-06 14:45 /dev/video24
crw-rw—- 1 root video 81, 32 2006-12-06 14:45 /dev/video32
crw-rw—- 1 root video 81, 48 2006-12-06 14:45 /dev/video48

This looks perfict.

Read the troubleshooting page if you experience any problems with the driver.


12) Using the Hauppauge TV-card

Notice that Hauppauge PVR 350 card has TV-out (S-video) and it has a hardware mpeg-2 encoding chip which rescues CPU from the heavy encoding task. It means that you can directly play the mpeg-stream (from /dev/video0 ) on your mediaplayer. TV-out means that you can connect your TV to the card and watch your recordings by that. That’s cool.

This is how I use the card.

I have tried tvtime… but it does not understand the mpeg stream on /dev/video0 — what I grasp about this matter. I have heard rumours that the development version of xawtv… will work with mpeg streams, but haven’t tried it yet.

So I use mplayer or totem directly. It’s so easy !
$ mplayer /dev/video0
$ totem /dev/video0

I do not use remote control (LIRC) , so I just created a tiny shell script with some hardcoded Norwegian and int.national TV-frequencies. It shows a menu with channels and starts mplayer on demand. The dialog is based on “zenity” whick you can find in your package system.

Study the script:

$ sudo apt-get install zenity
$ chmod +x

Run it
$ ./

Channels from the Norwegian home CanalDigital’s cabel TV are listed here

Grab your frequencies from your cabel TV provider’s webpage.

Generally you can use the “ivtv-tune” tool to set the frequency. Eg. this command sets 203.25Mhz (which is the NRK-1 channel in Norway).

First, start mplayer and let it stream /dev/video0 (mpeg stream)
$ mplayer /dev/video0
$ totem /dev/video0

Set channel frequency (in another terminal-window)
$ ivtv-tune -f203.25

ivtvctl provides several options
$ ivtv-tune –help

List frequency table
$ ivtv-tune -L

$ ivtv-tune -t europe-west -l

You may try to pick some of the channels
$ ivtv-tune -t europe-west -c E5

$ ivtv-tune -t europe-west -f210.25
—- script shows some more elaborated mplayer commands (opengl and framedrops).

I must say that the current version of the ivtv-driver really rocks !
It’s very stable.

Thanks to all people who’s working on the project.

Related documents:

The main site: + Documentation…

How to install the Firmware files:

Ivtv users’ mail-archive:

Files related to this document:

An older (obsolete) version of this document :

Leave a Reply

Your email address will not be published. Required fields are marked *

13 + 12 =

© All Right Reserved 2019-2020