/sms1xxx

Siano DVB-T driver for FreeBSD

Primary LanguageCGNU General Public License v2.0GPL-2.0

About this driver :
*******************

--
WARNING: This driver implements DVB API v3 only and should be considered
deprecated, you should probably use Webcamd (multimedia/webcamd) instead.
--

Sms1xxx is a native FreeBSD driver for Siano-based DVB-T USB devices.
It should work on any version of FreeBSD >= 8.0 (see older versions
for FreeBSD 7.x).

It is a port of linux' sms1xxx driver (see drivers/media/dvb/siano
in the Linux source tree), initially from Linux kernel v.2.6.27.

The following web page presents an initial version of the Linux driver :

http://linuxtv.org/wiki/index.php/TerraTec_Cinergy_Piranha

The FreeBSD driver has been successfully tested with two devices :

- Terratec Cinergy Piranha
- Hauppauge WinTV MiniStick (HD)

Other devices should work, just give a try (you will need to edit the
sms1xxx.c file and add new VIDs/PIDs to make your device detected).

The FreeBSD version of the driver is based on the great dvbusb driver
written by Raaf :

http://raaf.atspace.org/dvbusb

with a few modifications to the demuxer (fixing issues with clones'
management).

License / availability :
************************

The sms1xxx driver is released under the GPL v2.0 license.

It is available on http://contribs.martymac.org and in the
FreeBSD ports tree (multimedia/sms1xxx-kmod).

This file explains how to install the driver from sources.

Getting firmware files :
************************

