1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
|
Hi all,
Mark Edwards was so kind to describe the steps he did to get his (at this time
unsupported) Avermedia DVB-T card running. Since this is a nice introduction
to the DVB infrastructure I added the file to the LinuxDVB CVS repository.
We hope it can help you to get your new unsupported card running or it's just
an interesting lecture if you are new to the DVB stuff and want to know how
things work together.
The mentioned patches are now part of the LinuxDVB CVS, you don't have to apply
them again.
have fun,
Holger
--------------------------------------------------------------------------------
HOWTO: Get An Avermedia DVB-T working under Linux
______________________________________________
Table of Contents
Assumptions and Introduction
The Avermedia DVB-T
Getting the card going
Receiving DVB-T in Australia
Patching dvb-bt8xx
Known Limitations
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 720x576 24-bit
color pixels over 25 frames per second - a fair amount of data
is generated and must be proceesed by the PC before it can be
displayed on the video monitor screen. Some Analogue TV cards
for PC's 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.
_________________________________________________________
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.
The Device Driver API for DVB under Linux exposes 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:
* insmod dvb-core.o
* modprobe bttv.o
* insmod bt878.o
* insmod dvb-bt8xx.o
* insmod sp887x.o
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.
_________________________________________________________
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
Documentation for DVB/apps/scan indicates that it is necesary
to alter the initial.h file for the local transponders. I
didn't spend too much time trying to work out how scan worked,
so I recompiled a new version of scan for each transponder
listed above and piped the output to a 'channels.conf' file.
It was necessary to alter the initial.h file in the following
way:
static
struct transponder ofdm_probes [] = {
/**
* Australia ABC
*/
{
.type = FE_OFDM,
.param = {
.frequency = 226500000,
.inversion = INVERSION_OFF,
{ ofdm:
{
.bandwidth = BANDWIDTH_7_MHZ,
.code_rate_HP = FEC_2_3,
.code_rate_LP = FEC_NONE,
.constellation = QAM_64,
.transmission_mode = TRANSMISSION_MODE_8K,
.guard_interval = GUARD_INTERVAL_1_8,
.hierarchy_information = HIERARCHY_NONE
}
}
}
},
/**
* Australia TEN
*/
{
.type = FE_OFDM,
.param = {
.frequency = 219500000,
.inversion = INVERSION_OFF,
{ ofdm:
{
.bandwidth = BANDWIDTH_7_MHZ,
.code_rate_HP = FEC_2_3,
.code_rate_LP = FEC_NONE,
.constellation = QAM_64,
.transmission_mode = TRANSMISSION_MODE_8K,
.guard_interval = GUARD_INTERVAL_1_8,
.hierarchy_information = HIERARCHY_NONE
}
}
}
},
/**
* Australia NINE
*/
{
.type = FE_OFDM,
.param = {
.frequency = 191625000,
.inversion = INVERSION_OFF,
{ ofdm:
{
.bandwidth = BANDWIDTH_7_MHZ,
.code_rate_HP = FEC_2_3,
.code_rate_LP = FEC_NONE,
.constellation = QAM_64,
.transmission_mode = TRANSMISSION_MODE_8K,
.guard_interval = GUARD_INTERVAL_1_8,
.hierarchy_information = HIERARCHY_NONE
}
}
}
},
/**
* Australia SEVEN
*/
{
.type = FE_OFDM,
.param = {
.frequency = 177500000,
.inversion = INVERSION_OFF,
{ ofdm:
{
.bandwidth = BANDWIDTH_7_MHZ,
.code_rate_HP = FEC_2_3,
.code_rate_LP = FEC_NONE,
.constellation = QAM_64,
.transmission_mode = TRANSMISSION_MODE_8K,
.guard_interval = GUARD_INTERVAL_1_8,
.hierarchy_information = HIERARCHY_NONE
}
}
}
},
/**
* Australia SBS
*/
{
.type = FE_OFDM,
.param = {
.frequency = 536500000,
.inversion = INVERSION_OFF,
{ ofdm:
{
.bandwidth = BANDWIDTH_7_MHZ,
.code_rate_HP = FEC_2_3,
.code_rate_LP = FEC_NONE,
.constellation = QAM_64,
.transmission_mode = TRANSMISSION_MODE_8K,
.guard_interval = GUARD_INTERVAL_1_8,
.hierarchy_information = HIERARCHY_NONE
}
}
}
},
};
#endif
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
the first successful transponder. In Australia, where each
hannel has it's own transponder, it's necessary to then
comment out the last transponder that was scanned and
recompile scan. This is a dreadful kludge I know, but all I
want with scan is to be able to create a working channels.conf
file. Now I have a working channels.conf file, I don't need
scan any more.
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:65
0: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:Q
AM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:0:2311:56
6
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:158
5
TEN Digital 1:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:Q
AM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1
586
TEN Digital 2:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:Q
AM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1
587
TEN Digital 3:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:Q
AM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1
588
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:158
9
TEN Digital 4:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:Q
AM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:512:650:1
590
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:159
1
TEN HD:219500000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QAM_64:T
RANSMISSION_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:159
3
Nine Digital:191625000:INVERSION_OFF:BANDWIDTH_7_MHZ:FEC_3_4:FEC_1_2:QA
M_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_16:HIERARCHY_NONE:513:660:10
72
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:1
073
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_6
4: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:QA
M_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:833:834:133
2
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:T
RANSMISSION_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:Q
AM_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:Q
AM_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
_________________________________________________________
Patching dvb-bt8xx
The following patch to dvb-bt8xx is required to be applied
against the code prior to file date 5th September 2003. It may
have been applied to CVS by the time this HOWTO gets
published.
Index: dvb-bt8xx.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/bt8xx/dvb-bt8
xx.c,v
retrieving revision 1.10
diff -u -r1.10 dvb-bt8xx.c
--- dvb-bt8xx.c 15 Jul 2003 09:30:02 -0000 1.10
+++ dvb-bt8xx.c 6 Sep 2003 02:06:20 -0000
@@ -302,6 +302,14 @@
case 0x01010071:
dvb_bt8xx_load(card_nr, "Nebula DigiTV
DVB-T", (1 << 26) | (1 << 14) | (1 << 5));
break;
+ case 0x07611461:
+ dvb_bt8xx_load(card_nr, "Avermedia DVB-
T", (1 << 26) | (1 << 14) | (1 << 5));
+ break;
+ default:
+ dprintk("dvb_bt8xx: card_nr found %0X \n",card_nr);
+ dprintk("dvb_bt8xx: card_id found %0X \n",card_id);
+ dprintk("dvb_bt8xx: card_type found %0X \n",card_type)
;
+ break;;
}
}
_________________________________________________________
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.
So far, I have only been able to decode SDTV MPEG2 data
streams from ABC, Channel 7, Channel 9 and SBS. For some
reason, the HDTV and all Channel 10 streams cause xine to die
on me. I am pursuing this particular limitation at the moment.
|