942 lines · 25.2 KB · Text
RawDownload
#!/usr/bin/env perl#     DVB firmware extractor##     (c) 2004 Andrew de Quincey##     This program is free software; you can redistribute it and/or modify#       it under the terms of the GNU General Public License as published by#       the Free Software Foundation; either version 2 of the License, or#       (at your option) any later version.##     This program is distributed in the hope that it will be useful,#       but WITHOUT ANY WARRANTY; without even the implied warranty of#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the##     GNU General Public License for more details.##     You should have received a copy of the GNU General Public License#       along with this program; if not, write to the Free Software#       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. use File::Temp qw/ tempdir /;use IO::Handle; @components = ( "sp8870", "sp887x", "tda10045", "tda10046",		"tda10046lifeview", "av7110", "dec2000t", "dec2540t",		"dec3000s", "vp7041", "vp7049", "dibusb", "nxt2002", "nxt2004",		"or51211", "or51132_qam", "or51132_vsb", "bluebird",		"opera1", "cx231xx", "cx18", "cx23885", "pvrusb2", "mpc718",		"af9015", "ngene", "az6027", "lme2510_lg", "lme2510c_s7395",		"lme2510c_s7395_old", "drxk", "drxk_terratec_h5",		"drxk_hauppauge_hvr930c", "tda10071", "it9135", "drxk_pctv",		"drxk_terratec_htc_stick", "sms1xxx_hcw", "si2165"); # Check argssyntax() if (scalar(@ARGV) != 1);$cid = $ARGV[0]; # Do it!for ($i=0; $i < scalar(@components); $i++) {    if ($cid eq $components[$i]) {	$outfile = eval($cid);	die $@ if $@;	print STDERR <<EOF;Firmware(s) $outfile extracted successfully.Now copy it(them) to either /usr/lib/hotplug/firmware or /lib/firmware(depending on configuration of firmware hotplug).EOF	exit(0);    }} # If we get here, it wasn't foundprint STDERR "Unknown component \"$cid\"\n";syntax();    # ---------------------------------------------------------------# Firmware-specific extraction subroutines sub sp8870 {    my $sourcefile = "tt_Premium_217g.zip";    my $url = "http://www.softwarepatch.pl/9999ccd06a4813cb827dbb0005071c71/$sourcefile";    my $hash = "53970ec17a538945a6d8cb608a7b3899";    my $outfile = "dvb-fe-sp8870.fw";    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);     checkstandard();     wgetfile($sourcefile, $url);    unzip($sourcefile, $tmpdir);    verify("$tmpdir/software/OEM/HE/App/boot/SC_MAIN.MC", $hash);    copy("$tmpdir/software/OEM/HE/App/boot/SC_MAIN.MC", $outfile);     $outfile;} sub sp887x {    my $sourcefile = "Dvbt1.3.57.6.zip";    my $url = "http://www.avermedia.com/software/$sourcefile";    my $cabfile = "DVBT Net  Ver1.3.57.6/disk1/data1.cab";    my $hash = "237938d53a7f834c05c42b894ca68ac3";    my $outfile = "dvb-fe-sp887x.fw";    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);     checkstandard();    checkunshield();     wgetfile($sourcefile, $url);    unzip($sourcefile, $tmpdir);    unshield("$tmpdir/$cabfile", $tmpdir);    verify("$tmpdir/ZEnglish/sc_main.mc", $hash);    copy("$tmpdir/ZEnglish/sc_main.mc", $outfile);     $outfile;} sub tda10045 {    my $sourcefile = "tt_budget_217g.zip";    my $url = "http://www.technotrend.de/new/217g/$sourcefile";    my $hash = "2105fd5bf37842fbcdfa4bfd58f3594a";    my $outfile = "dvb-fe-tda10045.fw";    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);     checkstandard();     wgetfile($sourcefile, $url);    unzip($sourcefile, $tmpdir);    extract("$tmpdir/software/OEM/PCI/App/ttlcdacc.dll", 0x37ef9, 30555, "$tmpdir/fwtmp");    verify("$tmpdir/fwtmp", $hash);    copy("$tmpdir/fwtmp", $outfile);     $outfile;} sub tda10046 {	my $sourcefile = "TT_PCI_2.19h_28_11_2006.zip";	my $url = "http://technotrend.com.ua/download/software/219/$sourcefile";	my $hash = "6a7e1e2f2644b162ff0502367553c72d";	my $outfile = "dvb-fe-tda10046.fw";	my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1); 	checkstandard(); 	wgetfile($sourcefile, $url);	unzip($sourcefile, $tmpdir);	extract("$tmpdir/TT_PCI_2.19h_28_11_2006/software/OEM/PCI/App/ttlcdacc.dll", 0x65389, 24478, "$tmpdir/fwtmp");	verify("$tmpdir/fwtmp", $hash);	copy("$tmpdir/fwtmp", $outfile); 	$outfile;} sub tda10046lifeview {    my $sourcefile = "7%5Cdrv_2.11.02.zip";    my $url = "http://www.lifeview.hk/dbimages/document/$sourcefile";    my $hash = "1ea24dee4eea8fe971686981f34fd2e0";    my $outfile = "dvb-fe-tda10046.fw";    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);     checkstandard();     wgetfile($sourcefile, $url);    unzip($sourcefile, $tmpdir);    extract("$tmpdir/LVHybrid.sys", 0x8b088, 24602, "$tmpdir/fwtmp");    verify("$tmpdir/fwtmp", $hash);    copy("$tmpdir/fwtmp", $outfile);     $outfile;} sub av7110 {    my $sourcefile = "dvb-ttpci-01.fw-261d";    my $url = "https://linuxtv.org/downloads/firmware/$sourcefile";    my $hash = "603431b6259715a8e88f376a53b64e2f";    my $outfile = "dvb-ttpci-01.fw";     checkstandard();     wgetfile($sourcefile, $url);    verify($sourcefile, $hash);    copy($sourcefile, $outfile);     $outfile;} sub dec2000t {    my $sourcefile = "dec217g.exe";    my $url = "http://hauppauge.lightpath.net/de/$sourcefile";    my $hash = "bd86f458cee4a8f0a8ce2d20c66215a9";    my $outfile = "dvb-ttusb-dec-2000t.fw";    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);     checkstandard();     wgetfile($sourcefile, $url);    unzip($sourcefile, $tmpdir);    verify("$tmpdir/software/OEM/STB/App/Boot/STB_PC_T.bin", $hash);    copy("$tmpdir/software/OEM/STB/App/Boot/STB_PC_T.bin", $outfile);     $outfile;} sub dec2540t {    my $sourcefile = "dec217g.exe";    my $url = "http://hauppauge.lightpath.net/de/$sourcefile";    my $hash = "53e58f4f5b5c2930beee74a7681fed92";    my $outfile = "dvb-ttusb-dec-2540t.fw";    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);     checkstandard();     wgetfile($sourcefile, $url);    unzip($sourcefile, $tmpdir);    verify("$tmpdir/software/OEM/STB/App/Boot/STB_PC_X.bin", $hash);    copy("$tmpdir/software/OEM/STB/App/Boot/STB_PC_X.bin", $outfile);     $outfile;} sub dec3000s {    my $sourcefile = "dec217g.exe";    my $url = "http://hauppauge.lightpath.net/de/$sourcefile";    my $hash = "b013ececea83f4d6d8d2a29ac7c1b448";    my $outfile = "dvb-ttusb-dec-3000s.fw";    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);     checkstandard();     wgetfile($sourcefile, $url);    unzip($sourcefile, $tmpdir);    verify("$tmpdir/software/OEM/STB/App/Boot/STB_PC_S.bin", $hash);    copy("$tmpdir/software/OEM/STB/App/Boot/STB_PC_S.bin", $outfile);     $outfile;}sub opera1{	my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 0); 	checkstandard();	my $fwfile1="dvb-usb-opera1-fpga-01.fw";	my $fwfile2="dvb-usb-opera-01.fw";	extract("2830SCap2.sys", 0x62e8, 55024, "$tmpdir/opera1-fpga.fw");	extract("2830SLoad2.sys",0x3178,0x3685-0x3178,"$tmpdir/fw1part1");	extract("2830SLoad2.sys",0x0980,0x3150-0x0980,"$tmpdir/fw1part2");	delzero("$tmpdir/fw1part1","$tmpdir/fw1part1-1");	delzero("$tmpdir/fw1part2","$tmpdir/fw1part2-1");	verify("$tmpdir/fw1part1-1","5e0909858fdf0b5b09ad48b9fe622e70");	verify("$tmpdir/fw1part2-1","d6e146f321427e931df2c6fcadac37a1");	verify("$tmpdir/opera1-fpga.fw","0f8133f5e9051f5f3c1928f7e5a1b07d"); 	my $RES1="\x01\x92\x7f\x00\x01\x00";	my $RES0="\x01\x92\x7f\x00\x00\x00";	my $DAT1="\x01\x00\xe6\x00\x01\x00";	my $DAT0="\x01\x00\xe6\x00\x00\x00";	open FW,">$tmpdir/opera.fw";	print FW "$RES1";	print FW "$DAT1";	print FW "$RES1";	print FW "$DAT1";	appendfile(FW,"$tmpdir/fw1part1-1");	print FW "$RES0";	print FW "$DAT0";	print FW "$RES1";	print FW "$DAT1";	appendfile(FW,"$tmpdir/fw1part2-1");	print FW "$RES1";	print FW "$DAT1";	print FW "$RES0";	print FW "$DAT0";	copy ("$tmpdir/opera1-fpga.fw",$fwfile1);	copy ("$tmpdir/opera.fw",$fwfile2); 	$fwfile1.",".$fwfile2;} sub vp7041 {    my $sourcefile = "2.422.zip";    my $url = "http://www.twinhan.com/files/driver/USB-Ter/$sourcefile";    my $hash = "e88c9372d1f66609a3e7b072c53fbcfe";    my $outfile = "dvb-vp7041-2.422.fw";    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);     checkstandard();     wgetfile($sourcefile, $url);    unzip($sourcefile, $tmpdir);    extract("$tmpdir/VisionDTV/Drivers/Win2K&XP/UDTTload.sys", 12503, 3036, "$tmpdir/fwtmp1");    extract("$tmpdir/VisionDTV/Drivers/Win2K&XP/UDTTload.sys", 2207, 10274, "$tmpdir/fwtmp2");     my $CMD = "\000\001\000\222\177\000";    my $PAD = "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000";    my ($FW);    open $FW, ">$tmpdir/fwtmp3";    print $FW "$CMD\001$PAD";    print $FW "$CMD\001$PAD";    appendfile($FW, "$tmpdir/fwtmp1");    print $FW "$CMD\000$PAD";    print $FW "$CMD\001$PAD";    appendfile($FW, "$tmpdir/fwtmp2");    print $FW "$CMD\001$PAD";    print $FW "$CMD\000$PAD";    close($FW);     verify("$tmpdir/fwtmp3", $hash);    copy("$tmpdir/fwtmp3", $outfile);     $outfile;} sub vp7049 {    my $fwfile = "dvb-usb-vp7049-0.95.fw";    my $url = "http://ao2.it/sites/default/files/blog/2012/11/06/linux-support-digicom-digitune-s-vp7049-udtt7049/$fwfile";    my $hash = "5609fd295168aea88b25ff43a6f79c36";     checkstandard();     wgetfile($fwfile, $url);    verify($fwfile, $hash);     $fwfile;} sub dibusb {	my $url = "https://linuxtv.org/downloads/firmware/dvb-usb-dibusb-5.0.0.11.fw";	my $outfile = "dvb-dibusb-5.0.0.11.fw";	my $hash = "fa490295a527360ca16dcdf3224ca243"; 	checkstandard(); 	wgetfile($outfile, $url);	verify($outfile,$hash); 	$outfile;} sub nxt2002 {    my $sourcefile = "Technisat_DVB-PC_4_4_COMPACT.zip";    my $url = "http://www.bbti.us/download/windows/$sourcefile";    my $hash = "476befae8c7c1bb9648954060b1eec1f";    my $outfile = "dvb-fe-nxt2002.fw";    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);     checkstandard();     wgetfile($sourcefile, $url);    unzip($sourcefile, $tmpdir);    verify("$tmpdir/SkyNET.sys", $hash);    extract("$tmpdir/SkyNET.sys", 331624, 5908, $outfile);     $outfile;} sub nxt2004 {    my $sourcefile = "AVerTVHD_MCE_A180_Drv_v1.2.2.16.zip";    my $url = "http://www.avermedia-usa.com/support/Drivers/$sourcefile";    my $hash = "111cb885b1e009188346d72acfed024c";    my $outfile = "dvb-fe-nxt2004.fw";    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);     checkstandard();     wgetfile($sourcefile, $url);    unzip($sourcefile, $tmpdir);    verify("$tmpdir/3xHybrid.sys", $hash);    extract("$tmpdir/3xHybrid.sys", 465304, 9584, $outfile);     $outfile;} sub or51211 {    my $fwfile = "dvb-fe-or51211.fw";    my $url = "https://linuxtv.org/downloads/firmware/$fwfile";    my $hash = "d830949c771a289505bf9eafc225d491";     checkstandard();     wgetfile($fwfile, $url);    verify($fwfile, $hash);     $fwfile;} sub cx231xx {    my $fwfile = "v4l-cx231xx-avcore-01.fw";    my $url = "https://linuxtv.org/downloads/firmware/$fwfile";    my $hash = "7d3bb956dc9df0eafded2b56ba57cc42";     checkstandard();     wgetfile($fwfile, $url);    verify($fwfile, $hash);     $fwfile;} sub cx18 {    my $url = "https://linuxtv.org/downloads/firmware/";     my %files = (	'v4l-cx23418-apu.fw' => '588f081b562f5c653a3db1ad8f65939a',	'v4l-cx23418-cpu.fw' => 'b6c7ed64bc44b1a6e0840adaeac39d79',	'v4l-cx23418-dig.fw' => '95bc688d3e7599fd5800161e9971cc55',    );     checkstandard();     my $allfiles;    foreach my $fwfile (keys %files) {	wgetfile($fwfile, "$url/$fwfile");	verify($fwfile, $files{$fwfile});	$allfiles .= " $fwfile";    }     $allfiles =~ s/^\s//;     $allfiles;} sub mpc718 {    my $archive = 'Yuan MPC718 TV Tuner Card 2.13.10.1016.zip';    my $url = "ftp://ftp.work.acer-euro.com/desktop/aspire_idea510/vista/Drivers/$archive";    my $fwfile = "dvb-cx18-mpc718-mt352.fw";    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);     checkstandard();    wgetfile($archive, $url);    unzip($archive, $tmpdir);     my $sourcefile = "$tmpdir/Yuan MPC718 TV Tuner Card 2.13.10.1016/mpc718_32bit/yuanrap.sys";    my $found = 0;     open IN, '<', $sourcefile or die "Couldn't open $sourcefile to extract $fwfile data\n";    binmode IN;    open OUT, '>', $fwfile;    binmode OUT;    {	# Block scope because we change the line terminator variable $/	my $prevlen = 0;	my $currlen; 	# Buried in the data segment are 3 runs of almost identical	# register-value pairs that end in 0x5d 0x01 which is a "TUNER GO"	# command for the MT352.	# Pull out the middle run (because it's easy) of register-value	# pairs to make the "firmware" file. 	local $/ = "\x5d\x01"; # MT352 "TUNER GO" 	while (<IN>) {	    $currlen = length($_);	    if ($prevlen == $currlen && $currlen <= 64) {		chop; chop; # Get rid of "TUNER GO"		s/^\0\0//;  # get rid of leading 00 00 if it's there		printf OUT "$_";		$found = 1;		last;	    }	    $prevlen = $currlen;	}    }    close OUT;    close IN;    if (!$found) {	unlink $fwfile;	die "Couldn't find valid register-value sequence in $sourcefile for $fwfile\n";    }    $fwfile;} sub cx23885 {    my $url = "https://linuxtv.org/downloads/firmware/";     my %files = (	'v4l-cx23885-avcore-01.fw' => 'a9f8f5d901a7fb42f552e1ee6384f3bb',	'v4l-cx23885-enc.fw'       => 'a9f8f5d901a7fb42f552e1ee6384f3bb',    );     checkstandard();     my $allfiles;    foreach my $fwfile (keys %files) {	wgetfile($fwfile, "$url/$fwfile");	verify($fwfile, $files{$fwfile});	$allfiles .= " $fwfile";    }     $allfiles =~ s/^\s//;     $allfiles;} sub pvrusb2 {    my $url = "https://linuxtv.org/downloads/firmware/";     my %files = (	'v4l-cx25840.fw'           => 'dadb79e9904fc8af96e8111d9cb59320',    );     checkstandard();     my $allfiles;    foreach my $fwfile (keys %files) {	wgetfile($fwfile, "$url/$fwfile");	verify($fwfile, $files{$fwfile});	$allfiles .= " $fwfile";    }     $allfiles =~ s/^\s//;     $allfiles;} sub or51132_qam {    my $fwfile = "dvb-fe-or51132-qam.fw";    my $url = "https://linuxtv.org/downloads/firmware/$fwfile";    my $hash = "7702e8938612de46ccadfe9b413cb3b5";     checkstandard();

Lines 1–500 of 942.