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