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.