.. SPDX-License-Identifier: GPL-2.0

HOWTO: Get An Avermedia DVB-T working under Linux
-------------------------------------------------

February 14th 2006

.. note::

   This documentation is outdated. Please check at the DVB wiki
   at https://linuxtv.org/wiki for more updated info.

   There's a section there specific for Avermedia boards at:
   https://linuxtv.org/wiki/index.php/AVerMedia


Assumptions and Introduction
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

It  is assumed that the reader understands the basic structure
of  the Linux Kernel DVB drivers and the general principles of
Digital TV.

One  significant difference between Digital TV and Analogue TV
that  the  unwary  (like  myself)  should  consider  is  that,
although  the  component  structure  of budget DVB-T cards are
substantially  similar  to Analogue TV cards, they function in
substantially different ways.

The  purpose  of  an  Analogue TV is to receive and display an
Analogue  Television  signal. An Analogue TV signal (otherwise
known  as  composite  video)  is  an  analogue  encoding  of a
sequence  of  image frames (25 per second) rasterised using an
interlacing   technique.   Interlacing  takes  two  fields  to
represent  one  frame.  Computers today are at their best when
dealing  with  digital  signals,  not  analogue  signals and a
composite  video signal is about as far removed from a digital
data stream as you can get. Therefore, an Analogue TV card for
a PC has the following purpose:

* Tune the receiver to receive a broadcast signal
* demodulate the broadcast signal
* demultiplex  the  analogue video signal and analogue audio
  signal. **NOTE:** some countries employ a digital audio signal
  embedded  within the modulated composite analogue signal -
  NICAM.)
* digitize  the analogue video signal and make the resulting
  datastream available to the data bus.

The  digital  datastream from an Analogue TV card is generated
by  circuitry on the card and is often presented uncompressed.
For  a PAL TV signal encoded at a resolution of 768x576 24-bit
color pixels over 25 frames per second - a fair amount of data
is  generated and must be processed by the PC before it can be
displayed  on the video monitor screen. Some Analogue TV cards
for  PCs  have  onboard  MPEG2  encoders  which permit the raw
digital  data  stream  to be presented to the PC in an encoded
and  compressed  form  -  similar  to the form that is used in
Digital TV.

The  purpose of a simple budget digital TV card (DVB-T,C or S)
is to simply:

* Tune the received to receive a broadcast signal.
* Extract  the encoded digital datastream from the broadcast
  signal.
* Make  the  encoded digital datastream (MPEG2) available to
  the data bus.

The  significant  difference between the two is that the tuner
on  the analogue TV card spits out an Analogue signal, whereas
the  tuner  on  the  digital  TV  card  spits out a compressed
encoded   digital   datastream.   As  the  signal  is  already
digitised,  it  is  trivial  to pass this datastream to the PC
databus  with  minimal  additional processing and then extract
the  digital  video  and audio datastreams passing them to the
appropriate software or hardware for decoding and viewing.

The Avermedia DVB-T
~~~~~~~~~~~~~~~~~~~

The Avermedia DVB-T is a budget PCI DVB card. It has 3 inputs:

* RF Tuner Input
* Composite Video Input (RCA Jack)
* SVIDEO Input (Mini-DIN)

The  RF  Tuner  Input  is the input to the tuner module of the
card.  The  Tuner  is  otherwise known as the "Frontend" . The
Frontend of the Avermedia DVB-T is a Microtune 7202D. A timely
post  to  the  linux-dvb  mailing  list  ascertained  that the
Microtune  7202D  is  supported  by the sp887x driver which is
found in the dvb-hw CVS module.

The  DVB-T card is based around the BT878 chip which is a very
common multimedia bridge and often found on Analogue TV cards.
There is no on-board MPEG2 decoder, which means that all MPEG2
decoding  must  be done in software, or if you have one, on an
MPEG2 hardware decoding card or chipset.


Getting the card going
~~~~~~~~~~~~~~~~~~~~~~

In order to fire up the card, it is necessary to load a number
of modules from the DVB driver set. Prior to this it will have
been  necessary to download these drivers from the linuxtv CVS
server and compile them successfully.

Depending on the card's feature set, the Device Driver API for
DVB under Linux will expose some of the following device files
in the /dev tree:

* /dev/dvb/adapter0/audio0
* /dev/dvb/adapter0/ca0
* /dev/dvb/adapter0/demux0
* /dev/dvb/adapter0/dvr0
* /dev/dvb/adapter0/frontend0
* /dev/dvb/adapter0/net0
* /dev/dvb/adapter0/osd0
* /dev/dvb/adapter0/video0

The  primary  device  nodes that we are interested in (at this
stage) for the Avermedia DVB-T are:

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

The dvr0 device node is used to read the MPEG2 Data Stream and
the frontend0 node is used to tune the frontend tuner module.