Before using the driver, you have to get the official firmwares for your
hardware, unpack and move them to each firmwares/* subdirectory.

Each firmware will then be used to build a corresponding firmware module
that will have to be loaded with the main kernel module.

For your convenience, a 'distinfo' file is present in each firmware directory,
allowing you to check if your firmware files match the firmwares I used for
development.

* Terratec Cinergy Piranha :

For the Terratec Cinergy Piranha USB key, get the following file :

ftp://ftp.terratec.net/Receiver/Cinergy_Piranha/Update/Cinergy_Piranha_Drv_Vista_XP_3.09.02.00.exe

Unpack the 3 firmware files :

unzip -j Cinergy_Piranha_Drv_Vista_XP_3.09.02.00.exe \
Cinergy\ Piranha/BDA\ Driver\ 3.09.02.00/Windos\ XP\ \(32Bit\)/SMS100x_Dvbt.inp \
Cinergy\ Piranha/BDA\ Driver\ 3.09.02.00/Windos\ XP\ \(32Bit\)/SMS100x_Dvbh.inp \
Cinergy\ Piranha/BDA\ Driver\ 3.09.02.00/Windos\ XP\ \(32Bit\)/SMS100x_DabTdmb.inp

And move each file to its own directory :

mv SMS100x_Dvbt.inp firmwares/stellar_dvbt/stellar_dvbt.fw
mv SMS100x_Dvbh.inp firmwares/stellar_dvbh/stellar_dvbh.fw
mv SMS100x_DabTdmb.inp firmwares/stellar_dabtdmb/stellar_dabtdmb.fw

* Hauppauge WinTV MiniStick

Get the following file :

http://www.wintvcd.co.uk/drivers/WinTV-MiniStick_4_2_26_28027_WHQL.zip

Unpack the 2 firmware files :

unzip -j WinTV-MiniStick_4_2_26_28027_WHQL.zip \
 driver17/hcw17dvb.1b0 \
 driver17/hcw17isd.1b0

And move them to their own directories :

mv hcw17dvb.1b0 firmwares/novab0_dvbbda/novab0_dvbbda.fw
mv hcw17isd.1b0 firmwares/novab0_isdbtbda/novab0_isdbtbda.fw

Building and installing everything :
************************************

First, if you do not want to build every single firmware file,
you may want to change the SUBDIR variable in firmwares/Makefile
to remove firmwares you do not need.

Then, just do :

make && make install

The main kernel module (sms1xxx.ko) and additional firmware modules
will be built and installed to /boot/modules.

Loading and using the driver :
******************************

Run :
kldload <your firmware module(s)>
e.g. :
  kldload stellar_dvbt.ko
  kldload stellar_dvbh.ko
  [...]
Depending on the mode(s) you wish to run.

Then, run : 
kldload sms1xxx

Finally, it might be necessary to tune a few sysctls :
* hw.usb.sms1xxx.freq_offset: Global frequency offset (Hz)
This sysctl will apply a global offset each time a tuning is performed.
166000 is necessary for Paris (France). It may or may not be necessary to
change that value, depending on where you live and the kind of hardware
you use.
* hw.usb.sms1xxx.requested_mode: Requested mode
(0=DVB-T, 1=DVB-H, 2=DAB/T-DMB, 4=DVB-T/BDA, 5=ISDBT, 6=ISDBT/BDA)
This sysctl is the mode that will be requested when plugging the next device.
You must have loaded the corresponding firmware in the previous step.
Please note that currently, only DVB-T (mode 4) is supported (this is the
default mode).

Testing the driver :
********************

First, plug the device (or it won't work :p). You can have a look at
/var/log/messages and see what happens.

If your device is detected and the firmware successfully loaded, two
device nodes should appear :

/dev/dvb/adapter0/dvr0
/dev/dvb/adapter0/frontend0

They will be used by applications to interact with your device.

While using the device, you will also see other nodes appear and disappear :

/dev/dvb/adapter0/demux0.n

They are dynamically created and destroyed when you have successfully tuned
the device to a specific frequency and when a PID filter has been set.

Once everything works, you will have to scan for channels. See the following
paragraph to build the w_scan and the scan utilities.

(if nothing works, you can try to build the module using 'make debug' and
tune the 'debug' sysctl to set the desired log level).

Building applications :
***********************

The driver is provided with a few applications :
w_scan        : searches for channels (initial or full search)
scan-dvb-apps : searches for channels (using an initial frequency list)
tzap-dvb-apps : tunes to a specific channel
dvbtools      : various DVB tools (dvbstream, dvbtune, dvbdate)
rc5watch      : displays IR codes sent by the remote controller (see below)

There is also a conf/ directory which contains my configuration files. They
are suitable for France (Paris) and need a freq_offset set to 166000.

To build an utility, go into its directory and use 'gmake'.

See apps/README for more details.

Using your device :
*******************

First, perform an initial search using w_scan. It will generate a file
containing frequencies airing on your location :

w_scan -x > xx-MyCity
(e.g. for me : w_scan -x > fr-Paris)

Then, scan for channels using the previous file and the scan utility :

scan xx-MyCity > channels.conf

channels.conf now contains a list of channels you can watch.

Then, tune the device to a specific channel :
tzap -rc channels.conf "MYCHANNEL"

Finally, you can view (or record) streamed data using the dvr0 device :
mplayer /dev/dvb/adapter0/dvr0
  or :
dd if=/dev/dvb/adapter0/dvr0 of=mystream.ts

Other applications :
********************

* ffplay (multimedia/ffmpeg)

* xine (multimedia/xine) can be used to watch TV directly (without
  having to use tzap) : xine 'dvb://MYCHANNEL'.

* vlc (multimedia/vlc) natively supports DVB : just check the V4L option
  before building the port.

  Then, you should be able to watch TV by launching it this way :

  vlc dtv://frequency=562000000:bandwidth=8

  or by selecting the "open capture device" entry in the "media' menu.

* mplayer (multimedia/mplayer) can also handle DVB devices.
  Build the port with V4L support, then copy your channels.conf file to
  /usr/local/etc/mplayer/. Now, launch Mplayer using the channel name
  as URL, e.g. :

  mplayer "dvb://ARTE"

IR (infrared) support :
***********************

If IR is supported by your device, an 'ir0' device will appear in your
DVB adapter's device directory (/dev/dvb/adapter0/ir0).

Reading this device will give you access to raw IR data received by the
adapter (use the provided remote control, if any).

If the IR module is sucessfully started, the 'ir_module_started' sysctl
of your device's node will also be set to 1.

For your convenience, an utility that decodes and prints received
events in a human-friendly format is available in the apps/rc5watch
directory.

Type 'make' to build it, then, once your device is plugged, run :

./rc5watch

Each received event will appear on stdout in the following form :

toggle:address:command

It is then possible to use this utility in a script that will perform
various actions given received key codes (see rc5exec.sh.sample).

It might also be possible to use the 'ir0' device with LIRC, but it has not
been tested. If you manage to make it work, please tell me :)

GPIO support :
**************

GPIO (General purpose Inpout Output) brings LEDs handling as well as LNA
(Low Noise Amplifier) support to some devices.

* If LEDs handling is supported by your device, LED colors will indicate
reception quality and device activity.

You can check if your device supports LEDs handling by buildind the driver
with debug support and check if the sysctl 'dev.sms1xxx.n.led_status' appears
once the device is plugged in. This sysctl can be used to test LEDs by setting
it to special values. See the sysctl's description for more details.

* If LNA handling is supported by your device, the sysctl 'dev.sms1xxx.n.use_lna'
will appear. Setting it to 1 will make the driver turn LNA on before each tuning
request. See the sysctl's description for more details.

See also :
**********

See also sms1xxx(4) man page.

Links :
*******

LinuxTV website :
http://www.linuxtv.org

Terratec Cinergy Piranha page on LinuxTV :
http://www.linuxtv.org/wiki/index.php/TerraTec_Cinergy_Piranha

Linux DVB API documentation :
http://www.linuxtv.org/docs/dvbapi/Contents.html

If you are looking for some additional firmwares, you can follow this post :
http://www.linuxtv.org/pipermail/linux-dvb/2009-January/031537.html

And this link :
http://www.steventoth.net/linux/sms1xxx

Raaf's original work for the dvbusb driver :
http://raaf.atspace.org/dvbusb

V4L-Compat :
http://www.tangobravo.co.uk/v4l-compat

Video4BSD :
http://www.selasky.org/hans_petter/video4bsd/index.html

Author :
********

This driver has been written by Ganaël Laplanche
(ganael.laplanche@martymac.org). Any comment is welcome !