Root/Documentation/dvb/get_dvb_firmware

1#!/usr/bin/perl
2# DVB firmware extractor
3#
4# (c) 2004 Andrew de Quincey
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14#
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program; if not, write to the Free Software
19# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
21use File::Temp qw/ tempdir /;
22use IO::Handle;
23
24@components = ( "sp8870", "sp887x", "tda10045", "tda10046",
25        "tda10046lifeview", "av7110", "dec2000t", "dec2540t",
26        "dec3000s", "vp7041", "dibusb", "nxt2002", "nxt2004",
27        "or51211", "or51132_qam", "or51132_vsb", "bluebird",
28        "opera1", "cx231xx", "cx18", "cx23885", "pvrusb2", "mpc718",
29        "af9015", "ngene", "az6027", "lme2510_lg", "lme2510c_s7395",
30        "lme2510c_s7395_old", "drxk", "drxk_terratec_h5");
31
32# Check args
33syntax() if (scalar(@ARGV) != 1);
34$cid = $ARGV[0];
35
36# Do it!
37for ($i=0; $i < scalar(@components); $i++) {
38    if ($cid eq $components[$i]) {
39    $outfile = eval($cid);
40    die $@ if $@;
41    print STDERR <<EOF;
42Firmware(s) $outfile extracted successfully.
43Now copy it(them) to either /usr/lib/hotplug/firmware or /lib/firmware
44(depending on configuration of firmware hotplug).
45EOF
46    exit(0);
47    }
48}
49
50# If we get here, it wasn't found
51print STDERR "Unknown component \"$cid\"\n";
52syntax();
53
54
55
56
57# ---------------------------------------------------------------
58# Firmware-specific extraction subroutines
59
60sub sp8870 {
61    my $sourcefile = "tt_Premium_217g.zip";
62    my $url = "http://www.softwarepatch.pl/9999ccd06a4813cb827dbb0005071c71/$sourcefile";
63    my $hash = "53970ec17a538945a6d8cb608a7b3899";
64    my $outfile = "dvb-fe-sp8870.fw";
65    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
66
67    checkstandard();
68
69    wgetfile($sourcefile, $url);
70    unzip($sourcefile, $tmpdir);
71    verify("$tmpdir/software/OEM/HE/App/boot/SC_MAIN.MC", $hash);
72    copy("$tmpdir/software/OEM/HE/App/boot/SC_MAIN.MC", $outfile);
73
74    $outfile;
75}
76
77sub sp887x {
78    my $sourcefile = "Dvbt1.3.57.6.zip";
79    my $url = "http://www.avermedia.com/software/$sourcefile";
80    my $cabfile = "DVBT Net Ver1.3.57.6/disk1/data1.cab";
81    my $hash = "237938d53a7f834c05c42b894ca68ac3";
82    my $outfile = "dvb-fe-sp887x.fw";
83    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
84
85    checkstandard();
86    checkunshield();
87
88    wgetfile($sourcefile, $url);
89    unzip($sourcefile, $tmpdir);
90    unshield("$tmpdir/$cabfile", $tmpdir);
91    verify("$tmpdir/ZEnglish/sc_main.mc", $hash);
92    copy("$tmpdir/ZEnglish/sc_main.mc", $outfile);
93
94    $outfile;
95}
96
97sub tda10045 {
98    my $sourcefile = "tt_budget_217g.zip";
99    my $url = "http://www.technotrend.de/new/217g/$sourcefile";
100    my $hash = "2105fd5bf37842fbcdfa4bfd58f3594a";
101    my $outfile = "dvb-fe-tda10045.fw";
102    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
103
104    checkstandard();
105
106    wgetfile($sourcefile, $url);
107    unzip($sourcefile, $tmpdir);
108    extract("$tmpdir/software/OEM/PCI/App/ttlcdacc.dll", 0x37ef9, 30555, "$tmpdir/fwtmp");
109    verify("$tmpdir/fwtmp", $hash);
110    copy("$tmpdir/fwtmp", $outfile);
111
112    $outfile;
113}
114
115sub tda10046 {
116    my $sourcefile = "TT_PCI_2.19h_28_11_2006.zip";
117    my $url = "http://www.tt-download.com/download/updates/219/$sourcefile";
118    my $hash = "6a7e1e2f2644b162ff0502367553c72d";
119    my $outfile = "dvb-fe-tda10046.fw";
120    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
121
122    checkstandard();
123
124    wgetfile($sourcefile, $url);
125    unzip($sourcefile, $tmpdir);
126    extract("$tmpdir/TT_PCI_2.19h_28_11_2006/software/OEM/PCI/App/ttlcdacc.dll", 0x65389, 24478, "$tmpdir/fwtmp");
127    verify("$tmpdir/fwtmp", $hash);
128    copy("$tmpdir/fwtmp", $outfile);
129
130    $outfile;
131}
132
133sub tda10046lifeview {
134    my $sourcefile = "7%5Cdrv_2.11.02.zip";
135    my $url = "http://www.lifeview.hk/dbimages/document/$sourcefile";
136    my $hash = "1ea24dee4eea8fe971686981f34fd2e0";
137    my $outfile = "dvb-fe-tda10046.fw";
138    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
139
140    checkstandard();
141
142    wgetfile($sourcefile, $url);
143    unzip($sourcefile, $tmpdir);
144    extract("$tmpdir/LVHybrid.sys", 0x8b088, 24602, "$tmpdir/fwtmp");
145    verify("$tmpdir/fwtmp", $hash);
146    copy("$tmpdir/fwtmp", $outfile);
147
148    $outfile;
149}
150
151sub av7110 {
152    my $sourcefile = "dvb-ttpci-01.fw-261d";
153    my $url = "http://www.linuxtv.org/downloads/firmware/$sourcefile";
154    my $hash = "603431b6259715a8e88f376a53b64e2f";
155    my $outfile = "dvb-ttpci-01.fw";
156
157    checkstandard();
158
159    wgetfile($sourcefile, $url);
160    verify($sourcefile, $hash);
161    copy($sourcefile, $outfile);
162
163    $outfile;
164}
165
166sub dec2000t {
167    my $sourcefile = "dec217g.exe";
168    my $url = "http://hauppauge.lightpath.net/de/$sourcefile";
169    my $hash = "bd86f458cee4a8f0a8ce2d20c66215a9";
170    my $outfile = "dvb-ttusb-dec-2000t.fw";
171    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
172
173    checkstandard();
174
175    wgetfile($sourcefile, $url);
176    unzip($sourcefile, $tmpdir);
177    verify("$tmpdir/software/OEM/STB/App/Boot/STB_PC_T.bin", $hash);
178    copy("$tmpdir/software/OEM/STB/App/Boot/STB_PC_T.bin", $outfile);
179
180    $outfile;
181}
182
183sub dec2540t {
184    my $sourcefile = "dec217g.exe";
185    my $url = "http://hauppauge.lightpath.net/de/$sourcefile";
186    my $hash = "53e58f4f5b5c2930beee74a7681fed92";
187    my $outfile = "dvb-ttusb-dec-2540t.fw";
188    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
189
190    checkstandard();
191
192    wgetfile($sourcefile, $url);
193    unzip($sourcefile, $tmpdir);
194    verify("$tmpdir/software/OEM/STB/App/Boot/STB_PC_X.bin", $hash);
195    copy("$tmpdir/software/OEM/STB/App/Boot/STB_PC_X.bin", $outfile);
196
197    $outfile;
198}
199
200sub dec3000s {
201    my $sourcefile = "dec217g.exe";
202    my $url = "http://hauppauge.lightpath.net/de/$sourcefile";
203    my $hash = "b013ececea83f4d6d8d2a29ac7c1b448";
204    my $outfile = "dvb-ttusb-dec-3000s.fw";
205    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
206
207    checkstandard();
208
209    wgetfile($sourcefile, $url);
210    unzip($sourcefile, $tmpdir);
211    verify("$tmpdir/software/OEM/STB/App/Boot/STB_PC_S.bin", $hash);
212    copy("$tmpdir/software/OEM/STB/App/Boot/STB_PC_S.bin", $outfile);
213
214    $outfile;
215}
216sub opera1{
217    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 0);
218
219    checkstandard();
220    my $fwfile1="dvb-usb-opera1-fpga-01.fw";
221    my $fwfile2="dvb-usb-opera-01.fw";
222    extract("2830SCap2.sys", 0x62e8, 55024, "$tmpdir/opera1-fpga.fw");
223    extract("2830SLoad2.sys",0x3178,0x3685-0x3178,"$tmpdir/fw1part1");
224    extract("2830SLoad2.sys",0x0980,0x3150-0x0980,"$tmpdir/fw1part2");
225    delzero("$tmpdir/fw1part1","$tmpdir/fw1part1-1");
226    delzero("$tmpdir/fw1part2","$tmpdir/fw1part2-1");
227    verify("$tmpdir/fw1part1-1","5e0909858fdf0b5b09ad48b9fe622e70");
228    verify("$tmpdir/fw1part2-1","d6e146f321427e931df2c6fcadac37a1");
229    verify("$tmpdir/opera1-fpga.fw","0f8133f5e9051f5f3c1928f7e5a1b07d");
230
231    my $RES1="\x01\x92\x7f\x00\x01\x00";
232    my $RES0="\x01\x92\x7f\x00\x00\x00";
233    my $DAT1="\x01\x00\xe6\x00\x01\x00";
234    my $DAT0="\x01\x00\xe6\x00\x00\x00";
235    open FW,">$tmpdir/opera.fw";
236    print FW "$RES1";
237    print FW "$DAT1";
238    print FW "$RES1";
239    print FW "$DAT1";
240    appendfile(FW,"$tmpdir/fw1part1-1");
241    print FW "$RES0";
242    print FW "$DAT0";
243    print FW "$RES1";
244    print FW "$DAT1";
245    appendfile(FW,"$tmpdir/fw1part2-1");
246    print FW "$RES1";
247    print FW "$DAT1";
248    print FW "$RES0";
249    print FW "$DAT0";
250    copy ("$tmpdir/opera1-fpga.fw",$fwfile1);
251    copy ("$tmpdir/opera.fw",$fwfile2);
252
253    $fwfile1.",".$fwfile2;
254}
255
256sub vp7041 {
257    my $sourcefile = "2.422.zip";
258    my $url = "http://www.twinhan.com/files/driver/USB-Ter/$sourcefile";
259    my $hash = "e88c9372d1f66609a3e7b072c53fbcfe";
260    my $outfile = "dvb-vp7041-2.422.fw";
261    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
262
263    checkstandard();
264
265    wgetfile($sourcefile, $url);
266    unzip($sourcefile, $tmpdir);
267    extract("$tmpdir/VisionDTV/Drivers/Win2K&XP/UDTTload.sys", 12503, 3036, "$tmpdir/fwtmp1");
268    extract("$tmpdir/VisionDTV/Drivers/Win2K&XP/UDTTload.sys", 2207, 10274, "$tmpdir/fwtmp2");
269
270    my $CMD = "\000\001\000\222\177\000";
271    my $PAD = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000";
272    my ($FW);
273    open $FW, ">$tmpdir/fwtmp3";
274    print $FW "$CMD\001$PAD";
275    print $FW "$CMD\001$PAD";
276    appendfile($FW, "$tmpdir/fwtmp1");
277    print $FW "$CMD\000$PAD";
278    print $FW "$CMD\001$PAD";
279    appendfile($FW, "$tmpdir/fwtmp2");
280    print $FW "$CMD\001$PAD";
281    print $FW "$CMD\000$PAD";
282    close($FW);
283
284    verify("$tmpdir/fwtmp3", $hash);
285    copy("$tmpdir/fwtmp3", $outfile);
286
287    $outfile;
288}
289
290sub dibusb {
291    my $url = "http://www.linuxtv.org/downloads/firmware/dvb-usb-dibusb-5.0.0.11.fw";
292    my $outfile = "dvb-dibusb-5.0.0.11.fw";
293    my $hash = "fa490295a527360ca16dcdf3224ca243";
294
295    checkstandard();
296
297    wgetfile($outfile, $url);
298    verify($outfile,$hash);
299
300    $outfile;
301}
302
303sub nxt2002 {
304    my $sourcefile = "Technisat_DVB-PC_4_4_COMPACT.zip";
305    my $url = "http://www.bbti.us/download/windows/$sourcefile";
306    my $hash = "476befae8c7c1bb9648954060b1eec1f";
307    my $outfile = "dvb-fe-nxt2002.fw";
308    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
309
310    checkstandard();
311
312    wgetfile($sourcefile, $url);
313    unzip($sourcefile, $tmpdir);
314    verify("$tmpdir/SkyNET.sys", $hash);
315    extract("$tmpdir/SkyNET.sys", 331624, 5908, $outfile);
316
317    $outfile;
318}
319
320sub nxt2004 {
321    my $sourcefile = "AVerTVHD_MCE_A180_Drv_v1.2.2.16.zip";
322    my $url = "http://www.avermedia-usa.com/support/Drivers/$sourcefile";
323    my $hash = "111cb885b1e009188346d72acfed024c";
324    my $outfile = "dvb-fe-nxt2004.fw";
325    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
326
327    checkstandard();
328
329    wgetfile($sourcefile, $url);
330    unzip($sourcefile, $tmpdir);
331    verify("$tmpdir/3xHybrid.sys", $hash);
332    extract("$tmpdir/3xHybrid.sys", 465304, 9584, $outfile);
333
334    $outfile;
335}
336
337sub or51211 {
338    my $fwfile = "dvb-fe-or51211.fw";
339    my $url = "http://linuxtv.org/downloads/firmware/$fwfile";
340    my $hash = "d830949c771a289505bf9eafc225d491";
341
342    checkstandard();
343
344    wgetfile($fwfile, $url);
345    verify($fwfile, $hash);
346
347    $fwfile;
348}
349
350sub cx231xx {
351    my $fwfile = "v4l-cx231xx-avcore-01.fw";
352    my $url = "http://linuxtv.org/downloads/firmware/$fwfile";
353    my $hash = "7d3bb956dc9df0eafded2b56ba57cc42";
354
355    checkstandard();
356
357    wgetfile($fwfile, $url);
358    verify($fwfile, $hash);
359
360    $fwfile;
361}
362
363sub cx18 {
364    my $url = "http://linuxtv.org/downloads/firmware/";
365
366    my %files = (
367    'v4l-cx23418-apu.fw' => '588f081b562f5c653a3db1ad8f65939a',
368    'v4l-cx23418-cpu.fw' => 'b6c7ed64bc44b1a6e0840adaeac39d79',
369    'v4l-cx23418-dig.fw' => '95bc688d3e7599fd5800161e9971cc55',
370    );
371
372    checkstandard();
373
374    my $allfiles;
375    foreach my $fwfile (keys %files) {
376    wgetfile($fwfile, "$url/$fwfile");
377    verify($fwfile, $files{$fwfile});
378    $allfiles .= " $fwfile";
379    }
380
381    $allfiles =~ s/^\s//;
382
383    $allfiles;
384}
385
386sub mpc718 {
387    my $archive = 'Yuan MPC718 TV Tuner Card 2.13.10.1016.zip';
388    my $url = "ftp://ftp.work.acer-euro.com/desktop/aspire_idea510/vista/Drivers/$archive";
389    my $fwfile = "dvb-cx18-mpc718-mt352.fw";
390    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
391
392    checkstandard();
393    wgetfile($archive, $url);
394    unzip($archive, $tmpdir);
395
396    my $sourcefile = "$tmpdir/Yuan MPC718 TV Tuner Card 2.13.10.1016/mpc718_32bit/yuanrap.sys";
397    my $found = 0;
398
399    open IN, '<', $sourcefile or die "Couldn't open $sourcefile to extract $fwfile data\n";
400    binmode IN;
401    open OUT, '>', $fwfile;
402    binmode OUT;
403    {
404    # Block scope because we change the line terminator variable $/
405    my $prevlen = 0;
406    my $currlen;
407
408    # Buried in the data segment are 3 runs of almost identical
409    # register-value pairs that end in 0x5d 0x01 which is a "TUNER GO"
410    # command for the MT352.
411    # Pull out the middle run (because it's easy) of register-value
412    # pairs to make the "firmware" file.
413
414    local $/ = "\x5d\x01"; # MT352 "TUNER GO"
415
416    while (<IN>) {
417        $currlen = length($_);
418        if ($prevlen == $currlen && $currlen <= 64) {
419        chop; chop; # Get rid of "TUNER GO"
420        s/^\0\0//; # get rid of leading 00 00 if it's there
421        printf OUT "$_";
422        $found = 1;
423        last;
424        }
425        $prevlen = $currlen;
426    }
427    }
428    close OUT;
429    close IN;
430    if (!$found) {
431    unlink $fwfile;
432    die "Couldn't find valid register-value sequence in $sourcefile for $fwfile\n";
433    }
434    $fwfile;
435}
436
437sub cx23885 {
438    my $url = "http://linuxtv.org/downloads/firmware/";
439
440    my %files = (
441    'v4l-cx23885-avcore-01.fw' => 'a9f8f5d901a7fb42f552e1ee6384f3bb',
442    'v4l-cx23885-enc.fw' => 'a9f8f5d901a7fb42f552e1ee6384f3bb',
443    );
444
445    checkstandard();
446
447    my $allfiles;
448    foreach my $fwfile (keys %files) {
449    wgetfile($fwfile, "$url/$fwfile");
450    verify($fwfile, $files{$fwfile});
451    $allfiles .= " $fwfile";
452    }
453
454    $allfiles =~ s/^\s//;
455
456    $allfiles;
457}
458
459sub pvrusb2 {
460    my $url = "http://linuxtv.org/downloads/firmware/";
461
462    my %files = (
463    'v4l-cx25840.fw' => 'dadb79e9904fc8af96e8111d9cb59320',
464    );
465
466    checkstandard();
467
468    my $allfiles;
469    foreach my $fwfile (keys %files) {
470    wgetfile($fwfile, "$url/$fwfile");
471    verify($fwfile, $files{$fwfile});
472    $allfiles .= " $fwfile";
473    }
474
475    $allfiles =~ s/^\s//;
476
477    $allfiles;
478}
479
480sub or51132_qam {
481    my $fwfile = "dvb-fe-or51132-qam.fw";
482    my $url = "http://linuxtv.org/downloads/firmware/$fwfile";
483    my $hash = "7702e8938612de46ccadfe9b413cb3b5";
484
485    checkstandard();
486
487    wgetfile($fwfile, $url);
488    verify($fwfile, $hash);
489
490    $fwfile;
491}
492
493sub or51132_vsb {
494    my $fwfile = "dvb-fe-or51132-vsb.fw";
495    my $url = "http://linuxtv.org/downloads/firmware/$fwfile";
496    my $hash = "c16208e02f36fc439a557ad4c613364a";
497
498    checkstandard();
499
500    wgetfile($fwfile, $url);
501    verify($fwfile, $hash);
502
503    $fwfile;
504}
505
506sub bluebird {
507    my $url = "http://www.linuxtv.org/download/dvb/firmware/dvb-usb-bluebird-01.fw";
508    my $outfile = "dvb-usb-bluebird-01.fw";
509    my $hash = "658397cb9eba9101af9031302671f49d";
510
511    checkstandard();
512
513    wgetfile($outfile, $url);
514    verify($outfile,$hash);
515
516    $outfile;
517}
518
519sub af9015 {
520    my $sourcefile = "download.ashx?file=57";
521    my $url = "http://www.ite.com.tw/EN/Services/$sourcefile";
522    my $hash = "e3f08935158038d385ad382442f4bb2d";
523    my $outfile = "dvb-usb-af9015.fw";
524    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
525    my $fwoffset = 0x25690;
526    my $fwlength = 18725;
527    my ($chunklength, $buf, $rcount);
528
529    checkstandard();
530
531    wgetfile($sourcefile, $url);
532    unzip($sourcefile, $tmpdir);
533    verify("$tmpdir/Driver/Files/AF15BDA.sys", $hash);
534
535    open INFILE, '<', "$tmpdir/Driver/Files/AF15BDA.sys";
536    open OUTFILE, '>', $outfile;
537
538    sysseek(INFILE, $fwoffset, SEEK_SET);
539    while($fwlength > 0) {
540        $chunklength = 55;
541        $chunklength = $fwlength if ($chunklength > $fwlength);
542        $rcount = sysread(INFILE, $buf, $chunklength);
543        die "Ran out of data\n" if ($rcount != $chunklength);
544        syswrite(OUTFILE, $buf);
545        sysread(INFILE, $buf, 8);
546        $fwlength -= $rcount + 8;
547    }
548
549    close OUTFILE;
550    close INFILE;
551}
552
553sub ngene {
554    my $url = "http://www.digitaldevices.de/download/";
555    my $file1 = "ngene_15.fw";
556    my $hash1 = "d798d5a757121174f0dbc5f2833c0c85";
557    my $file2 = "ngene_17.fw";
558    my $hash2 = "26b687136e127b8ac24b81e0eeafc20b";
559    my $url2 = "http://l4m-daten.de/downloads/firmware/dvb-s2/linux/all/";
560    my $file3 = "ngene_18.fw";
561    my $hash3 = "ebce3ea769a53e3e0b0197c3b3f127e3";
562
563    checkstandard();
564
565    wgetfile($file1, $url . $file1);
566    verify($file1, $hash1);
567
568    wgetfile($file2, $url . $file2);
569    verify($file2, $hash2);
570
571    wgetfile($file3, $url2 . $file3);
572    verify($file3, $hash3);
573
574    "$file1, $file2, $file3";
575}
576
577sub az6027{
578    my $file = "AZ6027_Linux_Driver.tar.gz";
579    my $url = "http://linux.terratec.de/files/$file";
580    my $firmware = "dvb-usb-az6027-03.fw";
581
582    wgetfile($file, $url);
583
584    #untar
585    if( system("tar xzvf $file $firmware")){
586        die "failed to untar firmware";
587    }
588    if( system("rm $file")){
589        die ("unable to remove unnecessary files");
590    }
591
592    $firmware;
593}
594
595sub lme2510_lg {
596    my $sourcefile = "LMEBDA_DVBS.sys";
597    my $hash = "fc6017ad01e79890a97ec53bea157ed2";
598    my $outfile = "dvb-usb-lme2510-lg.fw";
599    my $hasho = "caa065d5fdbd2c09ad57b399bbf55cad";
600
601    checkstandard();
602
603    verify($sourcefile, $hash);
604    extract($sourcefile, 4168, 3841, $outfile);
605    verify($outfile, $hasho);
606    $outfile;
607}
608
609sub lme2510c_s7395 {
610    my $sourcefile = "US2A0D.sys";
611    my $hash = "b0155a8083fb822a3bd47bc360e74601";
612    my $outfile = "dvb-usb-lme2510c-s7395.fw";
613    my $hasho = "3a3cf1aeebd17b6ddc04cebe131e94cf";
614
615    checkstandard();
616
617    verify($sourcefile, $hash);
618    extract($sourcefile, 37248, 3720, $outfile);
619    verify($outfile, $hasho);
620    $outfile;
621}
622
623sub lme2510c_s7395_old {
624    my $sourcefile = "LMEBDA_DVBS7395C.sys";
625    my $hash = "7572ae0eb9cdf91baabd7c0ba9e09b31";
626    my $outfile = "dvb-usb-lme2510c-s7395.fw";
627    my $hasho = "90430c5b435eb5c6f88fd44a9d950674";
628
629    checkstandard();
630
631    verify($sourcefile, $hash);
632    extract($sourcefile, 4208, 3881, $outfile);
633    verify($outfile, $hasho);
634    $outfile;
635}
636
637sub drxk {
638    my $url = "http://l4m-daten.de/files/";
639    my $zipfile = "DDTuner.zip";
640    my $hash = "f5a37b9a20a3534997997c0b1382a3e5";
641    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
642    my $drvfile = "DDTuner.sys";
643    my $fwfile = "drxk_a3.mc";
644
645    checkstandard();
646
647    wgetfile($zipfile, $url . $zipfile);
648    verify($zipfile, $hash);
649    unzip($zipfile, $tmpdir);
650    extract("$tmpdir/$drvfile", 0x14dd8, 15634, "$fwfile");
651
652    "$fwfile"
653}
654
655sub drxk_terratec_h5 {
656    my $url = "http://www.linuxtv.org/downloads/firmware/";
657    my $hash = "19000dada8e2741162ccc50cc91fa7f1";
658    my $fwfile = "dvb-usb-terratec-h5-drxk.fw";
659
660    checkstandard();
661
662    wgetfile($fwfile, $url . $fwfile);
663    verify($fwfile, $hash);
664
665    "$fwfile"
666}
667
668# ---------------------------------------------------------------
669# Utilities
670
671sub checkstandard {
672    if (system("which unzip > /dev/null 2>&1")) {
673    die "This firmware requires the unzip command - see ftp://ftp.info-zip.org/pub/infozip/UnZip.html\n";
674    }
675    if (system("which md5sum > /dev/null 2>&1")) {
676    die "This firmware requires the md5sum command - see http://www.gnu.org/software/coreutils/\n";
677    }
678    if (system("which wget > /dev/null 2>&1")) {
679    die "This firmware requires the wget command - see http://wget.sunsite.dk/\n";
680    }
681}
682
683sub checkunshield {
684    if (system("which unshield > /dev/null 2>&1")) {
685    die "This firmware requires the unshield command - see http://sourceforge.net/projects/synce/\n";
686    }
687}
688
689sub wgetfile {
690    my ($sourcefile, $url) = @_;
691
692    if (! -f $sourcefile) {
693    system("wget -O \"$sourcefile\" \"$url\"") and die "wget failed - unable to download firmware";
694    }
695}
696
697sub unzip {
698    my ($sourcefile, $todir) = @_;
699
700    $status = system("unzip -q -o -d \"$todir\" \"$sourcefile\" 2>/dev/null" );
701    if ((($status >> 8) > 2) || (($status & 0xff) != 0)) {
702    die ("unzip failed - unable to extract firmware");
703    }
704}
705
706sub unshield {
707    my ($sourcefile, $todir) = @_;
708
709    system("unshield x -d \"$todir\" \"$sourcefile\" > /dev/null" ) and die ("unshield failed - unable to extract firmware");
710}
711
712sub verify {
713    my ($filename, $hash) = @_;
714    my ($testhash);
715
716    open(CMD, "md5sum \"$filename\"|");
717    $testhash = <CMD>;
718    $testhash =~ /([a-zA-Z0-9]*)/;
719    $testhash = $1;
720    close CMD;
721    die "Hash of extracted file does not match!\n" if ($testhash ne $hash);
722}
723
724sub copy {
725    my ($from, $to) = @_;
726
727    system("cp -f \"$from\" \"$to\"") and die ("cp failed");
728}
729
730sub extract {
731    my ($infile, $offset, $length, $outfile) = @_;
732    my ($chunklength, $buf, $rcount);
733
734    open INFILE, "<$infile";
735    open OUTFILE, ">$outfile";
736    sysseek(INFILE, $offset, SEEK_SET);
737    while($length > 0) {
738    # Calc chunk size
739    $chunklength = 2048;
740    $chunklength = $length if ($chunklength > $length);
741
742    $rcount = sysread(INFILE, $buf, $chunklength);
743    die "Ran out of data\n" if ($rcount != $chunklength);
744    syswrite(OUTFILE, $buf);
745    $length -= $rcount;
746    }
747    close INFILE;
748    close OUTFILE;
749}
750
751sub appendfile {
752    my ($FH, $infile) = @_;
753    my ($buf);
754
755    open INFILE, "<$infile";
756    while(1) {
757    $rcount = sysread(INFILE, $buf, 2048);
758    last if ($rcount == 0);
759    print $FH $buf;
760    }
761    close(INFILE);
762}
763
764sub delzero{
765    my ($infile,$outfile) =@_;
766
767    open INFILE,"<$infile";
768    open OUTFILE,">$outfile";
769    while (1){
770        $rcount=sysread(INFILE,$buf,22);
771        $len=ord(substr($buf,0,1));
772        print OUTFILE substr($buf,0,1);
773        print OUTFILE substr($buf,2,$len+3);
774    last if ($rcount<1);
775    printf OUTFILE "%c",0;
776#print $len." ".length($buf)."\n";
777
778    }
779    close(INFILE);
780    close(OUTFILE);
781}
782
783sub syntax() {
784    print STDERR "syntax: get_dvb_firmware <component>\n";
785    print STDERR "Supported components:\n";
786    @components = sort @components;
787    for($i=0; $i < scalar(@components); $i++) {
788    print STDERR "\t" . $components[$i] . "\n";
789    }
790    exit(1);
791}
792

Archive Download this file



interactive