At  this  stage,  it  has  not  been  able  to  ascertain  the
functionality  of the remaining device nodes in respect of the
Avermedia  DVBT.  However,  full  functionality  in respect of
tuning,  receiving  and  supplying  the  MPEG2  data stream is
possible  with the currently available versions of the driver.
It  may be possible that additional functionality is available
from  the  card  (i.e.  viewing the additional analogue inputs
that  the card presents), but this has not been tested yet. If
I get around to this, I'll update the document with whatever I
find.

To  power  up  the  card,  load  the  following modules in the
following order:

* modprobe bttv (normally loaded automatically)
* modprobe dvb-bt8xx (or place dvb-bt8xx in /etc/modules)

Insertion  of  these  modules  into  the  running  kernel will
activate the appropriate DVB device nodes. It is then possible
to start accessing the card with utilities such as scan, tzap,
dvbstream etc.

The frontend module sp887x.o, requires an external   firmware.
/*(DEBLOBBED)*/

Receiving DVB-T in Australia
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

I  have  no  experience of DVB-T in other countries other than
Australia,  so  I will attempt to explain how it works here in
Melbourne  and how this affects the configuration of the DVB-T
card.

The  Digital  Broadcasting  Australia  website has a Reception
locatortool which provides information on transponder channels
and  frequencies.  My  local  transmitter  happens to be Mount
Dandenong.

The frequencies broadcast by Mount Dandenong are:

Table 1. Transponder Frequencies Mount Dandenong, Vic, Aus.
Broadcaster Channel Frequency
ABC         VHF 12  226.5 MHz
TEN         VHF 11  219.5 MHz
NINE        VHF 8   191.625 MHz
SEVEN       VHF 6   177.5 MHz
SBS         UHF 29  536.5 MHz

The Scan utility has a set of compiled-in defaults for various
countries and regions, but if they do not suit, or if you have
a pre-compiled scan binary, you can specify a data file on the
command  line which contains the transponder frequencies. Here
is a sample file for the above channel transponders:

::

	# Data file for DVB scan program
	#
	# C Frequency SymbolRate FEC QAM
	# S Frequency Polarisation SymbolRate FEC
	# T Frequency Bandwidth FEC FEC2 QAM Mode Guard Hier
	T 226500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
	T 191625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
	T 219500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
	T 177500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
	T 536500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE

The   defaults   for   the  transponder  frequency  and  other
modulation parameters were obtained from www.dba.org.au.

When  Scan  runs, it will output channels.conf information for
any  channel's transponders which the card's frontend can lock
onto.  (i.e.  any  whose  signal  is  strong  enough  at  your
antenna).

Here's my channels.conf file for anyone who's interested:

::

	ABC HDTV:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:2307:0:560
	ABC TV Melbourne:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:561
	ABC TV 2:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:562
	ABC TV 3:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:563
	ABC TV 4:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:564
	ABC DiG Radio:226500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_3_4:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2311:566
	TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1585
	TEN Digital 1:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1586
	TEN Digital 2:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1587
	TEN Digital 3:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1588
	TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1589
	TEN Digital 4:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1590
	TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1591
	TEN HD:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:514:0:1592
	TEN Digital:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1593
	Nine Digital:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:513:660:1072
	Nine Digital HD:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:0:1073
	Nine Guide:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:514:670:1074
	7 Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:769:770:1328
	7 Digital 1:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:769:770:1329
	7 Digital 2:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:769:770:1330
	7 Digital 3:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:769:770:1331
	7 HD Digital:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:833:834:1332
	7 Program Guide:177500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:865:866:1334
	SBS HD:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:102:103:784
	SBS DIGITAL 1:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:161:81:785
	SBS DIGITAL 2:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:162:83:786
	SBS EPG:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:163:85:787
	SBS RADIO 1:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:201:798
	SBS RADIO 2:536500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:0:202:799

Known Limitations
~~~~~~~~~~~~~~~~~

At  present  I can say with confidence that the frontend tunes
via /dev/dvb/adapter{x}/frontend0 and supplies an MPEG2 stream
via   /dev/dvb/adapter{x}/dvr0.   I   have   not   tested  the
functionality  of any other part of the card yet. I will do so
over time and update this document.

There  are some limitations in the i2c layer due to a returned
error message inconsistency. Although this generates errors in
dmesg  and  the  system logs, it does not appear to affect the
ability of the frontend to function correctly.

Further Update
~~~~~~~~~~~~~~

dvbstream  and  VideoLAN  Client on windows works a treat with
DVB,  in  fact  this  is  currently  serving as my main way of
viewing  DVB-T  at  the  moment.  Additionally, VLC is happily
decoding  HDTV  signals,  although  the PC is dropping the odd
frame here and there - I assume due to processing capability -
as all the decoding is being done under windows in software.

Many  thanks to Nigel Pearson for the updates to this document
since the recent revision of the driver.
