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