162306a36Sopenharmony_ci#!/usr/bin/env perl
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-or-later
362306a36Sopenharmony_ci#     DVB firmware extractor
462306a36Sopenharmony_ci#
562306a36Sopenharmony_ci#     (c) 2004 Andrew de Quincey
662306a36Sopenharmony_ci#
762306a36Sopenharmony_ci
862306a36Sopenharmony_ciuse File::Temp qw/ tempdir /;
962306a36Sopenharmony_ciuse IO::Handle;
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci@components = ( "sp8870", "sp887x", "tda10045", "tda10046",
1262306a36Sopenharmony_ci		"tda10046lifeview", "av7110", "dec2000t", "dec2540t",
1362306a36Sopenharmony_ci		"dec3000s", "vp7041", "vp7049", "dibusb", "nxt2002", "nxt2004",
1462306a36Sopenharmony_ci		"or51211", "or51132_qam", "or51132_vsb", "bluebird",
1562306a36Sopenharmony_ci		"opera1", "cx231xx", "cx18", "cx23885", "pvrusb2", "mpc718",
1662306a36Sopenharmony_ci		"af9015", "ngene", "az6027", "lme2510_lg", "lme2510c_s7395",
1762306a36Sopenharmony_ci		"lme2510c_s7395_old", "drxk", "drxk_terratec_h5",
1862306a36Sopenharmony_ci		"drxk_hauppauge_hvr930c", "tda10071", "it9135", "drxk_pctv",
1962306a36Sopenharmony_ci		"drxk_terratec_htc_stick", "sms1xxx_hcw", "si2165");
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci# Check args
2262306a36Sopenharmony_cisyntax() if (scalar(@ARGV) != 1);
2362306a36Sopenharmony_ci$cid = $ARGV[0];
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci# Do it!
2662306a36Sopenharmony_cifor ($i=0; $i < scalar(@components); $i++) {
2762306a36Sopenharmony_ci    if ($cid eq $components[$i]) {
2862306a36Sopenharmony_ci	$outfile = eval($cid);
2962306a36Sopenharmony_ci	die $@ if $@;
3062306a36Sopenharmony_ci	print STDERR <<EOF;
3162306a36Sopenharmony_ciFirmware(s) $outfile extracted successfully.
3262306a36Sopenharmony_ciNow copy it(them) to either /usr/lib/hotplug/firmware or /lib/firmware
3362306a36Sopenharmony_ci(depending on configuration of firmware hotplug).
3462306a36Sopenharmony_ciEOF
3562306a36Sopenharmony_ci	exit(0);
3662306a36Sopenharmony_ci    }
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci# If we get here, it wasn't found
4062306a36Sopenharmony_ciprint STDERR "Unknown component \"$cid\"\n";
4162306a36Sopenharmony_cisyntax();
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci# ---------------------------------------------------------------
4762306a36Sopenharmony_ci# Firmware-specific extraction subroutines
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cisub sp8870 {
5062306a36Sopenharmony_ci    my $sourcefile = "tt_Premium_217g.zip";
5162306a36Sopenharmony_ci    my $url = "http://www.softwarepatch.pl/9999ccd06a4813cb827dbb0005071c71/$sourcefile";
5262306a36Sopenharmony_ci    my $hash = "53970ec17a538945a6d8cb608a7b3899";
5362306a36Sopenharmony_ci    my $outfile = "dvb-fe-sp8870.fw";
5462306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci    checkstandard();
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci    wgetfile($sourcefile, $url);
5962306a36Sopenharmony_ci    unzip($sourcefile, $tmpdir);
6062306a36Sopenharmony_ci    verify("$tmpdir/software/OEM/HE/App/boot/SC_MAIN.MC", $hash);
6162306a36Sopenharmony_ci    copy("$tmpdir/software/OEM/HE/App/boot/SC_MAIN.MC", $outfile);
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci    $outfile;
6462306a36Sopenharmony_ci}
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cisub sp887x {
6762306a36Sopenharmony_ci    my $sourcefile = "Dvbt1.3.57.6.zip";
6862306a36Sopenharmony_ci    my $url = "http://www.avermedia.com/software/$sourcefile";
6962306a36Sopenharmony_ci    my $cabfile = "DVBT Net  Ver1.3.57.6/disk1/data1.cab";
7062306a36Sopenharmony_ci    my $hash = "237938d53a7f834c05c42b894ca68ac3";
7162306a36Sopenharmony_ci    my $outfile = "dvb-fe-sp887x.fw";
7262306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci    checkstandard();
7562306a36Sopenharmony_ci    checkunshield();
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci    wgetfile($sourcefile, $url);
7862306a36Sopenharmony_ci    unzip($sourcefile, $tmpdir);
7962306a36Sopenharmony_ci    unshield("$tmpdir/$cabfile", $tmpdir);
8062306a36Sopenharmony_ci    verify("$tmpdir/ZEnglish/sc_main.mc", $hash);
8162306a36Sopenharmony_ci    copy("$tmpdir/ZEnglish/sc_main.mc", $outfile);
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci    $outfile;
8462306a36Sopenharmony_ci}
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cisub tda10045 {
8762306a36Sopenharmony_ci    my $sourcefile = "tt_budget_217g.zip";
8862306a36Sopenharmony_ci    my $url = "http://www.technotrend.de/new/217g/$sourcefile";
8962306a36Sopenharmony_ci    my $hash = "2105fd5bf37842fbcdfa4bfd58f3594a";
9062306a36Sopenharmony_ci    my $outfile = "dvb-fe-tda10045.fw";
9162306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci    checkstandard();
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci    wgetfile($sourcefile, $url);
9662306a36Sopenharmony_ci    unzip($sourcefile, $tmpdir);
9762306a36Sopenharmony_ci    extract("$tmpdir/software/OEM/PCI/App/ttlcdacc.dll", 0x37ef9, 30555, "$tmpdir/fwtmp");
9862306a36Sopenharmony_ci    verify("$tmpdir/fwtmp", $hash);
9962306a36Sopenharmony_ci    copy("$tmpdir/fwtmp", $outfile);
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci    $outfile;
10262306a36Sopenharmony_ci}
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_cisub tda10046 {
10562306a36Sopenharmony_ci	my $sourcefile = "TT_PCI_2.19h_28_11_2006.zip";
10662306a36Sopenharmony_ci	my $url = "http://technotrend.com.ua/download/software/219/$sourcefile";
10762306a36Sopenharmony_ci	my $hash = "6a7e1e2f2644b162ff0502367553c72d";
10862306a36Sopenharmony_ci	my $outfile = "dvb-fe-tda10046.fw";
10962306a36Sopenharmony_ci	my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	checkstandard();
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	wgetfile($sourcefile, $url);
11462306a36Sopenharmony_ci	unzip($sourcefile, $tmpdir);
11562306a36Sopenharmony_ci	extract("$tmpdir/TT_PCI_2.19h_28_11_2006/software/OEM/PCI/App/ttlcdacc.dll", 0x65389, 24478, "$tmpdir/fwtmp");
11662306a36Sopenharmony_ci	verify("$tmpdir/fwtmp", $hash);
11762306a36Sopenharmony_ci	copy("$tmpdir/fwtmp", $outfile);
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci	$outfile;
12062306a36Sopenharmony_ci}
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cisub tda10046lifeview {
12362306a36Sopenharmony_ci    my $sourcefile = "7%5Cdrv_2.11.02.zip";
12462306a36Sopenharmony_ci    my $url = "http://www.lifeview.hk/dbimages/document/$sourcefile";
12562306a36Sopenharmony_ci    my $hash = "1ea24dee4eea8fe971686981f34fd2e0";
12662306a36Sopenharmony_ci    my $outfile = "dvb-fe-tda10046.fw";
12762306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci    checkstandard();
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci    wgetfile($sourcefile, $url);
13262306a36Sopenharmony_ci    unzip($sourcefile, $tmpdir);
13362306a36Sopenharmony_ci    extract("$tmpdir/LVHybrid.sys", 0x8b088, 24602, "$tmpdir/fwtmp");
13462306a36Sopenharmony_ci    verify("$tmpdir/fwtmp", $hash);
13562306a36Sopenharmony_ci    copy("$tmpdir/fwtmp", $outfile);
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci    $outfile;
13862306a36Sopenharmony_ci}
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_cisub av7110 {
14162306a36Sopenharmony_ci    my $sourcefile = "dvb-ttpci-01.fw-261d";
14262306a36Sopenharmony_ci    my $url = "https://linuxtv.org/downloads/firmware/$sourcefile";
14362306a36Sopenharmony_ci    my $hash = "603431b6259715a8e88f376a53b64e2f";
14462306a36Sopenharmony_ci    my $outfile = "dvb-ttpci-01.fw";
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci    checkstandard();
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci    wgetfile($sourcefile, $url);
14962306a36Sopenharmony_ci    verify($sourcefile, $hash);
15062306a36Sopenharmony_ci    copy($sourcefile, $outfile);
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci    $outfile;
15362306a36Sopenharmony_ci}
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_cisub dec2000t {
15662306a36Sopenharmony_ci    my $sourcefile = "dec217g.exe";
15762306a36Sopenharmony_ci    my $url = "http://hauppauge.lightpath.net/de/$sourcefile";
15862306a36Sopenharmony_ci    my $hash = "bd86f458cee4a8f0a8ce2d20c66215a9";
15962306a36Sopenharmony_ci    my $outfile = "dvb-ttusb-dec-2000t.fw";
16062306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci    checkstandard();
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci    wgetfile($sourcefile, $url);
16562306a36Sopenharmony_ci    unzip($sourcefile, $tmpdir);
16662306a36Sopenharmony_ci    verify("$tmpdir/software/OEM/STB/App/Boot/STB_PC_T.bin", $hash);
16762306a36Sopenharmony_ci    copy("$tmpdir/software/OEM/STB/App/Boot/STB_PC_T.bin", $outfile);
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci    $outfile;
17062306a36Sopenharmony_ci}
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_cisub dec2540t {
17362306a36Sopenharmony_ci    my $sourcefile = "dec217g.exe";
17462306a36Sopenharmony_ci    my $url = "http://hauppauge.lightpath.net/de/$sourcefile";
17562306a36Sopenharmony_ci    my $hash = "53e58f4f5b5c2930beee74a7681fed92";
17662306a36Sopenharmony_ci    my $outfile = "dvb-ttusb-dec-2540t.fw";
17762306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci    checkstandard();
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci    wgetfile($sourcefile, $url);
18262306a36Sopenharmony_ci    unzip($sourcefile, $tmpdir);
18362306a36Sopenharmony_ci    verify("$tmpdir/software/OEM/STB/App/Boot/STB_PC_X.bin", $hash);
18462306a36Sopenharmony_ci    copy("$tmpdir/software/OEM/STB/App/Boot/STB_PC_X.bin", $outfile);
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci    $outfile;
18762306a36Sopenharmony_ci}
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_cisub dec3000s {
19062306a36Sopenharmony_ci    my $sourcefile = "dec217g.exe";
19162306a36Sopenharmony_ci    my $url = "http://hauppauge.lightpath.net/de/$sourcefile";
19262306a36Sopenharmony_ci    my $hash = "b013ececea83f4d6d8d2a29ac7c1b448";
19362306a36Sopenharmony_ci    my $outfile = "dvb-ttusb-dec-3000s.fw";
19462306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci    checkstandard();
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci    wgetfile($sourcefile, $url);
19962306a36Sopenharmony_ci    unzip($sourcefile, $tmpdir);
20062306a36Sopenharmony_ci    verify("$tmpdir/software/OEM/STB/App/Boot/STB_PC_S.bin", $hash);
20162306a36Sopenharmony_ci    copy("$tmpdir/software/OEM/STB/App/Boot/STB_PC_S.bin", $outfile);
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci    $outfile;
20462306a36Sopenharmony_ci}
20562306a36Sopenharmony_cisub opera1{
20662306a36Sopenharmony_ci	my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 0);
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	checkstandard();
20962306a36Sopenharmony_ci	my $fwfile1="dvb-usb-opera1-fpga-01.fw";
21062306a36Sopenharmony_ci	my $fwfile2="dvb-usb-opera-01.fw";
21162306a36Sopenharmony_ci	extract("2830SCap2.sys", 0x62e8, 55024, "$tmpdir/opera1-fpga.fw");
21262306a36Sopenharmony_ci	extract("2830SLoad2.sys",0x3178,0x3685-0x3178,"$tmpdir/fw1part1");
21362306a36Sopenharmony_ci	extract("2830SLoad2.sys",0x0980,0x3150-0x0980,"$tmpdir/fw1part2");
21462306a36Sopenharmony_ci	delzero("$tmpdir/fw1part1","$tmpdir/fw1part1-1");
21562306a36Sopenharmony_ci	delzero("$tmpdir/fw1part2","$tmpdir/fw1part2-1");
21662306a36Sopenharmony_ci	verify("$tmpdir/fw1part1-1","5e0909858fdf0b5b09ad48b9fe622e70");
21762306a36Sopenharmony_ci	verify("$tmpdir/fw1part2-1","d6e146f321427e931df2c6fcadac37a1");
21862306a36Sopenharmony_ci	verify("$tmpdir/opera1-fpga.fw","0f8133f5e9051f5f3c1928f7e5a1b07d");
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	my $RES1="\x01\x92\x7f\x00\x01\x00";
22162306a36Sopenharmony_ci	my $RES0="\x01\x92\x7f\x00\x00\x00";
22262306a36Sopenharmony_ci	my $DAT1="\x01\x00\xe6\x00\x01\x00";
22362306a36Sopenharmony_ci	my $DAT0="\x01\x00\xe6\x00\x00\x00";
22462306a36Sopenharmony_ci	open FW,">$tmpdir/opera.fw";
22562306a36Sopenharmony_ci	print FW "$RES1";
22662306a36Sopenharmony_ci	print FW "$DAT1";
22762306a36Sopenharmony_ci	print FW "$RES1";
22862306a36Sopenharmony_ci	print FW "$DAT1";
22962306a36Sopenharmony_ci	appendfile(FW,"$tmpdir/fw1part1-1");
23062306a36Sopenharmony_ci	print FW "$RES0";
23162306a36Sopenharmony_ci	print FW "$DAT0";
23262306a36Sopenharmony_ci	print FW "$RES1";
23362306a36Sopenharmony_ci	print FW "$DAT1";
23462306a36Sopenharmony_ci	appendfile(FW,"$tmpdir/fw1part2-1");
23562306a36Sopenharmony_ci	print FW "$RES1";
23662306a36Sopenharmony_ci	print FW "$DAT1";
23762306a36Sopenharmony_ci	print FW "$RES0";
23862306a36Sopenharmony_ci	print FW "$DAT0";
23962306a36Sopenharmony_ci	copy ("$tmpdir/opera1-fpga.fw",$fwfile1);
24062306a36Sopenharmony_ci	copy ("$tmpdir/opera.fw",$fwfile2);
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci	$fwfile1.",".$fwfile2;
24362306a36Sopenharmony_ci}
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_cisub vp7041 {
24662306a36Sopenharmony_ci    my $sourcefile = "2.422.zip";
24762306a36Sopenharmony_ci    my $url = "http://www.twinhan.com/files/driver/USB-Ter/$sourcefile";
24862306a36Sopenharmony_ci    my $hash = "e88c9372d1f66609a3e7b072c53fbcfe";
24962306a36Sopenharmony_ci    my $outfile = "dvb-vp7041-2.422.fw";
25062306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci    checkstandard();
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci    wgetfile($sourcefile, $url);
25562306a36Sopenharmony_ci    unzip($sourcefile, $tmpdir);
25662306a36Sopenharmony_ci    extract("$tmpdir/VisionDTV/Drivers/Win2K&XP/UDTTload.sys", 12503, 3036, "$tmpdir/fwtmp1");
25762306a36Sopenharmony_ci    extract("$tmpdir/VisionDTV/Drivers/Win2K&XP/UDTTload.sys", 2207, 10274, "$tmpdir/fwtmp2");
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci    my $CMD = "\000\001\000\222\177\000";
26062306a36Sopenharmony_ci    my $PAD = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000";
26162306a36Sopenharmony_ci    my ($FW);
26262306a36Sopenharmony_ci    open $FW, ">$tmpdir/fwtmp3";
26362306a36Sopenharmony_ci    print $FW "$CMD\001$PAD";
26462306a36Sopenharmony_ci    print $FW "$CMD\001$PAD";
26562306a36Sopenharmony_ci    appendfile($FW, "$tmpdir/fwtmp1");
26662306a36Sopenharmony_ci    print $FW "$CMD\000$PAD";
26762306a36Sopenharmony_ci    print $FW "$CMD\001$PAD";
26862306a36Sopenharmony_ci    appendfile($FW, "$tmpdir/fwtmp2");
26962306a36Sopenharmony_ci    print $FW "$CMD\001$PAD";
27062306a36Sopenharmony_ci    print $FW "$CMD\000$PAD";
27162306a36Sopenharmony_ci    close($FW);
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci    verify("$tmpdir/fwtmp3", $hash);
27462306a36Sopenharmony_ci    copy("$tmpdir/fwtmp3", $outfile);
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ci    $outfile;
27762306a36Sopenharmony_ci}
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_cisub vp7049 {
28062306a36Sopenharmony_ci    my $fwfile = "dvb-usb-vp7049-0.95.fw";
28162306a36Sopenharmony_ci    my $url = "http://ao2.it/sites/default/files/blog/2012/11/06/linux-support-digicom-digitune-s-vp7049-udtt7049/$fwfile";
28262306a36Sopenharmony_ci    my $hash = "5609fd295168aea88b25ff43a6f79c36";
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci    checkstandard();
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci    wgetfile($fwfile, $url);
28762306a36Sopenharmony_ci    verify($fwfile, $hash);
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_ci    $fwfile;
29062306a36Sopenharmony_ci}
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_cisub dibusb {
29362306a36Sopenharmony_ci	my $url = "https://linuxtv.org/downloads/firmware/dvb-usb-dibusb-5.0.0.11.fw";
29462306a36Sopenharmony_ci	my $outfile = "dvb-dibusb-5.0.0.11.fw";
29562306a36Sopenharmony_ci	my $hash = "fa490295a527360ca16dcdf3224ca243";
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci	checkstandard();
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ci	wgetfile($outfile, $url);
30062306a36Sopenharmony_ci	verify($outfile,$hash);
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	$outfile;
30362306a36Sopenharmony_ci}
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_cisub nxt2002 {
30662306a36Sopenharmony_ci    my $sourcefile = "Technisat_DVB-PC_4_4_COMPACT.zip";
30762306a36Sopenharmony_ci    my $url = "http://www.bbti.us/download/windows/$sourcefile";
30862306a36Sopenharmony_ci    my $hash = "476befae8c7c1bb9648954060b1eec1f";
30962306a36Sopenharmony_ci    my $outfile = "dvb-fe-nxt2002.fw";
31062306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci    checkstandard();
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci    wgetfile($sourcefile, $url);
31562306a36Sopenharmony_ci    unzip($sourcefile, $tmpdir);
31662306a36Sopenharmony_ci    verify("$tmpdir/SkyNET.sys", $hash);
31762306a36Sopenharmony_ci    extract("$tmpdir/SkyNET.sys", 331624, 5908, $outfile);
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci    $outfile;
32062306a36Sopenharmony_ci}
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_cisub nxt2004 {
32362306a36Sopenharmony_ci    my $sourcefile = "AVerTVHD_MCE_A180_Drv_v1.2.2.16.zip";
32462306a36Sopenharmony_ci    my $url = "http://www.avermedia-usa.com/support/Drivers/$sourcefile";
32562306a36Sopenharmony_ci    my $hash = "111cb885b1e009188346d72acfed024c";
32662306a36Sopenharmony_ci    my $outfile = "dvb-fe-nxt2004.fw";
32762306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci    checkstandard();
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ci    wgetfile($sourcefile, $url);
33262306a36Sopenharmony_ci    unzip($sourcefile, $tmpdir);
33362306a36Sopenharmony_ci    verify("$tmpdir/3xHybrid.sys", $hash);
33462306a36Sopenharmony_ci    extract("$tmpdir/3xHybrid.sys", 465304, 9584, $outfile);
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ci    $outfile;
33762306a36Sopenharmony_ci}
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_cisub or51211 {
34062306a36Sopenharmony_ci    my $fwfile = "dvb-fe-or51211.fw";
34162306a36Sopenharmony_ci    my $url = "https://linuxtv.org/downloads/firmware/$fwfile";
34262306a36Sopenharmony_ci    my $hash = "d830949c771a289505bf9eafc225d491";
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci    checkstandard();
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ci    wgetfile($fwfile, $url);
34762306a36Sopenharmony_ci    verify($fwfile, $hash);
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci    $fwfile;
35062306a36Sopenharmony_ci}
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_cisub cx231xx {
35362306a36Sopenharmony_ci    my $fwfile = "v4l-cx231xx-avcore-01.fw";
35462306a36Sopenharmony_ci    my $url = "https://linuxtv.org/downloads/firmware/$fwfile";
35562306a36Sopenharmony_ci    my $hash = "7d3bb956dc9df0eafded2b56ba57cc42";
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ci    checkstandard();
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci    wgetfile($fwfile, $url);
36062306a36Sopenharmony_ci    verify($fwfile, $hash);
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci    $fwfile;
36362306a36Sopenharmony_ci}
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_cisub cx18 {
36662306a36Sopenharmony_ci    my $url = "https://linuxtv.org/downloads/firmware/";
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ci    my %files = (
36962306a36Sopenharmony_ci	'v4l-cx23418-apu.fw' => '588f081b562f5c653a3db1ad8f65939a',
37062306a36Sopenharmony_ci	'v4l-cx23418-cpu.fw' => 'b6c7ed64bc44b1a6e0840adaeac39d79',
37162306a36Sopenharmony_ci	'v4l-cx23418-dig.fw' => '95bc688d3e7599fd5800161e9971cc55',
37262306a36Sopenharmony_ci    );
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ci    checkstandard();
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci    my $allfiles;
37762306a36Sopenharmony_ci    foreach my $fwfile (keys %files) {
37862306a36Sopenharmony_ci	wgetfile($fwfile, "$url/$fwfile");
37962306a36Sopenharmony_ci	verify($fwfile, $files{$fwfile});
38062306a36Sopenharmony_ci	$allfiles .= " $fwfile";
38162306a36Sopenharmony_ci    }
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci    $allfiles =~ s/^\s//;
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci    $allfiles;
38662306a36Sopenharmony_ci}
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_cisub mpc718 {
38962306a36Sopenharmony_ci    my $archive = 'Yuan MPC718 TV Tuner Card 2.13.10.1016.zip';
39062306a36Sopenharmony_ci    my $url = "ftp://ftp.work.acer-euro.com/desktop/aspire_idea510/vista/Drivers/$archive";
39162306a36Sopenharmony_ci    my $fwfile = "dvb-cx18-mpc718-mt352.fw";
39262306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci    checkstandard();
39562306a36Sopenharmony_ci    wgetfile($archive, $url);
39662306a36Sopenharmony_ci    unzip($archive, $tmpdir);
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci    my $sourcefile = "$tmpdir/Yuan MPC718 TV Tuner Card 2.13.10.1016/mpc718_32bit/yuanrap.sys";
39962306a36Sopenharmony_ci    my $found = 0;
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_ci    open IN, '<', $sourcefile or die "Couldn't open $sourcefile to extract $fwfile data\n";
40262306a36Sopenharmony_ci    binmode IN;
40362306a36Sopenharmony_ci    open OUT, '>', $fwfile;
40462306a36Sopenharmony_ci    binmode OUT;
40562306a36Sopenharmony_ci    {
40662306a36Sopenharmony_ci	# Block scope because we change the line terminator variable $/
40762306a36Sopenharmony_ci	my $prevlen = 0;
40862306a36Sopenharmony_ci	my $currlen;
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_ci	# Buried in the data segment are 3 runs of almost identical
41162306a36Sopenharmony_ci	# register-value pairs that end in 0x5d 0x01 which is a "TUNER GO"
41262306a36Sopenharmony_ci	# command for the MT352.
41362306a36Sopenharmony_ci	# Pull out the middle run (because it's easy) of register-value
41462306a36Sopenharmony_ci	# pairs to make the "firmware" file.
41562306a36Sopenharmony_ci
41662306a36Sopenharmony_ci	local $/ = "\x5d\x01"; # MT352 "TUNER GO"
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_ci	while (<IN>) {
41962306a36Sopenharmony_ci	    $currlen = length($_);
42062306a36Sopenharmony_ci	    if ($prevlen == $currlen && $currlen <= 64) {
42162306a36Sopenharmony_ci		chop; chop; # Get rid of "TUNER GO"
42262306a36Sopenharmony_ci		s/^\0\0//;  # get rid of leading 00 00 if it's there
42362306a36Sopenharmony_ci		printf OUT "$_";
42462306a36Sopenharmony_ci		$found = 1;
42562306a36Sopenharmony_ci		last;
42662306a36Sopenharmony_ci	    }
42762306a36Sopenharmony_ci	    $prevlen = $currlen;
42862306a36Sopenharmony_ci	}
42962306a36Sopenharmony_ci    }
43062306a36Sopenharmony_ci    close OUT;
43162306a36Sopenharmony_ci    close IN;
43262306a36Sopenharmony_ci    if (!$found) {
43362306a36Sopenharmony_ci	unlink $fwfile;
43462306a36Sopenharmony_ci	die "Couldn't find valid register-value sequence in $sourcefile for $fwfile\n";
43562306a36Sopenharmony_ci    }
43662306a36Sopenharmony_ci    $fwfile;
43762306a36Sopenharmony_ci}
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_cisub cx23885 {
44062306a36Sopenharmony_ci    my $url = "https://linuxtv.org/downloads/firmware/";
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_ci    my %files = (
44362306a36Sopenharmony_ci	'v4l-cx23885-avcore-01.fw' => 'a9f8f5d901a7fb42f552e1ee6384f3bb',
44462306a36Sopenharmony_ci	'v4l-cx23885-enc.fw'       => 'a9f8f5d901a7fb42f552e1ee6384f3bb',
44562306a36Sopenharmony_ci    );
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_ci    checkstandard();
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_ci    my $allfiles;
45062306a36Sopenharmony_ci    foreach my $fwfile (keys %files) {
45162306a36Sopenharmony_ci	wgetfile($fwfile, "$url/$fwfile");
45262306a36Sopenharmony_ci	verify($fwfile, $files{$fwfile});
45362306a36Sopenharmony_ci	$allfiles .= " $fwfile";
45462306a36Sopenharmony_ci    }
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_ci    $allfiles =~ s/^\s//;
45762306a36Sopenharmony_ci
45862306a36Sopenharmony_ci    $allfiles;
45962306a36Sopenharmony_ci}
46062306a36Sopenharmony_ci
46162306a36Sopenharmony_cisub pvrusb2 {
46262306a36Sopenharmony_ci    my $url = "https://linuxtv.org/downloads/firmware/";
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci    my %files = (
46562306a36Sopenharmony_ci	'v4l-cx25840.fw'           => 'dadb79e9904fc8af96e8111d9cb59320',
46662306a36Sopenharmony_ci    );
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_ci    checkstandard();
46962306a36Sopenharmony_ci
47062306a36Sopenharmony_ci    my $allfiles;
47162306a36Sopenharmony_ci    foreach my $fwfile (keys %files) {
47262306a36Sopenharmony_ci	wgetfile($fwfile, "$url/$fwfile");
47362306a36Sopenharmony_ci	verify($fwfile, $files{$fwfile});
47462306a36Sopenharmony_ci	$allfiles .= " $fwfile";
47562306a36Sopenharmony_ci    }
47662306a36Sopenharmony_ci
47762306a36Sopenharmony_ci    $allfiles =~ s/^\s//;
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci    $allfiles;
48062306a36Sopenharmony_ci}
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_cisub or51132_qam {
48362306a36Sopenharmony_ci    my $fwfile = "dvb-fe-or51132-qam.fw";
48462306a36Sopenharmony_ci    my $url = "https://linuxtv.org/downloads/firmware/$fwfile";
48562306a36Sopenharmony_ci    my $hash = "7702e8938612de46ccadfe9b413cb3b5";
48662306a36Sopenharmony_ci
48762306a36Sopenharmony_ci    checkstandard();
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_ci    wgetfile($fwfile, $url);
49062306a36Sopenharmony_ci    verify($fwfile, $hash);
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ci    $fwfile;
49362306a36Sopenharmony_ci}
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_cisub or51132_vsb {
49662306a36Sopenharmony_ci    my $fwfile = "dvb-fe-or51132-vsb.fw";
49762306a36Sopenharmony_ci    my $url = "https://linuxtv.org/downloads/firmware/$fwfile";
49862306a36Sopenharmony_ci    my $hash = "c16208e02f36fc439a557ad4c613364a";
49962306a36Sopenharmony_ci
50062306a36Sopenharmony_ci    checkstandard();
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_ci    wgetfile($fwfile, $url);
50362306a36Sopenharmony_ci    verify($fwfile, $hash);
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci    $fwfile;
50662306a36Sopenharmony_ci}
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_cisub bluebird {
50962306a36Sopenharmony_ci	my $url = "https://linuxtv.org/download/dvb/firmware/dvb-usb-bluebird-01.fw";
51062306a36Sopenharmony_ci	my $outfile = "dvb-usb-bluebird-01.fw";
51162306a36Sopenharmony_ci	my $hash = "658397cb9eba9101af9031302671f49d";
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci	checkstandard();
51462306a36Sopenharmony_ci
51562306a36Sopenharmony_ci	wgetfile($outfile, $url);
51662306a36Sopenharmony_ci	verify($outfile,$hash);
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_ci	$outfile;
51962306a36Sopenharmony_ci}
52062306a36Sopenharmony_ci
52162306a36Sopenharmony_cisub af9015 {
52262306a36Sopenharmony_ci	my $sourcefile = "download.ashx?file=57";
52362306a36Sopenharmony_ci	my $url = "http://www.ite.com.tw/EN/Services/$sourcefile";
52462306a36Sopenharmony_ci	my $hash = "e3f08935158038d385ad382442f4bb2d";
52562306a36Sopenharmony_ci	my $outfile = "dvb-usb-af9015.fw";
52662306a36Sopenharmony_ci	my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
52762306a36Sopenharmony_ci	my $fwoffset = 0x25690;
52862306a36Sopenharmony_ci	my $fwlength = 18725;
52962306a36Sopenharmony_ci	my ($chunklength, $buf, $rcount);
53062306a36Sopenharmony_ci
53162306a36Sopenharmony_ci	checkstandard();
53262306a36Sopenharmony_ci
53362306a36Sopenharmony_ci	wgetfile($sourcefile, $url);
53462306a36Sopenharmony_ci	unzip($sourcefile, $tmpdir);
53562306a36Sopenharmony_ci	verify("$tmpdir/Driver/Files/AF15BDA.sys", $hash);
53662306a36Sopenharmony_ci
53762306a36Sopenharmony_ci	open INFILE, '<', "$tmpdir/Driver/Files/AF15BDA.sys";
53862306a36Sopenharmony_ci	open OUTFILE, '>', $outfile;
53962306a36Sopenharmony_ci
54062306a36Sopenharmony_ci	sysseek(INFILE, $fwoffset, SEEK_SET);
54162306a36Sopenharmony_ci	while($fwlength > 0) {
54262306a36Sopenharmony_ci		$chunklength = 55;
54362306a36Sopenharmony_ci		$chunklength = $fwlength if ($chunklength > $fwlength);
54462306a36Sopenharmony_ci		$rcount = sysread(INFILE, $buf, $chunklength);
54562306a36Sopenharmony_ci		die "Ran out of data\n" if ($rcount != $chunklength);
54662306a36Sopenharmony_ci		syswrite(OUTFILE, $buf);
54762306a36Sopenharmony_ci		sysread(INFILE, $buf, 8);
54862306a36Sopenharmony_ci		$fwlength -= $rcount + 8;
54962306a36Sopenharmony_ci	}
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_ci	close OUTFILE;
55262306a36Sopenharmony_ci	close INFILE;
55362306a36Sopenharmony_ci}
55462306a36Sopenharmony_ci
55562306a36Sopenharmony_cisub ngene {
55662306a36Sopenharmony_ci    my $url = "http://www.digitaldevices.de/download/";
55762306a36Sopenharmony_ci    my $file1 = "ngene_15.fw";
55862306a36Sopenharmony_ci    my $hash1 = "d798d5a757121174f0dbc5f2833c0c85";
55962306a36Sopenharmony_ci    my $file2 = "ngene_17.fw";
56062306a36Sopenharmony_ci    my $hash2 = "26b687136e127b8ac24b81e0eeafc20b";
56162306a36Sopenharmony_ci    my $url2 = "http://l4m-daten.de/downloads/firmware/dvb-s2/linux/all/";
56262306a36Sopenharmony_ci    my $file3 = "ngene_18.fw";
56362306a36Sopenharmony_ci    my $hash3 = "ebce3ea769a53e3e0b0197c3b3f127e3";
56462306a36Sopenharmony_ci
56562306a36Sopenharmony_ci    checkstandard();
56662306a36Sopenharmony_ci
56762306a36Sopenharmony_ci    wgetfile($file1, $url . $file1);
56862306a36Sopenharmony_ci    verify($file1, $hash1);
56962306a36Sopenharmony_ci
57062306a36Sopenharmony_ci    wgetfile($file2, $url . $file2);
57162306a36Sopenharmony_ci    verify($file2, $hash2);
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_ci    wgetfile($file3, $url2 . $file3);
57462306a36Sopenharmony_ci    verify($file3, $hash3);
57562306a36Sopenharmony_ci
57662306a36Sopenharmony_ci    "$file1, $file2, $file3";
57762306a36Sopenharmony_ci}
57862306a36Sopenharmony_ci
57962306a36Sopenharmony_cisub az6027{
58062306a36Sopenharmony_ci    my $firmware = "dvb-usb-az6027-03.fw";
58162306a36Sopenharmony_ci    my $url = "http://linux.terratec.de/files/TERRATEC_S7/$firmware";
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_ci    wgetfile($firmware, $url);
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_ci    $firmware;
58662306a36Sopenharmony_ci}
58762306a36Sopenharmony_ci
58862306a36Sopenharmony_cisub lme2510_lg {
58962306a36Sopenharmony_ci    my $sourcefile = "LMEBDA_DVBS.sys";
59062306a36Sopenharmony_ci    my $hash = "fc6017ad01e79890a97ec53bea157ed2";
59162306a36Sopenharmony_ci    my $outfile = "dvb-usb-lme2510-lg.fw";
59262306a36Sopenharmony_ci    my $hasho = "caa065d5fdbd2c09ad57b399bbf55cad";
59362306a36Sopenharmony_ci
59462306a36Sopenharmony_ci    checkstandard();
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci    verify($sourcefile, $hash);
59762306a36Sopenharmony_ci    extract($sourcefile, 4168, 3841, $outfile);
59862306a36Sopenharmony_ci    verify($outfile, $hasho);
59962306a36Sopenharmony_ci    $outfile;
60062306a36Sopenharmony_ci}
60162306a36Sopenharmony_ci
60262306a36Sopenharmony_cisub lme2510c_s7395 {
60362306a36Sopenharmony_ci    my $sourcefile = "US2A0D.sys";
60462306a36Sopenharmony_ci    my $hash = "b0155a8083fb822a3bd47bc360e74601";
60562306a36Sopenharmony_ci    my $outfile = "dvb-usb-lme2510c-s7395.fw";
60662306a36Sopenharmony_ci    my $hasho = "3a3cf1aeebd17b6ddc04cebe131e94cf";
60762306a36Sopenharmony_ci
60862306a36Sopenharmony_ci    checkstandard();
60962306a36Sopenharmony_ci
61062306a36Sopenharmony_ci    verify($sourcefile, $hash);
61162306a36Sopenharmony_ci    extract($sourcefile, 37248, 3720, $outfile);
61262306a36Sopenharmony_ci    verify($outfile, $hasho);
61362306a36Sopenharmony_ci    $outfile;
61462306a36Sopenharmony_ci}
61562306a36Sopenharmony_ci
61662306a36Sopenharmony_cisub lme2510c_s7395_old {
61762306a36Sopenharmony_ci    my $sourcefile = "LMEBDA_DVBS7395C.sys";
61862306a36Sopenharmony_ci    my $hash = "7572ae0eb9cdf91baabd7c0ba9e09b31";
61962306a36Sopenharmony_ci    my $outfile = "dvb-usb-lme2510c-s7395.fw";
62062306a36Sopenharmony_ci    my $hasho = "90430c5b435eb5c6f88fd44a9d950674";
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_ci    checkstandard();
62362306a36Sopenharmony_ci
62462306a36Sopenharmony_ci    verify($sourcefile, $hash);
62562306a36Sopenharmony_ci    extract($sourcefile, 4208, 3881, $outfile);
62662306a36Sopenharmony_ci    verify($outfile, $hasho);
62762306a36Sopenharmony_ci    $outfile;
62862306a36Sopenharmony_ci}
62962306a36Sopenharmony_ci
63062306a36Sopenharmony_cisub drxk {
63162306a36Sopenharmony_ci    my $url = "http://l4m-daten.de/files/";
63262306a36Sopenharmony_ci    my $zipfile = "DDTuner.zip";
63362306a36Sopenharmony_ci    my $hash = "f5a37b9a20a3534997997c0b1382a3e5";
63462306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
63562306a36Sopenharmony_ci    my $drvfile = "DDTuner.sys";
63662306a36Sopenharmony_ci    my $fwfile = "drxk_a3.mc";
63762306a36Sopenharmony_ci
63862306a36Sopenharmony_ci    checkstandard();
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_ci    wgetfile($zipfile, $url . $zipfile);
64162306a36Sopenharmony_ci    verify($zipfile, $hash);
64262306a36Sopenharmony_ci    unzip($zipfile, $tmpdir);
64362306a36Sopenharmony_ci    extract("$tmpdir/$drvfile", 0x14dd8, 15634, "$fwfile");
64462306a36Sopenharmony_ci
64562306a36Sopenharmony_ci    "$fwfile"
64662306a36Sopenharmony_ci}
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_cisub drxk_hauppauge_hvr930c {
64962306a36Sopenharmony_ci    my $url = "http://www.wintvcd.co.uk/drivers/";
65062306a36Sopenharmony_ci    my $zipfile = "HVR-9x0_5_10_325_28153_SIGNED.zip";
65162306a36Sopenharmony_ci    my $hash = "83ab82e7e9480ec8bf1ae0155ca63c88";
65262306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
65362306a36Sopenharmony_ci    my $drvfile = "HVR-900/emOEM.sys";
65462306a36Sopenharmony_ci    my $fwfile = "dvb-usb-hauppauge-hvr930c-drxk.fw";
65562306a36Sopenharmony_ci
65662306a36Sopenharmony_ci    checkstandard();
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_ci    wgetfile($zipfile, $url . $zipfile);
65962306a36Sopenharmony_ci    verify($zipfile, $hash);
66062306a36Sopenharmony_ci    unzip($zipfile, $tmpdir);
66162306a36Sopenharmony_ci    extract("$tmpdir/$drvfile", 0x117b0, 42692, "$fwfile");
66262306a36Sopenharmony_ci
66362306a36Sopenharmony_ci    "$fwfile"
66462306a36Sopenharmony_ci}
66562306a36Sopenharmony_ci
66662306a36Sopenharmony_cisub drxk_terratec_h5 {
66762306a36Sopenharmony_ci    my $url = "https://linuxtv.org/downloads/firmware/";
66862306a36Sopenharmony_ci    my $hash = "19000dada8e2741162ccc50cc91fa7f1";
66962306a36Sopenharmony_ci    my $fwfile = "dvb-usb-terratec-h5-drxk.fw";
67062306a36Sopenharmony_ci
67162306a36Sopenharmony_ci    checkstandard();
67262306a36Sopenharmony_ci
67362306a36Sopenharmony_ci    wgetfile($fwfile, $url . $fwfile);
67462306a36Sopenharmony_ci    verify($fwfile, $hash);
67562306a36Sopenharmony_ci
67662306a36Sopenharmony_ci    "$fwfile"
67762306a36Sopenharmony_ci}
67862306a36Sopenharmony_ci
67962306a36Sopenharmony_cisub drxk_terratec_htc_stick {
68062306a36Sopenharmony_ci    my $url = "http://ftp.terratec.de/Receiver/Cinergy_HTC_Stick/Updates/History/";
68162306a36Sopenharmony_ci    my $zipfile = "Cinergy_HTC_Stick_Drv_5.09.1202.00_XP_Vista_7.exe";
68262306a36Sopenharmony_ci    my $hash = "6722a2442a05423b781721fbc069ed5e";
68362306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 0);
68462306a36Sopenharmony_ci    my $drvfile = "Cinergy HTC Stick/BDA Driver 5.09.1202.00/Windows 32 Bit/emOEM.sys";
68562306a36Sopenharmony_ci    my $fwfile = "dvb-usb-terratec-htc-stick-drxk.fw";
68662306a36Sopenharmony_ci
68762306a36Sopenharmony_ci    checkstandard();
68862306a36Sopenharmony_ci
68962306a36Sopenharmony_ci    wgetfile($zipfile, $url . $zipfile);
69062306a36Sopenharmony_ci    verify($zipfile, $hash);
69162306a36Sopenharmony_ci    unzip($zipfile, $tmpdir);
69262306a36Sopenharmony_ci    extract("$tmpdir/$drvfile", 0x4e5c0, 42692, "$fwfile");
69362306a36Sopenharmony_ci
69462306a36Sopenharmony_ci    "$fwfile"
69562306a36Sopenharmony_ci}
69662306a36Sopenharmony_ci
69762306a36Sopenharmony_cisub it9135 {
69862306a36Sopenharmony_ci	my $url = "http://www.ite.com.tw/uploads/firmware/v3.25.0.0/";
69962306a36Sopenharmony_ci	my $file1 = "dvb-usb-it9135-01.zip";
70062306a36Sopenharmony_ci	my $fwfile1 = "dvb-usb-it9135-01.fw";
70162306a36Sopenharmony_ci	my $hash1 = "02fcf11174eda84745dae7e61c5ff9ba";
70262306a36Sopenharmony_ci	my $file2 = "dvb-usb-it9135-02.zip";
70362306a36Sopenharmony_ci	my $fwfile2 = "dvb-usb-it9135-02.fw";
70462306a36Sopenharmony_ci	my $hash2 = "d5e1437dc24358578e07999475d4cac9";
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_ci	checkstandard();
70762306a36Sopenharmony_ci
70862306a36Sopenharmony_ci	wgetfile($file1, $url . $file1);
70962306a36Sopenharmony_ci	unzip($file1, "");
71062306a36Sopenharmony_ci	verify("$fwfile1", $hash1);
71162306a36Sopenharmony_ci
71262306a36Sopenharmony_ci	wgetfile($file2, $url . $file2);
71362306a36Sopenharmony_ci	unzip($file2, "");
71462306a36Sopenharmony_ci	verify("$fwfile2", $hash2);
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci	"$file1 $file2"
71762306a36Sopenharmony_ci}
71862306a36Sopenharmony_ci
71962306a36Sopenharmony_cisub tda10071 {
72062306a36Sopenharmony_ci    my $sourcefile = "PCTV_460e_reference.zip";
72162306a36Sopenharmony_ci    my $url = "ftp://ftp.pctvsystems.com/TV/driver/PCTV%2070e%2080e%20100e%20320e%20330e%20800e/";
72262306a36Sopenharmony_ci    my $hash = "4403de903bf2593464c8d74bbc200a57";
72362306a36Sopenharmony_ci    my $fwfile = "dvb-fe-tda10071.fw";
72462306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
72562306a36Sopenharmony_ci
72662306a36Sopenharmony_ci    checkstandard();
72762306a36Sopenharmony_ci
72862306a36Sopenharmony_ci    wgetfile($sourcefile, $url . $sourcefile);
72962306a36Sopenharmony_ci    verify($sourcefile, $hash);
73062306a36Sopenharmony_ci    unzip($sourcefile, $tmpdir);
73162306a36Sopenharmony_ci    extract("$tmpdir/PCTV\ 70e\ 80e\ 100e\ 320e\ 330e\ 800e/32\ bit/emOEM.sys", 0x67d38, 40504, $fwfile);
73262306a36Sopenharmony_ci
73362306a36Sopenharmony_ci    "$fwfile";
73462306a36Sopenharmony_ci}
73562306a36Sopenharmony_ci
73662306a36Sopenharmony_cisub drxk_pctv {
73762306a36Sopenharmony_ci    my $sourcefile = "PCTV_460e_reference.zip";
73862306a36Sopenharmony_ci    my $url = "ftp://ftp.pctvsystems.com/TV/driver/PCTV%2070e%2080e%20100e%20320e%20330e%20800e/";
73962306a36Sopenharmony_ci    my $hash = "4403de903bf2593464c8d74bbc200a57";
74062306a36Sopenharmony_ci    my $fwfile = "dvb-demod-drxk-pctv.fw";
74162306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
74262306a36Sopenharmony_ci
74362306a36Sopenharmony_ci    checkstandard();
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_ci    wgetfile($sourcefile, $url . $sourcefile);
74662306a36Sopenharmony_ci    verify($sourcefile, $hash);
74762306a36Sopenharmony_ci    unzip($sourcefile, $tmpdir);
74862306a36Sopenharmony_ci    extract("$tmpdir/PCTV\ 70e\ 80e\ 100e\ 320e\ 330e\ 800e/32\ bit/emOEM.sys", 0x72b80, 42692, $fwfile);
74962306a36Sopenharmony_ci
75062306a36Sopenharmony_ci    "$fwfile";
75162306a36Sopenharmony_ci}
75262306a36Sopenharmony_ci
75362306a36Sopenharmony_cisub sms1xxx_hcw {
75462306a36Sopenharmony_ci    my $url = "http://steventoth.net/linux/sms1xxx/";
75562306a36Sopenharmony_ci    my %files = (
75662306a36Sopenharmony_ci	'sms1xxx-hcw-55xxx-dvbt-01.fw'  => "afb6f9fb9a71d64392e8564ef9577e5a",
75762306a36Sopenharmony_ci	'sms1xxx-hcw-55xxx-dvbt-02.fw'  => "b44807098ba26e52cbedeadc052ba58f",
75862306a36Sopenharmony_ci	'sms1xxx-hcw-55xxx-isdbt-02.fw' => "dae934eeea85225acbd63ce6cfe1c9e4",
75962306a36Sopenharmony_ci    );
76062306a36Sopenharmony_ci
76162306a36Sopenharmony_ci    checkstandard();
76262306a36Sopenharmony_ci
76362306a36Sopenharmony_ci    my $allfiles;
76462306a36Sopenharmony_ci    foreach my $fwfile (keys %files) {
76562306a36Sopenharmony_ci	wgetfile($fwfile, "$url/$fwfile");
76662306a36Sopenharmony_ci	verify($fwfile, $files{$fwfile});
76762306a36Sopenharmony_ci	$allfiles .= " $fwfile";
76862306a36Sopenharmony_ci    }
76962306a36Sopenharmony_ci
77062306a36Sopenharmony_ci    $allfiles =~ s/^\s//;
77162306a36Sopenharmony_ci
77262306a36Sopenharmony_ci    $allfiles;
77362306a36Sopenharmony_ci}
77462306a36Sopenharmony_ci
77562306a36Sopenharmony_cisub si2165 {
77662306a36Sopenharmony_ci    my $sourcefile = "model_111xxx_122xxx_driver_6_0_119_31191_WHQL.zip";
77762306a36Sopenharmony_ci    my $url = "http://www.hauppauge.de/files/drivers/";
77862306a36Sopenharmony_ci    my $hash = "76633e7c76b0edee47c3ba18ded99336";
77962306a36Sopenharmony_ci    my $fwfile = "dvb-demod-si2165.fw";
78062306a36Sopenharmony_ci    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
78162306a36Sopenharmony_ci
78262306a36Sopenharmony_ci    checkstandard();
78362306a36Sopenharmony_ci
78462306a36Sopenharmony_ci    wgetfile($sourcefile, $url . $sourcefile);
78562306a36Sopenharmony_ci    verify($sourcefile, $hash);
78662306a36Sopenharmony_ci    unzip($sourcefile, $tmpdir);
78762306a36Sopenharmony_ci    extract("$tmpdir/Driver10/Hcw10bda.sys", 0x80788, 0x81E08-0x80788, "$tmpdir/fw1");
78862306a36Sopenharmony_ci
78962306a36Sopenharmony_ci    delzero("$tmpdir/fw1","$tmpdir/fw1-1");
79062306a36Sopenharmony_ci    #verify("$tmpdir/fw1","5e0909858fdf0b5b09ad48b9fe622e70");
79162306a36Sopenharmony_ci
79262306a36Sopenharmony_ci    my $CRC="\x0A\xCC";
79362306a36Sopenharmony_ci    my $BLOCKS_MAIN="\x27";
79462306a36Sopenharmony_ci    open FW,">$fwfile";
79562306a36Sopenharmony_ci    print FW "\x01\x00"; # just a version id for the driver itself
79662306a36Sopenharmony_ci    print FW "\x9A"; # fw version
79762306a36Sopenharmony_ci    print FW "\x00"; # padding
79862306a36Sopenharmony_ci    print FW "$BLOCKS_MAIN"; # number of blocks of main part
79962306a36Sopenharmony_ci    print FW "\x00"; # padding
80062306a36Sopenharmony_ci    print FW "$CRC"; # 16bit crc value of main part
80162306a36Sopenharmony_ci    appendfile(FW,"$tmpdir/fw1");
80262306a36Sopenharmony_ci
80362306a36Sopenharmony_ci    "$fwfile";
80462306a36Sopenharmony_ci}
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_ci# ---------------------------------------------------------------
80762306a36Sopenharmony_ci# Utilities
80862306a36Sopenharmony_ci
80962306a36Sopenharmony_cisub checkstandard {
81062306a36Sopenharmony_ci    if (system("which unzip > /dev/null 2>&1")) {
81162306a36Sopenharmony_ci	die "This firmware requires the unzip command - see ftp://ftp.info-zip.org/pub/infozip/UnZip.html\n";
81262306a36Sopenharmony_ci    }
81362306a36Sopenharmony_ci    if (system("which md5sum > /dev/null 2>&1")) {
81462306a36Sopenharmony_ci	die "This firmware requires the md5sum command - see http://www.gnu.org/software/coreutils/\n";
81562306a36Sopenharmony_ci    }
81662306a36Sopenharmony_ci    if (system("which wget > /dev/null 2>&1")) {
81762306a36Sopenharmony_ci	die "This firmware requires the wget command - see http://wget.sunsite.dk/\n";
81862306a36Sopenharmony_ci    }
81962306a36Sopenharmony_ci}
82062306a36Sopenharmony_ci
82162306a36Sopenharmony_cisub checkunshield {
82262306a36Sopenharmony_ci    if (system("which unshield > /dev/null 2>&1")) {
82362306a36Sopenharmony_ci	die "This firmware requires the unshield command - see http://sourceforge.net/projects/synce/\n";
82462306a36Sopenharmony_ci    }
82562306a36Sopenharmony_ci}
82662306a36Sopenharmony_ci
82762306a36Sopenharmony_cisub wgetfile {
82862306a36Sopenharmony_ci    my ($sourcefile, $url) = @_;
82962306a36Sopenharmony_ci
83062306a36Sopenharmony_ci    if (! -f $sourcefile) {
83162306a36Sopenharmony_ci	system("wget -O \"$sourcefile\" \"$url\"") and die "wget failed - unable to download firmware";
83262306a36Sopenharmony_ci    }
83362306a36Sopenharmony_ci}
83462306a36Sopenharmony_ci
83562306a36Sopenharmony_cisub unzip {
83662306a36Sopenharmony_ci    my ($sourcefile, $todir) = @_;
83762306a36Sopenharmony_ci
83862306a36Sopenharmony_ci    $status = system("unzip -q -o -d \"$todir\" \"$sourcefile\" 2>/dev/null" );
83962306a36Sopenharmony_ci    if ((($status >> 8) > 2) || (($status & 0xff) != 0)) {
84062306a36Sopenharmony_ci	die ("unzip failed - unable to extract firmware");
84162306a36Sopenharmony_ci    }
84262306a36Sopenharmony_ci}
84362306a36Sopenharmony_ci
84462306a36Sopenharmony_cisub unshield {
84562306a36Sopenharmony_ci    my ($sourcefile, $todir) = @_;
84662306a36Sopenharmony_ci
84762306a36Sopenharmony_ci    system("unshield x -d \"$todir\" \"$sourcefile\" > /dev/null" ) and die ("unshield failed - unable to extract firmware");
84862306a36Sopenharmony_ci}
84962306a36Sopenharmony_ci
85062306a36Sopenharmony_cisub verify {
85162306a36Sopenharmony_ci    my ($filename, $hash) = @_;
85262306a36Sopenharmony_ci    my ($testhash);
85362306a36Sopenharmony_ci
85462306a36Sopenharmony_ci    open(CMD, "md5sum \"$filename\"|");
85562306a36Sopenharmony_ci    $testhash = <CMD>;
85662306a36Sopenharmony_ci    $testhash =~ /([a-zA-Z0-9]*)/;
85762306a36Sopenharmony_ci    $testhash = $1;
85862306a36Sopenharmony_ci    close CMD;
85962306a36Sopenharmony_ci    die "Hash of extracted file does not match!\n" if ($testhash ne $hash);
86062306a36Sopenharmony_ci}
86162306a36Sopenharmony_ci
86262306a36Sopenharmony_cisub copy {
86362306a36Sopenharmony_ci    my ($from, $to) = @_;
86462306a36Sopenharmony_ci
86562306a36Sopenharmony_ci    system("cp -f \"$from\" \"$to\"") and die ("cp failed");
86662306a36Sopenharmony_ci}
86762306a36Sopenharmony_ci
86862306a36Sopenharmony_cisub extract {
86962306a36Sopenharmony_ci    my ($infile, $offset, $length, $outfile) = @_;
87062306a36Sopenharmony_ci    my ($chunklength, $buf, $rcount);
87162306a36Sopenharmony_ci
87262306a36Sopenharmony_ci    open INFILE, "<$infile";
87362306a36Sopenharmony_ci    open OUTFILE, ">$outfile";
87462306a36Sopenharmony_ci    sysseek(INFILE, $offset, SEEK_SET);
87562306a36Sopenharmony_ci    while($length > 0) {
87662306a36Sopenharmony_ci	# Calc chunk size
87762306a36Sopenharmony_ci	$chunklength = 2048;
87862306a36Sopenharmony_ci	$chunklength = $length if ($chunklength > $length);
87962306a36Sopenharmony_ci
88062306a36Sopenharmony_ci	$rcount = sysread(INFILE, $buf, $chunklength);
88162306a36Sopenharmony_ci	die "Ran out of data\n" if ($rcount != $chunklength);
88262306a36Sopenharmony_ci	syswrite(OUTFILE, $buf);
88362306a36Sopenharmony_ci	$length -= $rcount;
88462306a36Sopenharmony_ci    }
88562306a36Sopenharmony_ci    close INFILE;
88662306a36Sopenharmony_ci    close OUTFILE;
88762306a36Sopenharmony_ci}
88862306a36Sopenharmony_ci
88962306a36Sopenharmony_cisub appendfile {
89062306a36Sopenharmony_ci    my ($FH, $infile) = @_;
89162306a36Sopenharmony_ci    my ($buf);
89262306a36Sopenharmony_ci
89362306a36Sopenharmony_ci    open INFILE, "<$infile";
89462306a36Sopenharmony_ci    while(1) {
89562306a36Sopenharmony_ci	$rcount = sysread(INFILE, $buf, 2048);
89662306a36Sopenharmony_ci	last if ($rcount == 0);
89762306a36Sopenharmony_ci	print $FH $buf;
89862306a36Sopenharmony_ci    }
89962306a36Sopenharmony_ci    close(INFILE);
90062306a36Sopenharmony_ci}
90162306a36Sopenharmony_ci
90262306a36Sopenharmony_cisub delzero{
90362306a36Sopenharmony_ci	my ($infile,$outfile) =@_;
90462306a36Sopenharmony_ci
90562306a36Sopenharmony_ci	open INFILE,"<$infile";
90662306a36Sopenharmony_ci	open OUTFILE,">$outfile";
90762306a36Sopenharmony_ci	while (1){
90862306a36Sopenharmony_ci		$rcount=sysread(INFILE,$buf,22);
90962306a36Sopenharmony_ci		$len=ord(substr($buf,0,1));
91062306a36Sopenharmony_ci		print OUTFILE substr($buf,0,1);
91162306a36Sopenharmony_ci		print OUTFILE substr($buf,2,$len+3);
91262306a36Sopenharmony_ci	last if ($rcount<1);
91362306a36Sopenharmony_ci	printf OUTFILE "%c",0;
91462306a36Sopenharmony_ci#print $len." ".length($buf)."\n";
91562306a36Sopenharmony_ci
91662306a36Sopenharmony_ci	}
91762306a36Sopenharmony_ci	close(INFILE);
91862306a36Sopenharmony_ci	close(OUTFILE);
91962306a36Sopenharmony_ci}
92062306a36Sopenharmony_ci
92162306a36Sopenharmony_cisub syntax() {
92262306a36Sopenharmony_ci    print STDERR "syntax: get_dvb_firmware <component>\n";
92362306a36Sopenharmony_ci    print STDERR "Supported components:\n";
92462306a36Sopenharmony_ci    @components = sort @components;
92562306a36Sopenharmony_ci    for($i=0; $i < scalar(@components); $i++) {
92662306a36Sopenharmony_ci	print STDERR "\t" . $components[$i] . "\n";
92762306a36Sopenharmony_ci    }
92862306a36Sopenharmony_ci    exit(1);
92962306a36Sopenharmony_ci}
930