| Mauro Carvalho Chehab | a594dcb | 2007-12-31 02:29:46 -0300 | [diff] [blame] | 1 | #!/usr/bin/perl | 
|  | 2 |  | 
|  | 3 | # Copyright (c) Mauro Carvalho Chehab <mchehab@infradead.org> | 
|  | 4 | # Released under GPLv2 | 
|  | 5 | # | 
|  | 6 | # In order to use, you need to: | 
|  | 7 | #	1) Download the windows driver with something like: | 
|  | 8 | #		wget http://www.steventoth.net/linux/xc5000/HVR-12x0-14x0-17x0_1_25_25271_WHQL.zip | 
|  | 9 | #	2) Extract the file hcw85bda.sys from the zip into the current dir: | 
|  | 10 | #		unzip -j HVR-12x0-14x0-17x0_1_25_25271_WHQL.zip Driver85/hcw85bda.sys | 
|  | 11 | #	3) run the script: | 
|  | 12 | #		./extract_xc3028.pl | 
|  | 13 | #	4) copy the generated file: | 
|  | 14 | #		cp xc3028-v27.fw /lib/firmware | 
|  | 15 |  | 
|  | 16 | #use strict; | 
|  | 17 | use IO::Handle; | 
|  | 18 |  | 
|  | 19 | my $debug=0; | 
|  | 20 |  | 
|  | 21 | sub verify ($$) | 
|  | 22 | { | 
|  | 23 | my ($filename, $hash) = @_; | 
|  | 24 | my ($testhash); | 
|  | 25 |  | 
|  | 26 | if (system("which md5sum > /dev/null 2>&1")) { | 
|  | 27 | die "This firmware requires the md5sum command - see http://www.gnu.org/software/coreutils/\n"; | 
|  | 28 | } | 
|  | 29 |  | 
|  | 30 | open(CMD, "md5sum ".$filename."|"); | 
|  | 31 | $testhash = <CMD>; | 
|  | 32 | $testhash =~ /([a-zA-Z0-9]*)/; | 
|  | 33 | $testhash = $1; | 
|  | 34 | close CMD; | 
|  | 35 | die "Hash of extracted file does not match (found $testhash, expected $hash!\n" if ($testhash ne $hash); | 
|  | 36 | } | 
|  | 37 |  | 
|  | 38 | sub get_hunk ($$) | 
|  | 39 | { | 
|  | 40 | my ($offset, $length) = @_; | 
|  | 41 | my ($chunklength, $buf, $rcount, $out); | 
|  | 42 |  | 
|  | 43 | sysseek(INFILE, $offset, SEEK_SET); | 
|  | 44 | while ($length > 0) { | 
|  | 45 | # Calc chunk size | 
|  | 46 | $chunklength = 2048; | 
|  | 47 | $chunklength = $length if ($chunklength > $length); | 
|  | 48 |  | 
|  | 49 | $rcount = sysread(INFILE, $buf, $chunklength); | 
|  | 50 | die "Ran out of data\n" if ($rcount != $chunklength); | 
|  | 51 | $out .= $buf; | 
|  | 52 | $length -= $rcount; | 
|  | 53 | } | 
|  | 54 | return $out; | 
|  | 55 | } | 
|  | 56 |  | 
|  | 57 | sub write_le16($) | 
|  | 58 | { | 
|  | 59 | my $val = shift; | 
|  | 60 | my $msb = ($val >> 8) &0xff; | 
|  | 61 | my $lsb = $val & 0xff; | 
|  | 62 |  | 
|  | 63 | syswrite(OUTFILE, chr($lsb).chr($msb)); | 
|  | 64 | } | 
|  | 65 |  | 
|  | 66 | sub write_le32($) | 
|  | 67 | { | 
|  | 68 | my $val = shift; | 
|  | 69 | my $l3 = ($val >> 24) & 0xff; | 
|  | 70 | my $l2 = ($val >> 16) & 0xff; | 
|  | 71 | my $l1 = ($val >> 8)  & 0xff; | 
|  | 72 | my $l0 = $val         & 0xff; | 
|  | 73 |  | 
|  | 74 | syswrite(OUTFILE, chr($l0).chr($l1).chr($l2).chr($l3)); | 
|  | 75 | } | 
|  | 76 |  | 
|  | 77 | sub write_le64($$) | 
|  | 78 | { | 
|  | 79 | my $msb_val = shift; | 
|  | 80 | my $lsb_val = shift; | 
|  | 81 | my $l7 = ($msb_val >> 24) & 0xff; | 
|  | 82 | my $l6 = ($msb_val >> 16) & 0xff; | 
|  | 83 | my $l5 = ($msb_val >> 8)  & 0xff; | 
|  | 84 | my $l4 = $msb_val         & 0xff; | 
|  | 85 |  | 
|  | 86 | my $l3 = ($lsb_val >> 24) & 0xff; | 
|  | 87 | my $l2 = ($lsb_val >> 16) & 0xff; | 
|  | 88 | my $l1 = ($lsb_val >> 8)  & 0xff; | 
|  | 89 | my $l0 = $lsb_val         & 0xff; | 
|  | 90 |  | 
|  | 91 | syswrite(OUTFILE, | 
|  | 92 | chr($l0).chr($l1).chr($l2).chr($l3). | 
|  | 93 | chr($l4).chr($l5).chr($l6).chr($l7)); | 
|  | 94 | } | 
|  | 95 |  | 
|  | 96 | sub write_hunk($$) | 
|  | 97 | { | 
|  | 98 | my ($offset, $length) = @_; | 
|  | 99 | my $out = get_hunk($offset, $length); | 
|  | 100 |  | 
|  | 101 | printf "(len %d) ",$length if ($debug); | 
|  | 102 |  | 
|  | 103 | for (my $i=0;$i<$length;$i++) { | 
|  | 104 | printf "%02x ",ord(substr($out,$i,1)) if ($debug); | 
|  | 105 | } | 
|  | 106 | printf "\n" if ($debug); | 
|  | 107 |  | 
|  | 108 | syswrite(OUTFILE, $out); | 
|  | 109 | } | 
|  | 110 |  | 
|  | 111 | sub write_hunk_fix_endian($$) | 
|  | 112 | { | 
|  | 113 | my ($offset, $length) = @_; | 
|  | 114 | my $out = get_hunk($offset, $length); | 
|  | 115 |  | 
|  | 116 | printf "(len_fix %d) ",$length if ($debug); | 
|  | 117 |  | 
|  | 118 | for (my $i=0;$i<$length;$i++) { | 
|  | 119 | printf "%02x ",ord(substr($out,$i,1)) if ($debug); | 
|  | 120 | } | 
|  | 121 | printf "\n" if ($debug); | 
|  | 122 |  | 
|  | 123 | my $i=0; | 
|  | 124 | while ($i<$length) { | 
|  | 125 | my $size = ord(substr($out,$i,1))*256+ord(substr($out,$i+1,1)); | 
|  | 126 | syswrite(OUTFILE, substr($out,$i+1,1)); | 
|  | 127 | syswrite(OUTFILE, substr($out,$i,1)); | 
|  | 128 | $i+=2; | 
|  | 129 | if ($size>0 && $size <0x8000) { | 
|  | 130 | for (my $j=0;$j<$size;$j++) { | 
|  | 131 | syswrite(OUTFILE, substr($out,$j+$i,1)); | 
|  | 132 | } | 
|  | 133 | $i+=$size; | 
|  | 134 | } | 
|  | 135 | } | 
|  | 136 | } | 
|  | 137 |  | 
|  | 138 | sub main_firmware($$$$) | 
|  | 139 | { | 
|  | 140 | my $out; | 
|  | 141 | my $j=0; | 
|  | 142 | my $outfile = shift; | 
|  | 143 | my $name    = shift; | 
|  | 144 | my $version = shift; | 
|  | 145 | my $nr_desc = shift; | 
|  | 146 |  | 
|  | 147 | for ($j = length($name); $j <32; $j++) { | 
|  | 148 | $name = $name.chr(0); | 
|  | 149 | } | 
|  | 150 |  | 
|  | 151 | open OUTFILE, ">$outfile"; | 
|  | 152 | syswrite(OUTFILE, $name); | 
|  | 153 | write_le16($version); | 
|  | 154 | write_le16($nr_desc); | 
|  | 155 |  | 
|  | 156 | # | 
|  | 157 | # Firmware 0, type: BASE FW   F8MHZ (0x00000003), id: (0000000000000000), size: 8718 | 
|  | 158 | # | 
|  | 159 |  | 
|  | 160 | write_le32(0x00000003);			# Type | 
|  | 161 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 162 | write_le32(8718);			# Size | 
|  | 163 | write_hunk_fix_endian(813432, 8718); | 
|  | 164 |  | 
|  | 165 | # | 
|  | 166 | # Firmware 1, type: BASE FW   F8MHZ MTS (0x00000007), id: (0000000000000000), size: 8712 | 
|  | 167 | # | 
|  | 168 |  | 
|  | 169 | write_le32(0x00000007);			# Type | 
|  | 170 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 171 | write_le32(8712);			# Size | 
|  | 172 | write_hunk_fix_endian(822152, 8712); | 
|  | 173 |  | 
|  | 174 | # | 
|  | 175 | # Firmware 2, type: BASE FW   FM (0x00000401), id: (0000000000000000), size: 8562 | 
|  | 176 | # | 
|  | 177 |  | 
|  | 178 | write_le32(0x00000401);			# Type | 
|  | 179 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 180 | write_le32(8562);			# Size | 
|  | 181 | write_hunk_fix_endian(830872, 8562); | 
|  | 182 |  | 
|  | 183 | # | 
|  | 184 | # Firmware 3, type: BASE FW   FM INPUT1 (0x00000c01), id: (0000000000000000), size: 8576 | 
|  | 185 | # | 
|  | 186 |  | 
|  | 187 | write_le32(0x00000c01);			# Type | 
|  | 188 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 189 | write_le32(8576);			# Size | 
|  | 190 | write_hunk_fix_endian(839440, 8576); | 
|  | 191 |  | 
|  | 192 | # | 
|  | 193 | # Firmware 4, type: BASE FW   (0x00000001), id: (0000000000000000), size: 8706 | 
|  | 194 | # | 
|  | 195 |  | 
|  | 196 | write_le32(0x00000001);			# Type | 
|  | 197 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 198 | write_le32(8706);			# Size | 
|  | 199 | write_hunk_fix_endian(848024, 8706); | 
|  | 200 |  | 
|  | 201 | # | 
|  | 202 | # Firmware 5, type: BASE FW   MTS (0x00000005), id: (0000000000000000), size: 8682 | 
|  | 203 | # | 
|  | 204 |  | 
|  | 205 | write_le32(0x00000005);			# Type | 
|  | 206 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 207 | write_le32(8682);			# Size | 
|  | 208 | write_hunk_fix_endian(856736, 8682); | 
|  | 209 |  | 
|  | 210 | # | 
|  | 211 | # Firmware 6, type: STD FW    (0x00000000), id: PAL/BG A2/A (0000000100000007), size: 161 | 
|  | 212 | # | 
|  | 213 |  | 
|  | 214 | write_le32(0x00000000);			# Type | 
|  | 215 | write_le64(0x00000001, 0x00000007);	# ID | 
|  | 216 | write_le32(161);			# Size | 
|  | 217 | write_hunk_fix_endian(865424, 161); | 
|  | 218 |  | 
|  | 219 | # | 
|  | 220 | # Firmware 7, type: STD FW    MTS (0x00000004), id: PAL/BG A2/A (0000000100000007), size: 169 | 
|  | 221 | # | 
|  | 222 |  | 
|  | 223 | write_le32(0x00000004);			# Type | 
|  | 224 | write_le64(0x00000001, 0x00000007);	# ID | 
|  | 225 | write_le32(169);			# Size | 
|  | 226 | write_hunk_fix_endian(865592, 169); | 
|  | 227 |  | 
|  | 228 | # | 
|  | 229 | # Firmware 8, type: STD FW    (0x00000000), id: PAL/BG A2/B (0000000200000007), size: 161 | 
|  | 230 | # | 
|  | 231 |  | 
|  | 232 | write_le32(0x00000000);			# Type | 
|  | 233 | write_le64(0x00000002, 0x00000007);	# ID | 
|  | 234 | write_le32(161);			# Size | 
|  | 235 | write_hunk_fix_endian(865424, 161); | 
|  | 236 |  | 
|  | 237 | # | 
|  | 238 | # Firmware 9, type: STD FW    MTS (0x00000004), id: PAL/BG A2/B (0000000200000007), size: 169 | 
|  | 239 | # | 
|  | 240 |  | 
|  | 241 | write_le32(0x00000004);			# Type | 
|  | 242 | write_le64(0x00000002, 0x00000007);	# ID | 
|  | 243 | write_le32(169);			# Size | 
|  | 244 | write_hunk_fix_endian(865592, 169); | 
|  | 245 |  | 
|  | 246 | # | 
|  | 247 | # Firmware 10, type: STD FW    (0x00000000), id: PAL/BG NICAM/A (0000000400000007), size: 161 | 
|  | 248 | # | 
|  | 249 |  | 
|  | 250 | write_le32(0x00000000);			# Type | 
|  | 251 | write_le64(0x00000004, 0x00000007);	# ID | 
|  | 252 | write_le32(161);			# Size | 
|  | 253 | write_hunk_fix_endian(866112, 161); | 
|  | 254 |  | 
|  | 255 | # | 
|  | 256 | # Firmware 11, type: STD FW    MTS (0x00000004), id: PAL/BG NICAM/A (0000000400000007), size: 169 | 
|  | 257 | # | 
|  | 258 |  | 
|  | 259 | write_le32(0x00000004);			# Type | 
|  | 260 | write_le64(0x00000004, 0x00000007);	# ID | 
|  | 261 | write_le32(169);			# Size | 
|  | 262 | write_hunk_fix_endian(866280, 169); | 
|  | 263 |  | 
|  | 264 | # | 
|  | 265 | # Firmware 12, type: STD FW    (0x00000000), id: PAL/BG NICAM/B (0000000800000007), size: 161 | 
|  | 266 | # | 
|  | 267 |  | 
|  | 268 | write_le32(0x00000000);			# Type | 
|  | 269 | write_le64(0x00000008, 0x00000007);	# ID | 
|  | 270 | write_le32(161);			# Size | 
|  | 271 | write_hunk_fix_endian(866112, 161); | 
|  | 272 |  | 
|  | 273 | # | 
|  | 274 | # Firmware 13, type: STD FW    MTS (0x00000004), id: PAL/BG NICAM/B (0000000800000007), size: 169 | 
|  | 275 | # | 
|  | 276 |  | 
|  | 277 | write_le32(0x00000004);			# Type | 
|  | 278 | write_le64(0x00000008, 0x00000007);	# ID | 
|  | 279 | write_le32(169);			# Size | 
|  | 280 | write_hunk_fix_endian(866280, 169); | 
|  | 281 |  | 
|  | 282 | # | 
|  | 283 | # Firmware 14, type: STD FW    (0x00000000), id: PAL/DK A2 (00000003000000e0), size: 161 | 
|  | 284 | # | 
|  | 285 |  | 
|  | 286 | write_le32(0x00000000);			# Type | 
|  | 287 | write_le64(0x00000003, 0x000000e0);	# ID | 
|  | 288 | write_le32(161);			# Size | 
|  | 289 | write_hunk_fix_endian(866800, 161); | 
|  | 290 |  | 
|  | 291 | # | 
|  | 292 | # Firmware 15, type: STD FW    MTS (0x00000004), id: PAL/DK A2 (00000003000000e0), size: 169 | 
|  | 293 | # | 
|  | 294 |  | 
|  | 295 | write_le32(0x00000004);			# Type | 
|  | 296 | write_le64(0x00000003, 0x000000e0);	# ID | 
|  | 297 | write_le32(169);			# Size | 
|  | 298 | write_hunk_fix_endian(866968, 169); | 
|  | 299 |  | 
|  | 300 | # | 
|  | 301 | # Firmware 16, type: STD FW    (0x00000000), id: PAL/DK NICAM (0000000c000000e0), size: 161 | 
|  | 302 | # | 
|  | 303 |  | 
|  | 304 | write_le32(0x00000000);			# Type | 
|  | 305 | write_le64(0x0000000c, 0x000000e0);	# ID | 
|  | 306 | write_le32(161);			# Size | 
|  | 307 | write_hunk_fix_endian(867144, 161); | 
|  | 308 |  | 
|  | 309 | # | 
|  | 310 | # Firmware 17, type: STD FW    MTS (0x00000004), id: PAL/DK NICAM (0000000c000000e0), size: 169 | 
|  | 311 | # | 
|  | 312 |  | 
|  | 313 | write_le32(0x00000004);			# Type | 
|  | 314 | write_le64(0x0000000c, 0x000000e0);	# ID | 
|  | 315 | write_le32(169);			# Size | 
|  | 316 | write_hunk_fix_endian(867312, 169); | 
|  | 317 |  | 
|  | 318 | # | 
|  | 319 | # Firmware 18, type: STD FW    (0x00000000), id: SECAM/K1 (0000000000200000), size: 161 | 
|  | 320 | # | 
|  | 321 |  | 
|  | 322 | write_le32(0x00000000);			# Type | 
|  | 323 | write_le64(0x00000000, 0x00200000);	# ID | 
|  | 324 | write_le32(161);			# Size | 
|  | 325 | write_hunk_fix_endian(867488, 161); | 
|  | 326 |  | 
|  | 327 | # | 
|  | 328 | # Firmware 19, type: STD FW    MTS (0x00000004), id: SECAM/K1 (0000000000200000), size: 169 | 
|  | 329 | # | 
|  | 330 |  | 
|  | 331 | write_le32(0x00000004);			# Type | 
|  | 332 | write_le64(0x00000000, 0x00200000);	# ID | 
|  | 333 | write_le32(169);			# Size | 
|  | 334 | write_hunk_fix_endian(867656, 169); | 
|  | 335 |  | 
|  | 336 | # | 
|  | 337 | # Firmware 20, type: STD FW    (0x00000000), id: SECAM/K3 (0000000004000000), size: 161 | 
|  | 338 | # | 
|  | 339 |  | 
|  | 340 | write_le32(0x00000000);			# Type | 
|  | 341 | write_le64(0x00000000, 0x04000000);	# ID | 
|  | 342 | write_le32(161);			# Size | 
|  | 343 | write_hunk_fix_endian(867832, 161); | 
|  | 344 |  | 
|  | 345 | # | 
|  | 346 | # Firmware 21, type: STD FW    MTS (0x00000004), id: SECAM/K3 (0000000004000000), size: 169 | 
|  | 347 | # | 
|  | 348 |  | 
|  | 349 | write_le32(0x00000004);			# Type | 
|  | 350 | write_le64(0x00000000, 0x04000000);	# ID | 
|  | 351 | write_le32(169);			# Size | 
|  | 352 | write_hunk_fix_endian(868000, 169); | 
|  | 353 |  | 
|  | 354 | # | 
|  | 355 | # Firmware 22, type: STD FW    D2633 DTV6 ATSC (0x00010030), id: (0000000000000000), size: 149 | 
|  | 356 | # | 
|  | 357 |  | 
|  | 358 | write_le32(0x00010030);			# Type | 
|  | 359 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 360 | write_le32(149);			# Size | 
|  | 361 | write_hunk_fix_endian(868176, 149); | 
|  | 362 |  | 
|  | 363 | # | 
|  | 364 | # Firmware 23, type: STD FW    D2620 DTV6 QAM (0x00000068), id: (0000000000000000), size: 149 | 
|  | 365 | # | 
|  | 366 |  | 
|  | 367 | write_le32(0x00000068);			# Type | 
|  | 368 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 369 | write_le32(149);			# Size | 
|  | 370 | write_hunk_fix_endian(868336, 149); | 
|  | 371 |  | 
|  | 372 | # | 
|  | 373 | # Firmware 24, type: STD FW    D2633 DTV6 QAM (0x00000070), id: (0000000000000000), size: 149 | 
|  | 374 | # | 
|  | 375 |  | 
|  | 376 | write_le32(0x00000070);			# Type | 
|  | 377 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 378 | write_le32(149);			# Size | 
|  | 379 | write_hunk_fix_endian(868488, 149); | 
|  | 380 |  | 
|  | 381 | # | 
|  | 382 | # Firmware 25, type: STD FW    D2620 DTV7 (0x00000088), id: (0000000000000000), size: 149 | 
|  | 383 | # | 
|  | 384 |  | 
|  | 385 | write_le32(0x00000088);			# Type | 
|  | 386 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 387 | write_le32(149);			# Size | 
|  | 388 | write_hunk_fix_endian(868648, 149); | 
|  | 389 |  | 
|  | 390 | # | 
|  | 391 | # Firmware 26, type: STD FW    D2633 DTV7 (0x00000090), id: (0000000000000000), size: 149 | 
|  | 392 | # | 
|  | 393 |  | 
|  | 394 | write_le32(0x00000090);			# Type | 
|  | 395 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 396 | write_le32(149);			# Size | 
|  | 397 | write_hunk_fix_endian(868800, 149); | 
|  | 398 |  | 
|  | 399 | # | 
|  | 400 | # Firmware 27, type: STD FW    D2620 DTV78 (0x00000108), id: (0000000000000000), size: 149 | 
|  | 401 | # | 
|  | 402 |  | 
|  | 403 | write_le32(0x00000108);			# Type | 
|  | 404 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 405 | write_le32(149);			# Size | 
|  | 406 | write_hunk_fix_endian(868960, 149); | 
|  | 407 |  | 
|  | 408 | # | 
|  | 409 | # Firmware 28, type: STD FW    D2633 DTV78 (0x00000110), id: (0000000000000000), size: 149 | 
|  | 410 | # | 
|  | 411 |  | 
|  | 412 | write_le32(0x00000110);			# Type | 
|  | 413 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 414 | write_le32(149);			# Size | 
|  | 415 | write_hunk_fix_endian(869112, 149); | 
|  | 416 |  | 
|  | 417 | # | 
|  | 418 | # Firmware 29, type: STD FW    D2620 DTV8 (0x00000208), id: (0000000000000000), size: 149 | 
|  | 419 | # | 
|  | 420 |  | 
|  | 421 | write_le32(0x00000208);			# Type | 
|  | 422 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 423 | write_le32(149);			# Size | 
|  | 424 | write_hunk_fix_endian(868648, 149); | 
|  | 425 |  | 
|  | 426 | # | 
|  | 427 | # Firmware 30, type: STD FW    D2633 DTV8 (0x00000210), id: (0000000000000000), size: 149 | 
|  | 428 | # | 
|  | 429 |  | 
|  | 430 | write_le32(0x00000210);			# Type | 
|  | 431 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 432 | write_le32(149);			# Size | 
|  | 433 | write_hunk_fix_endian(868800, 149); | 
|  | 434 |  | 
|  | 435 | # | 
|  | 436 | # Firmware 31, type: STD FW    FM (0x00000400), id: (0000000000000000), size: 135 | 
|  | 437 | # | 
|  | 438 |  | 
|  | 439 | write_le32(0x00000400);			# Type | 
|  | 440 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 441 | write_le32(135);			# Size | 
|  | 442 | write_hunk_fix_endian(869584, 135); | 
|  | 443 |  | 
|  | 444 | # | 
|  | 445 | # Firmware 32, type: STD FW    (0x00000000), id: PAL/I (0000000000000010), size: 161 | 
|  | 446 | # | 
|  | 447 |  | 
|  | 448 | write_le32(0x00000000);			# Type | 
|  | 449 | write_le64(0x00000000, 0x00000010);	# ID | 
|  | 450 | write_le32(161);			# Size | 
|  | 451 | write_hunk_fix_endian(869728, 161); | 
|  | 452 |  | 
|  | 453 | # | 
|  | 454 | # Firmware 33, type: STD FW    MTS (0x00000004), id: PAL/I (0000000000000010), size: 169 | 
|  | 455 | # | 
|  | 456 |  | 
|  | 457 | write_le32(0x00000004);			# Type | 
|  | 458 | write_le64(0x00000000, 0x00000010);	# ID | 
|  | 459 | write_le32(169);			# Size | 
|  | 460 | write_hunk_fix_endian(869896, 169); | 
|  | 461 |  | 
|  | 462 | # | 
|  | 463 | # Firmware 34, type: STD FW    (0x00000000), id: SECAM/L AM (0000001000400000), size: 169 | 
|  | 464 | # | 
|  | 465 |  | 
|  | 466 | write_le32(0x00000000);			# Type | 
|  | 467 | write_le64(0x00000010, 0x00400000);	# ID | 
|  | 468 | write_le32(169);			# Size | 
|  | 469 | write_hunk_fix_endian(870072, 169); | 
|  | 470 |  | 
|  | 471 | # | 
|  | 472 | # Firmware 35, type: STD FW    (0x00000000), id: SECAM/L NICAM (0000000c00400000), size: 161 | 
|  | 473 | # | 
|  | 474 |  | 
|  | 475 | write_le32(0x00000000);			# Type | 
|  | 476 | write_le64(0x0000000c, 0x00400000);	# ID | 
|  | 477 | write_le32(161);			# Size | 
|  | 478 | write_hunk_fix_endian(870248, 161); | 
|  | 479 |  | 
|  | 480 | # | 
|  | 481 | # Firmware 36, type: STD FW    (0x00000000), id: SECAM/Lc (0000000000800000), size: 161 | 
|  | 482 | # | 
|  | 483 |  | 
|  | 484 | write_le32(0x00000000);			# Type | 
|  | 485 | write_le64(0x00000000, 0x00800000);	# ID | 
|  | 486 | write_le32(161);			# Size | 
|  | 487 | write_hunk_fix_endian(870416, 161); | 
|  | 488 |  | 
|  | 489 | # | 
|  | 490 | # Firmware 37, type: STD FW    (0x00000000), id: NTSC/M Kr (0000000000008000), size: 161 | 
|  | 491 | # | 
|  | 492 |  | 
|  | 493 | write_le32(0x00000000);			# Type | 
|  | 494 | write_le64(0x00000000, 0x00008000);	# ID | 
|  | 495 | write_le32(161);			# Size | 
|  | 496 | write_hunk_fix_endian(870584, 161); | 
|  | 497 |  | 
|  | 498 | # | 
|  | 499 | # Firmware 38, type: STD FW    LCD (0x00001000), id: NTSC/M Kr (0000000000008000), size: 161 | 
|  | 500 | # | 
|  | 501 |  | 
|  | 502 | write_le32(0x00001000);			# Type | 
|  | 503 | write_le64(0x00000000, 0x00008000);	# ID | 
|  | 504 | write_le32(161);			# Size | 
|  | 505 | write_hunk_fix_endian(870752, 161); | 
|  | 506 |  | 
|  | 507 | # | 
|  | 508 | # Firmware 39, type: STD FW    LCD NOGD (0x00003000), id: NTSC/M Kr (0000000000008000), size: 161 | 
|  | 509 | # | 
|  | 510 |  | 
|  | 511 | write_le32(0x00003000);			# Type | 
|  | 512 | write_le64(0x00000000, 0x00008000);	# ID | 
|  | 513 | write_le32(161);			# Size | 
|  | 514 | write_hunk_fix_endian(870920, 161); | 
|  | 515 |  | 
|  | 516 | # | 
|  | 517 | # Firmware 40, type: STD FW    MTS (0x00000004), id: NTSC/M Kr (0000000000008000), size: 169 | 
|  | 518 | # | 
|  | 519 |  | 
|  | 520 | write_le32(0x00000004);			# Type | 
|  | 521 | write_le64(0x00000000, 0x00008000);	# ID | 
|  | 522 | write_le32(169);			# Size | 
|  | 523 | write_hunk_fix_endian(871088, 169); | 
|  | 524 |  | 
|  | 525 | # | 
|  | 526 | # Firmware 41, type: STD FW    (0x00000000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161 | 
|  | 527 | # | 
|  | 528 |  | 
|  | 529 | write_le32(0x00000000);			# Type | 
|  | 530 | write_le64(0x00000000, 0x0000b700);	# ID | 
|  | 531 | write_le32(161);			# Size | 
|  | 532 | write_hunk_fix_endian(871264, 161); | 
|  | 533 |  | 
|  | 534 | # | 
|  | 535 | # Firmware 42, type: STD FW    LCD (0x00001000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161 | 
|  | 536 | # | 
|  | 537 |  | 
|  | 538 | write_le32(0x00001000);			# Type | 
|  | 539 | write_le64(0x00000000, 0x0000b700);	# ID | 
|  | 540 | write_le32(161);			# Size | 
|  | 541 | write_hunk_fix_endian(871432, 161); | 
|  | 542 |  | 
|  | 543 | # | 
|  | 544 | # Firmware 43, type: STD FW    LCD NOGD (0x00003000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161 | 
|  | 545 | # | 
|  | 546 |  | 
|  | 547 | write_le32(0x00003000);			# Type | 
|  | 548 | write_le64(0x00000000, 0x0000b700);	# ID | 
|  | 549 | write_le32(161);			# Size | 
|  | 550 | write_hunk_fix_endian(871600, 161); | 
|  | 551 |  | 
|  | 552 | # | 
|  | 553 | # Firmware 44, type: STD FW    (0x00000000), id: NTSC/M Jp (0000000000002000), size: 161 | 
|  | 554 | # | 
|  | 555 |  | 
|  | 556 | write_le32(0x00000000);			# Type | 
|  | 557 | write_le64(0x00000000, 0x00002000);	# ID | 
|  | 558 | write_le32(161);			# Size | 
|  | 559 | write_hunk_fix_endian(871264, 161); | 
|  | 560 |  | 
|  | 561 | # | 
|  | 562 | # Firmware 45, type: STD FW    MTS (0x00000004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169 | 
|  | 563 | # | 
|  | 564 |  | 
|  | 565 | write_le32(0x00000004);			# Type | 
|  | 566 | write_le64(0x00000000, 0x0000b700);	# ID | 
|  | 567 | write_le32(169);			# Size | 
|  | 568 | write_hunk_fix_endian(871936, 169); | 
|  | 569 |  | 
|  | 570 | # | 
|  | 571 | # Firmware 46, type: STD FW    MTS LCD (0x00001004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169 | 
|  | 572 | # | 
|  | 573 |  | 
|  | 574 | write_le32(0x00001004);			# Type | 
|  | 575 | write_le64(0x00000000, 0x0000b700);	# ID | 
|  | 576 | write_le32(169);			# Size | 
|  | 577 | write_hunk_fix_endian(872112, 169); | 
|  | 578 |  | 
|  | 579 | # | 
|  | 580 | # Firmware 47, type: STD FW    MTS LCD NOGD (0x00003004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169 | 
|  | 581 | # | 
|  | 582 |  | 
|  | 583 | write_le32(0x00003004);			# Type | 
|  | 584 | write_le64(0x00000000, 0x0000b700);	# ID | 
|  | 585 | write_le32(169);			# Size | 
|  | 586 | write_hunk_fix_endian(872288, 169); | 
|  | 587 |  | 
|  | 588 | # | 
|  | 589 | # Firmware 48, type: SCODE FW  HAS IF (0x60000000), IF = 3.28 MHz id: (0000000000000000), size: 192 | 
|  | 590 | # | 
|  | 591 |  | 
|  | 592 | write_le32(0x60000000);			# Type | 
|  | 593 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 594 | write_le16(3280);			# IF | 
|  | 595 | write_le32(192);			# Size | 
|  | 596 | write_hunk(811896, 192); | 
|  | 597 |  | 
|  | 598 | # | 
|  | 599 | # Firmware 49, type: SCODE FW  HAS IF (0x60000000), IF = 3.30 MHz id: (0000000000000000), size: 192 | 
|  | 600 | # | 
|  | 601 |  | 
|  | 602 | write_le32(0x60000000);			# Type | 
|  | 603 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 604 | write_le16(3300);			# IF | 
|  | 605 | write_le32(192);			# Size | 
|  | 606 | write_hunk(813048, 192); | 
|  | 607 |  | 
|  | 608 | # | 
|  | 609 | # Firmware 50, type: SCODE FW  HAS IF (0x60000000), IF = 3.44 MHz id: (0000000000000000), size: 192 | 
|  | 610 | # | 
|  | 611 |  | 
|  | 612 | write_le32(0x60000000);			# Type | 
|  | 613 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 614 | write_le16(3440);			# IF | 
|  | 615 | write_le32(192);			# Size | 
|  | 616 | write_hunk(812280, 192); | 
|  | 617 |  | 
|  | 618 | # | 
|  | 619 | # Firmware 51, type: SCODE FW  HAS IF (0x60000000), IF = 3.46 MHz id: (0000000000000000), size: 192 | 
|  | 620 | # | 
|  | 621 |  | 
|  | 622 | write_le32(0x60000000);			# Type | 
|  | 623 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 624 | write_le16(3460);			# IF | 
|  | 625 | write_le32(192);			# Size | 
|  | 626 | write_hunk(812472, 192); | 
|  | 627 |  | 
|  | 628 | # | 
|  | 629 | # Firmware 52, type: SCODE FW  DTV6 ATSC OREN36 HAS IF (0x60210020), IF = 3.80 MHz id: (0000000000000000), size: 192 | 
|  | 630 | # | 
|  | 631 |  | 
|  | 632 | write_le32(0x60210020);			# Type | 
|  | 633 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 634 | write_le16(3800);			# IF | 
|  | 635 | write_le32(192);			# Size | 
|  | 636 | write_hunk(809784, 192); | 
|  | 637 |  | 
|  | 638 | # | 
|  | 639 | # Firmware 53, type: SCODE FW  HAS IF (0x60000000), IF = 4.00 MHz id: (0000000000000000), size: 192 | 
|  | 640 | # | 
|  | 641 |  | 
|  | 642 | write_le32(0x60000000);			# Type | 
|  | 643 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 644 | write_le16(4000);			# IF | 
|  | 645 | write_le32(192);			# Size | 
|  | 646 | write_hunk(812088, 192); | 
|  | 647 |  | 
|  | 648 | # | 
|  | 649 | # Firmware 54, type: SCODE FW  DTV6 ATSC TOYOTA388 HAS IF (0x60410020), IF = 4.08 MHz id: (0000000000000000), size: 192 | 
|  | 650 | # | 
|  | 651 |  | 
|  | 652 | write_le32(0x60410020);			# Type | 
|  | 653 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 654 | write_le16(4080);			# IF | 
|  | 655 | write_le32(192);			# Size | 
|  | 656 | write_hunk(809976, 192); | 
|  | 657 |  | 
|  | 658 | # | 
|  | 659 | # Firmware 55, type: SCODE FW  HAS IF (0x60000000), IF = 4.20 MHz id: (0000000000000000), size: 192 | 
|  | 660 | # | 
|  | 661 |  | 
|  | 662 | write_le32(0x60000000);			# Type | 
|  | 663 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 664 | write_le16(4200);			# IF | 
|  | 665 | write_le32(192);			# Size | 
|  | 666 | write_hunk(811704, 192); | 
|  | 667 |  | 
|  | 668 | # | 
|  | 669 | # Firmware 56, type: SCODE FW  MONO HAS IF (0x60008000), IF = 4.32 MHz id: NTSC/M Kr (0000000000008000), size: 192 | 
|  | 670 | # | 
|  | 671 |  | 
|  | 672 | write_le32(0x60008000);			# Type | 
|  | 673 | write_le64(0x00000000, 0x00008000);	# ID | 
|  | 674 | write_le16(4320);			# IF | 
|  | 675 | write_le32(192);			# Size | 
|  | 676 | write_hunk(808056, 192); | 
|  | 677 |  | 
|  | 678 | # | 
|  | 679 | # Firmware 57, type: SCODE FW  HAS IF (0x60000000), IF = 4.45 MHz id: (0000000000000000), size: 192 | 
|  | 680 | # | 
|  | 681 |  | 
|  | 682 | write_le32(0x60000000);			# Type | 
|  | 683 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 684 | write_le16(4450);			# IF | 
|  | 685 | write_le32(192);			# Size | 
|  | 686 | write_hunk(812664, 192); | 
|  | 687 |  | 
|  | 688 | # | 
|  | 689 | # Firmware 58, type: SCODE FW  HAS IF (0x60000000), IF = 4.50 MHz id: NTSC/M Jp (0000000000002000), size: 192 | 
|  | 690 | # | 
|  | 691 |  | 
|  | 692 | write_le32(0x60000000);			# Type | 
|  | 693 | write_le64(0x00000000, 0x00002000);	# ID | 
|  | 694 | write_le16(4500);			# IF | 
|  | 695 | write_le32(192);			# Size | 
|  | 696 | write_hunk(807672, 192); | 
|  | 697 |  | 
|  | 698 | # | 
|  | 699 | # Firmware 59, type: SCODE FW  LCD NOGD IF HAS IF (0x60023000), IF = 4.60 MHz id: NTSC/M Kr (0000000000008000), size: 192 | 
|  | 700 | # | 
|  | 701 |  | 
|  | 702 | write_le32(0x60023000);			# Type | 
|  | 703 | write_le64(0x00000000, 0x00008000);	# ID | 
|  | 704 | write_le16(4600);			# IF | 
|  | 705 | write_le32(192);			# Size | 
|  | 706 | write_hunk(807864, 192); | 
|  | 707 |  | 
|  | 708 | # | 
|  | 709 | # Firmware 60, type: SCODE FW  DTV78 ZARLINK456 HAS IF (0x62000100), IF = 4.76 MHz id: (0000000000000000), size: 192 | 
|  | 710 | # | 
|  | 711 |  | 
|  | 712 | write_le32(0x62000100);			# Type | 
|  | 713 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 714 | write_le16(4760);			# IF | 
|  | 715 | write_le32(192);			# Size | 
|  | 716 | write_hunk(807288, 192); | 
|  | 717 |  | 
|  | 718 | # | 
|  | 719 | # Firmware 61, type: SCODE FW  HAS IF (0x60000000), IF = 4.94 MHz id: (0000000000000000), size: 192 | 
|  | 720 | # | 
|  | 721 |  | 
|  | 722 | write_le32(0x60000000);			# Type | 
|  | 723 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 724 | write_le16(4940);			# IF | 
|  | 725 | write_le32(192);			# Size | 
|  | 726 | write_hunk(811512, 192); | 
|  | 727 |  | 
|  | 728 | # | 
|  | 729 | # Firmware 62, type: SCODE FW  DTV7 ZARLINK456 HAS IF (0x62000080), IF = 5.26 MHz id: (0000000000000000), size: 192 | 
|  | 730 | # | 
|  | 731 |  | 
|  | 732 | write_le32(0x62000080);			# Type | 
|  | 733 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 734 | write_le16(5260);			# IF | 
|  | 735 | write_le32(192);			# Size | 
|  | 736 | write_hunk(810552, 192); | 
|  | 737 |  | 
|  | 738 | # | 
|  | 739 | # Firmware 63, type: SCODE FW  MONO HAS IF (0x60008000), IF = 5.32 MHz id: PAL/BG NICAM/B (0000000800000007), size: 192 | 
|  | 740 | # | 
|  | 741 |  | 
|  | 742 | write_le32(0x60008000);			# Type | 
|  | 743 | write_le64(0x00000008, 0x00000007);	# ID | 
|  | 744 | write_le16(5320);			# IF | 
|  | 745 | write_le32(192);			# Size | 
|  | 746 | write_hunk(810744, 192); | 
|  | 747 |  | 
|  | 748 | # | 
|  | 749 | # Firmware 64, type: SCODE FW  DTV8 CHINA HAS IF (0x64000200), IF = 5.40 MHz id: (0000000000000000), size: 192 | 
|  | 750 | # | 
|  | 751 |  | 
|  | 752 | write_le32(0x64000200);			# Type | 
|  | 753 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 754 | write_le16(5400);			# IF | 
|  | 755 | write_le32(192);			# Size | 
|  | 756 | write_hunk(807096, 192); | 
|  | 757 |  | 
|  | 758 | # | 
|  | 759 | # Firmware 65, type: SCODE FW  DTV6 ATSC OREN538 HAS IF (0x60110020), IF = 5.58 MHz id: (0000000000000000), size: 192 | 
|  | 760 | # | 
|  | 761 |  | 
|  | 762 | write_le32(0x60110020);			# Type | 
|  | 763 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 764 | write_le16(5580);			# IF | 
|  | 765 | write_le32(192);			# Size | 
|  | 766 | write_hunk(809592, 192); | 
|  | 767 |  | 
|  | 768 | # | 
|  | 769 | # Firmware 66, type: SCODE FW  HAS IF (0x60000000), IF = 5.64 MHz id: PAL/BG A2/B (0000000200000007), size: 192 | 
|  | 770 | # | 
|  | 771 |  | 
|  | 772 | write_le32(0x60000000);			# Type | 
|  | 773 | write_le64(0x00000002, 0x00000007);	# ID | 
|  | 774 | write_le16(5640);			# IF | 
|  | 775 | write_le32(192);			# Size | 
|  | 776 | write_hunk(808440, 192); | 
|  | 777 |  | 
|  | 778 | # | 
|  | 779 | # Firmware 67, type: SCODE FW  HAS IF (0x60000000), IF = 5.74 MHz id: PAL/BG NICAM/B (0000000800000007), size: 192 | 
|  | 780 | # | 
|  | 781 |  | 
|  | 782 | write_le32(0x60000000);			# Type | 
|  | 783 | write_le64(0x00000008, 0x00000007);	# ID | 
|  | 784 | write_le16(5740);			# IF | 
|  | 785 | write_le32(192);			# Size | 
|  | 786 | write_hunk(808632, 192); | 
|  | 787 |  | 
|  | 788 | # | 
|  | 789 | # Firmware 68, type: SCODE FW  DTV7 DIBCOM52 HAS IF (0x61000080), IF = 5.90 MHz id: (0000000000000000), size: 192 | 
|  | 790 | # | 
|  | 791 |  | 
|  | 792 | write_le32(0x61000080);			# Type | 
|  | 793 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 794 | write_le16(5900);			# IF | 
|  | 795 | write_le32(192);			# Size | 
|  | 796 | write_hunk(810360, 192); | 
|  | 797 |  | 
|  | 798 | # | 
|  | 799 | # Firmware 69, type: SCODE FW  MONO HAS IF (0x60008000), IF = 6.00 MHz id: PAL/I (0000000000000010), size: 192 | 
|  | 800 | # | 
|  | 801 |  | 
|  | 802 | write_le32(0x60008000);			# Type | 
|  | 803 | write_le64(0x00000000, 0x00000010);	# ID | 
|  | 804 | write_le16(6000);			# IF | 
|  | 805 | write_le32(192);			# Size | 
|  | 806 | write_hunk(808824, 192); | 
|  | 807 |  | 
|  | 808 | # | 
|  | 809 | # Firmware 70, type: SCODE FW  DTV6 QAM F6MHZ HAS IF (0x68000060), IF = 6.20 MHz id: (0000000000000000), size: 192 | 
|  | 810 | # | 
|  | 811 |  | 
|  | 812 | write_le32(0x68000060);			# Type | 
|  | 813 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 814 | write_le16(6200);			# IF | 
|  | 815 | write_le32(192);			# Size | 
|  | 816 | write_hunk(809400, 192); | 
|  | 817 |  | 
|  | 818 | # | 
|  | 819 | # Firmware 71, type: SCODE FW  HAS IF (0x60000000), IF = 6.24 MHz id: PAL/I (0000000000000010), size: 192 | 
|  | 820 | # | 
|  | 821 |  | 
|  | 822 | write_le32(0x60000000);			# Type | 
|  | 823 | write_le64(0x00000000, 0x00000010);	# ID | 
|  | 824 | write_le16(6240);			# IF | 
|  | 825 | write_le32(192);			# Size | 
|  | 826 | write_hunk(808248, 192); | 
|  | 827 |  | 
|  | 828 | # | 
|  | 829 | # Firmware 72, type: SCODE FW  MONO HAS IF (0x60008000), IF = 6.32 MHz id: SECAM/K1 (0000000000200000), size: 192 | 
|  | 830 | # | 
|  | 831 |  | 
|  | 832 | write_le32(0x60008000);			# Type | 
|  | 833 | write_le64(0x00000000, 0x00200000);	# ID | 
|  | 834 | write_le16(6320);			# IF | 
|  | 835 | write_le32(192);			# Size | 
|  | 836 | write_hunk(811320, 192); | 
|  | 837 |  | 
|  | 838 | # | 
|  | 839 | # Firmware 73, type: SCODE FW  HAS IF (0x60000000), IF = 6.34 MHz id: SECAM/K1 (0000000000200000), size: 192 | 
|  | 840 | # | 
|  | 841 |  | 
|  | 842 | write_le32(0x60000000);			# Type | 
|  | 843 | write_le64(0x00000000, 0x00200000);	# ID | 
|  | 844 | write_le16(6340);			# IF | 
|  | 845 | write_le32(192);			# Size | 
|  | 846 | write_hunk(809208, 192); | 
|  | 847 |  | 
|  | 848 | # | 
|  | 849 | # Firmware 74, type: SCODE FW  MONO HAS IF (0x60008000), IF = 6.50 MHz id: SECAM/K3 (0000000004000000), size: 192 | 
|  | 850 | # | 
|  | 851 |  | 
|  | 852 | write_le32(0x60008000);			# Type | 
|  | 853 | write_le64(0x00000000, 0x04000000);	# ID | 
|  | 854 | write_le16(6500);			# IF | 
|  | 855 | write_le32(192);			# Size | 
|  | 856 | write_hunk(811128, 192); | 
|  | 857 |  | 
|  | 858 | # | 
|  | 859 | # Firmware 75, type: SCODE FW  DTV6 ATSC ATI638 HAS IF (0x60090020), IF = 6.58 MHz id: (0000000000000000), size: 192 | 
|  | 860 | # | 
|  | 861 |  | 
|  | 862 | write_le32(0x60090020);			# Type | 
|  | 863 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 864 | write_le16(6580);			# IF | 
|  | 865 | write_le32(192);			# Size | 
|  | 866 | write_hunk(807480, 192); | 
|  | 867 |  | 
|  | 868 | # | 
|  | 869 | # Firmware 76, type: SCODE FW  HAS IF (0x60000000), IF = 6.60 MHz id: PAL/DK A2 (00000003000000e0), size: 192 | 
|  | 870 | # | 
|  | 871 |  | 
|  | 872 | write_le32(0x60000000);			# Type | 
|  | 873 | write_le64(0x00000003, 0x000000e0);	# ID | 
|  | 874 | write_le16(6600);			# IF | 
|  | 875 | write_le32(192);			# Size | 
|  | 876 | write_hunk(809016, 192); | 
|  | 877 |  | 
|  | 878 | # | 
|  | 879 | # Firmware 77, type: SCODE FW  MONO HAS IF (0x60008000), IF = 6.68 MHz id: PAL/DK A2 (00000003000000e0), size: 192 | 
|  | 880 | # | 
|  | 881 |  | 
|  | 882 | write_le32(0x60008000);			# Type | 
|  | 883 | write_le64(0x00000003, 0x000000e0);	# ID | 
|  | 884 | write_le16(6680);			# IF | 
|  | 885 | write_le32(192);			# Size | 
|  | 886 | write_hunk(810936, 192); | 
|  | 887 |  | 
|  | 888 | # | 
|  | 889 | # Firmware 78, type: SCODE FW  DTV6 ATSC TOYOTA794 HAS IF (0x60810020), IF = 8.14 MHz id: (0000000000000000), size: 192 | 
|  | 890 | # | 
|  | 891 |  | 
|  | 892 | write_le32(0x60810020);			# Type | 
|  | 893 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 894 | write_le16(8140);			# IF | 
|  | 895 | write_le32(192);			# Size | 
|  | 896 | write_hunk(810168, 192); | 
|  | 897 |  | 
|  | 898 | # | 
|  | 899 | # Firmware 79, type: SCODE FW  HAS IF (0x60000000), IF = 8.20 MHz id: (0000000000000000), size: 192 | 
|  | 900 | # | 
|  | 901 |  | 
|  | 902 | write_le32(0x60000000);			# Type | 
|  | 903 | write_le64(0x00000000, 0x00000000);	# ID | 
|  | 904 | write_le16(8200);			# IF | 
|  | 905 | write_le32(192);			# Size | 
|  | 906 | write_hunk(812856, 192); | 
|  | 907 | } | 
|  | 908 |  | 
|  | 909 | sub extract_firmware { | 
|  | 910 | my $sourcefile = "hcw85bda.sys"; | 
|  | 911 | my $hash = "0e44dbf63bb0169d57446aec21881ff2"; | 
|  | 912 | my $outfile = "xc3028-v27.fw"; | 
|  | 913 | my $name = "xc2028 firmware"; | 
|  | 914 | my $version = 519; | 
|  | 915 | my $nr_desc = 80; | 
|  | 916 | my $out; | 
|  | 917 |  | 
|  | 918 | verify($sourcefile, $hash); | 
|  | 919 |  | 
|  | 920 | open INFILE, "<$sourcefile"; | 
|  | 921 | main_firmware($outfile, $name, $version, $nr_desc); | 
|  | 922 | close INFILE; | 
|  | 923 | } | 
|  | 924 |  | 
|  | 925 | extract_firmware; | 
|  | 926 | printf "Firmwares generated.\n"; |