sync to Linus v4.13-rc2 for subsystem developers to work against
[platform/kernel/linux-rpi.git] / scripts / extract_xc3028.pl
1 #!/usr/bin/env 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 #       Version 2.4
9 #               wget http://www.twinhan.com/files/AW/BDA T/20080303_V1.0.6.7.zip
10 #               or wget http://www.stefanringel.de/pub/20080303_V1.0.6.7.zip
11 #       Version 2.7
12 #               wget http://www.steventoth.net/linux/xc5000/HVR-12x0-14x0-17x0_1_25_25271_WHQL.zip
13 #       2) Extract the files from the zip into the current dir:
14 #               unzip -j 20080303_V1.0.6.7.zip 20080303_v1.0.6.7/UDXTTM6000.sys
15 #               unzip -j HVR-12x0-14x0-17x0_1_25_25271_WHQL.zip Driver85/hcw85bda.sys
16 #       3) run the script:
17 #               ./extract_xc3028.pl
18 #       4) copy the generated files:
19 #               cp xc3028-v24.fw /lib/firmware
20 #               cp xc3028-v27.fw /lib/firmware
21
22 #use strict;
23 use IO::Handle;
24
25 my $debug=0;
26
27 sub verify ($$)
28 {
29         my ($filename, $hash) = @_;
30         my ($testhash);
31
32         if (system("which md5sum > /dev/null 2>&1")) {
33                 die "This firmware requires the md5sum command - see http://www.gnu.org/software/coreutils/\n";
34         }
35
36         open(CMD, "md5sum ".$filename."|");
37         $testhash = <CMD>;
38         $testhash =~ /([a-zA-Z0-9]*)/;
39         $testhash = $1;
40         close CMD;
41                 die "Hash of extracted file does not match (found $testhash, expected $hash!\n" if ($testhash ne $hash);
42 }
43
44 sub get_hunk ($$)
45 {
46         my ($offset, $length) = @_;
47         my ($chunklength, $buf, $rcount, $out);
48
49         sysseek(INFILE, $offset, SEEK_SET);
50         while ($length > 0) {
51         # Calc chunk size
52                 $chunklength = 2048;
53                 $chunklength = $length if ($chunklength > $length);
54
55                 $rcount = sysread(INFILE, $buf, $chunklength);
56                 die "Ran out of data\n" if ($rcount != $chunklength);
57                 $out .= $buf;
58                 $length -= $rcount;
59         }
60         return $out;
61 }
62
63 sub write_le16($)
64 {
65         my $val = shift;
66         my $msb = ($val >> 8) &0xff;
67         my $lsb = $val & 0xff;
68
69         syswrite(OUTFILE, chr($lsb).chr($msb));
70 }
71
72 sub write_le32($)
73 {
74         my $val = shift;
75         my $l3 = ($val >> 24) & 0xff;
76         my $l2 = ($val >> 16) & 0xff;
77         my $l1 = ($val >> 8)  & 0xff;
78         my $l0 = $val         & 0xff;
79
80         syswrite(OUTFILE, chr($l0).chr($l1).chr($l2).chr($l3));
81 }
82
83 sub write_le64($$)
84 {
85         my $msb_val = shift;
86         my $lsb_val = shift;
87         my $l7 = ($msb_val >> 24) & 0xff;
88         my $l6 = ($msb_val >> 16) & 0xff;
89         my $l5 = ($msb_val >> 8)  & 0xff;
90         my $l4 = $msb_val         & 0xff;
91
92         my $l3 = ($lsb_val >> 24) & 0xff;
93         my $l2 = ($lsb_val >> 16) & 0xff;
94         my $l1 = ($lsb_val >> 8)  & 0xff;
95         my $l0 = $lsb_val         & 0xff;
96
97         syswrite(OUTFILE,
98                  chr($l0).chr($l1).chr($l2).chr($l3).
99                  chr($l4).chr($l5).chr($l6).chr($l7));
100 }
101
102 sub write_hunk($$)
103 {
104         my ($offset, $length) = @_;
105         my $out = get_hunk($offset, $length);
106
107         printf "(len %d) ",$length if ($debug);
108
109         for (my $i=0;$i<$length;$i++) {
110                 printf "%02x ",ord(substr($out,$i,1)) if ($debug);
111         }
112         printf "\n" if ($debug);
113
114         syswrite(OUTFILE, $out);
115 }
116
117 sub write_hunk_fix_endian($$)
118 {
119         my ($offset, $length) = @_;
120         my $out = get_hunk($offset, $length);
121
122         printf "(len_fix %d) ",$length if ($debug);
123
124         for (my $i=0;$i<$length;$i++) {
125                 printf "%02x ",ord(substr($out,$i,1)) if ($debug);
126         }
127         printf "\n" if ($debug);
128
129         my $i=0;
130         while ($i<$length) {
131                 my $size = ord(substr($out,$i,1))*256+ord(substr($out,$i+1,1));
132                 syswrite(OUTFILE, substr($out,$i+1,1));
133                 syswrite(OUTFILE, substr($out,$i,1));
134                 $i+=2;
135                 if ($size>0 && $size <0x8000) {
136                         for (my $j=0;$j<$size;$j++) {
137                                 syswrite(OUTFILE, substr($out,$j+$i,1));
138                         }
139                         $i+=$size;
140                 }
141         }
142 }
143
144 sub main_firmware_24($$$$)
145 {
146         my $out;
147         my $j=0;
148         my $outfile = shift;
149         my $name    = shift;
150         my $version = shift;
151         my $nr_desc = shift;
152
153         for ($j = length($name); $j <32; $j++) {
154                 $name = $name.chr(0);
155         }
156
157         open OUTFILE, ">$outfile";
158         syswrite(OUTFILE, $name);
159         write_le16($version);
160         write_le16($nr_desc);
161
162         #
163         # Firmware 0, type: BASE FW   F8MHZ (0x00000003), id: (0000000000000000), size: 6635
164         #
165
166         write_le32(0x00000003);                 # Type
167         write_le64(0x00000000, 0x00000000);     # ID
168         write_le32(6635);                       # Size
169         write_hunk_fix_endian(257752, 6635);
170
171         #
172         # Firmware 1, type: BASE FW   F8MHZ MTS (0x00000007), id: (0000000000000000), size: 6635
173         #
174
175         write_le32(0x00000007);                 # Type
176         write_le64(0x00000000, 0x00000000);     # ID
177         write_le32(6635);                       # Size
178         write_hunk_fix_endian(264392, 6635);
179
180         #
181         # Firmware 2, type: BASE FW   FM (0x00000401), id: (0000000000000000), size: 6525
182         #
183
184         write_le32(0x00000401);                 # Type
185         write_le64(0x00000000, 0x00000000);     # ID
186         write_le32(6525);                       # Size
187         write_hunk_fix_endian(271040, 6525);
188
189         #
190         # Firmware 3, type: BASE FW   FM INPUT1 (0x00000c01), id: (0000000000000000), size: 6539
191         #
192
193         write_le32(0x00000c01);                 # Type
194         write_le64(0x00000000, 0x00000000);     # ID
195         write_le32(6539);                       # Size
196         write_hunk_fix_endian(277568, 6539);
197
198         #
199         # Firmware 4, type: BASE FW   (0x00000001), id: (0000000000000000), size: 6633
200         #
201
202         write_le32(0x00000001);                 # Type
203         write_le64(0x00000000, 0x00000000);     # ID
204         write_le32(6633);                       # Size
205         write_hunk_fix_endian(284120, 6633);
206
207         #
208         # Firmware 5, type: BASE FW   MTS (0x00000005), id: (0000000000000000), size: 6617
209         #
210
211         write_le32(0x00000005);                 # Type
212         write_le64(0x00000000, 0x00000000);     # ID
213         write_le32(6617);                       # Size
214         write_hunk_fix_endian(290760, 6617);
215
216         #
217         # Firmware 6, type: STD FW    (0x00000000), id: PAL/BG A2/A (0000000100000007), size: 161
218         #
219
220         write_le32(0x00000000);                 # Type
221         write_le64(0x00000001, 0x00000007);     # ID
222         write_le32(161);                        # Size
223         write_hunk_fix_endian(297384, 161);
224
225         #
226         # Firmware 7, type: STD FW    MTS (0x00000004), id: PAL/BG A2/A (0000000100000007), size: 169
227         #
228
229         write_le32(0x00000004);                 # Type
230         write_le64(0x00000001, 0x00000007);     # ID
231         write_le32(169);                        # Size
232         write_hunk_fix_endian(297552, 169);
233
234         #
235         # Firmware 8, type: STD FW    (0x00000000), id: PAL/BG A2/B (0000000200000007), size: 161
236         #
237
238         write_le32(0x00000000);                 # Type
239         write_le64(0x00000002, 0x00000007);     # ID
240         write_le32(161);                        # Size
241         write_hunk_fix_endian(297728, 161);
242
243         #
244         # Firmware 9, type: STD FW    MTS (0x00000004), id: PAL/BG A2/B (0000000200000007), size: 169
245         #
246
247         write_le32(0x00000004);                 # Type
248         write_le64(0x00000002, 0x00000007);     # ID
249         write_le32(169);                        # Size
250         write_hunk_fix_endian(297896, 169);
251
252         #
253         # Firmware 10, type: STD FW    (0x00000000), id: PAL/BG NICAM/A (0000000400000007), size: 161
254         #
255
256         write_le32(0x00000000);                 # Type
257         write_le64(0x00000004, 0x00000007);     # ID
258         write_le32(161);                        # Size
259         write_hunk_fix_endian(298072, 161);
260
261         #
262         # Firmware 11, type: STD FW    MTS (0x00000004), id: PAL/BG NICAM/A (0000000400000007), size: 169
263         #
264
265         write_le32(0x00000004);                 # Type
266         write_le64(0x00000004, 0x00000007);     # ID
267         write_le32(169);                        # Size
268         write_hunk_fix_endian(298240, 169);
269
270         #
271         # Firmware 12, type: STD FW    (0x00000000), id: PAL/BG NICAM/B (0000000800000007), size: 161
272         #
273
274         write_le32(0x00000000);                 # Type
275         write_le64(0x00000008, 0x00000007);     # ID
276         write_le32(161);                        # Size
277         write_hunk_fix_endian(298416, 161);
278
279         #
280         # Firmware 13, type: STD FW    MTS (0x00000004), id: PAL/BG NICAM/B (0000000800000007), size: 169
281         #
282
283         write_le32(0x00000004);                 # Type
284         write_le64(0x00000008, 0x00000007);     # ID
285         write_le32(169);                        # Size
286         write_hunk_fix_endian(298584, 169);
287
288         #
289         # Firmware 14, type: STD FW    (0x00000000), id: PAL/DK A2 (00000003000000e0), size: 161
290         #
291
292         write_le32(0x00000000);                 # Type
293         write_le64(0x00000003, 0x000000e0);     # ID
294         write_le32(161);                        # Size
295         write_hunk_fix_endian(298760, 161);
296
297         #
298         # Firmware 15, type: STD FW    MTS (0x00000004), id: PAL/DK A2 (00000003000000e0), size: 169
299         #
300
301         write_le32(0x00000004);                 # Type
302         write_le64(0x00000003, 0x000000e0);     # ID
303         write_le32(169);                        # Size
304         write_hunk_fix_endian(298928, 169);
305
306         #
307         # Firmware 16, type: STD FW    (0x00000000), id: PAL/DK NICAM (0000000c000000e0), size: 161
308         #
309
310         write_le32(0x00000000);                 # Type
311         write_le64(0x0000000c, 0x000000e0);     # ID
312         write_le32(161);                        # Size
313         write_hunk_fix_endian(299104, 161);
314
315         #
316         # Firmware 17, type: STD FW    MTS (0x00000004), id: PAL/DK NICAM (0000000c000000e0), size: 169
317         #
318
319         write_le32(0x00000004);                 # Type
320         write_le64(0x0000000c, 0x000000e0);     # ID
321         write_le32(169);                        # Size
322         write_hunk_fix_endian(299272, 169);
323
324         #
325         # Firmware 18, type: STD FW    (0x00000000), id: SECAM/K1 (0000000000200000), size: 161
326         #
327
328         write_le32(0x00000000);                 # Type
329         write_le64(0x00000000, 0x00200000);     # ID
330         write_le32(161);                        # Size
331         write_hunk_fix_endian(299448, 161);
332
333         #
334         # Firmware 19, type: STD FW    MTS (0x00000004), id: SECAM/K1 (0000000000200000), size: 169
335         #
336
337         write_le32(0x00000004);                 # Type
338         write_le64(0x00000000, 0x00200000);     # ID
339         write_le32(169);                        # Size
340         write_hunk_fix_endian(299616, 169);
341
342         #
343         # Firmware 20, type: STD FW    (0x00000000), id: SECAM/K3 (0000000004000000), size: 161
344         #
345
346         write_le32(0x00000000);                 # Type
347         write_le64(0x00000000, 0x04000000);     # ID
348         write_le32(161);                        # Size
349         write_hunk_fix_endian(299792, 161);
350
351         #
352         # Firmware 21, type: STD FW    MTS (0x00000004), id: SECAM/K3 (0000000004000000), size: 169
353         #
354
355         write_le32(0x00000004);                 # Type
356         write_le64(0x00000000, 0x04000000);     # ID
357         write_le32(169);                        # Size
358         write_hunk_fix_endian(299960, 169);
359
360         #
361         # Firmware 22, type: STD FW    D2633 DTV6 ATSC (0x00010030), id: (0000000000000000), size: 149
362         #
363
364         write_le32(0x00010030);                 # Type
365         write_le64(0x00000000, 0x00000000);     # ID
366         write_le32(149);                        # Size
367         write_hunk_fix_endian(300136, 149);
368
369         #
370         # Firmware 23, type: STD FW    D2620 DTV6 QAM (0x00000068), id: (0000000000000000), size: 149
371         #
372
373         write_le32(0x00000068);                 # Type
374         write_le64(0x00000000, 0x00000000);     # ID
375         write_le32(149);                        # Size
376         write_hunk_fix_endian(300296, 149);
377
378         #
379         # Firmware 24, type: STD FW    D2633 DTV6 QAM (0x00000070), id: (0000000000000000), size: 149
380         #
381
382         write_le32(0x00000070);                 # Type
383         write_le64(0x00000000, 0x00000000);     # ID
384         write_le32(149);                        # Size
385         write_hunk_fix_endian(300448, 149);
386
387         #
388         # Firmware 25, type: STD FW    D2620 DTV7 (0x00000088), id: (0000000000000000), size: 149
389         #
390
391         write_le32(0x00000088);                 # Type
392         write_le64(0x00000000, 0x00000000);     # ID
393         write_le32(149);                        # Size
394         write_hunk_fix_endian(300608, 149);
395
396         #
397         # Firmware 26, type: STD FW    D2633 DTV7 (0x00000090), id: (0000000000000000), size: 149
398         #
399
400         write_le32(0x00000090);                 # Type
401         write_le64(0x00000000, 0x00000000);     # ID
402         write_le32(149);                        # Size
403         write_hunk_fix_endian(300760, 149);
404
405         #
406         # Firmware 27, type: STD FW    D2620 DTV78 (0x00000108), id: (0000000000000000), size: 149
407         #
408
409         write_le32(0x00000108);                 # Type
410         write_le64(0x00000000, 0x00000000);     # ID
411         write_le32(149);                        # Size
412         write_hunk_fix_endian(300920, 149);
413
414         #
415         # Firmware 28, type: STD FW    D2633 DTV78 (0x00000110), id: (0000000000000000), size: 149
416         #
417
418         write_le32(0x00000110);                 # Type
419         write_le64(0x00000000, 0x00000000);     # ID
420         write_le32(149);                        # Size
421         write_hunk_fix_endian(301072, 149);
422
423         #
424         # Firmware 29, type: STD FW    D2620 DTV8 (0x00000208), id: (0000000000000000), size: 149
425         #
426
427         write_le32(0x00000208);                 # Type
428         write_le64(0x00000000, 0x00000000);     # ID
429         write_le32(149);                        # Size
430         write_hunk_fix_endian(301232, 149);
431
432         #
433         # Firmware 30, type: STD FW    D2633 DTV8 (0x00000210), id: (0000000000000000), size: 149
434         #
435
436         write_le32(0x00000210);                 # Type
437         write_le64(0x00000000, 0x00000000);     # ID
438         write_le32(149);                        # Size
439         write_hunk_fix_endian(301384, 149);
440
441         #
442         # Firmware 31, type: STD FW    FM (0x00000400), id: (0000000000000000), size: 135
443         #
444
445         write_le32(0x00000400);                 # Type
446         write_le64(0x00000000, 0x00000000);     # ID
447         write_le32(135);                        # Size
448         write_hunk_fix_endian(301554, 135);
449
450         #
451         # Firmware 32, type: STD FW    (0x00000000), id: PAL/I (0000000000000010), size: 161
452         #
453
454         write_le32(0x00000000);                 # Type
455         write_le64(0x00000000, 0x00000010);     # ID
456         write_le32(161);                        # Size
457         write_hunk_fix_endian(301688, 161);
458
459         #
460         # Firmware 33, type: STD FW    MTS (0x00000004), id: PAL/I (0000000000000010), size: 169
461         #
462
463         write_le32(0x00000004);                 # Type
464         write_le64(0x00000000, 0x00000010);     # ID
465         write_le32(169);                        # Size
466         write_hunk_fix_endian(301856, 169);
467
468         #
469         # Firmware 34, type: STD FW    (0x00000000), id: SECAM/L AM (0000001000400000), size: 169
470         #
471
472         #
473         # Firmware 35, type: STD FW    (0x00000000), id: SECAM/L NICAM (0000000c00400000), size: 161
474         #
475
476         write_le32(0x00000000);                 # Type
477         write_le64(0x0000000c, 0x00400000);     # ID
478         write_le32(161);                        # Size
479         write_hunk_fix_endian(302032, 161);
480
481         #
482         # Firmware 36, type: STD FW    (0x00000000), id: SECAM/Lc (0000000000800000), size: 161
483         #
484
485         write_le32(0x00000000);                 # Type
486         write_le64(0x00000000, 0x00800000);     # ID
487         write_le32(161);                        # Size
488         write_hunk_fix_endian(302200, 161);
489
490         #
491         # Firmware 37, type: STD FW    (0x00000000), id: NTSC/M Kr (0000000000008000), size: 161
492         #
493
494         write_le32(0x00000000);                 # Type
495         write_le64(0x00000000, 0x00008000);     # ID
496         write_le32(161);                        # Size
497         write_hunk_fix_endian(302368, 161);
498
499         #
500         # Firmware 38, type: STD FW    LCD (0x00001000), id: NTSC/M Kr (0000000000008000), size: 161
501         #
502
503         write_le32(0x00001000);                 # Type
504         write_le64(0x00000000, 0x00008000);     # ID
505         write_le32(161);                        # Size
506         write_hunk_fix_endian(302536, 161);
507
508         #
509         # Firmware 39, type: STD FW    LCD NOGD (0x00003000), id: NTSC/M Kr (0000000000008000), size: 161
510         #
511
512         write_le32(0x00003000);                 # Type
513         write_le64(0x00000000, 0x00008000);     # ID
514         write_le32(161);                        # Size
515         write_hunk_fix_endian(302704, 161);
516
517         #
518         # Firmware 40, type: STD FW    MTS (0x00000004), id: NTSC/M Kr (0000000000008000), size: 169
519         #
520
521         write_le32(0x00000004);                 # Type
522         write_le64(0x00000000, 0x00008000);     # ID
523         write_le32(169);                        # Size
524         write_hunk_fix_endian(302872, 169);
525
526         #
527         # Firmware 41, type: STD FW    (0x00000000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161
528         #
529
530         write_le32(0x00000000);                 # Type
531         write_le64(0x00000000, 0x0000b700);     # ID
532         write_le32(161);                        # Size
533         write_hunk_fix_endian(303048, 161);
534
535         #
536         # Firmware 42, type: STD FW    LCD (0x00001000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161
537         #
538
539         write_le32(0x00001000);                 # Type
540         write_le64(0x00000000, 0x0000b700);     # ID
541         write_le32(161);                        # Size
542         write_hunk_fix_endian(303216, 161);
543
544         #
545         # Firmware 43, type: STD FW    LCD NOGD (0x00003000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161
546         #
547
548         write_le32(0x00003000);                 # Type
549         write_le64(0x00000000, 0x0000b700);     # ID
550         write_le32(161);                        # Size
551         write_hunk_fix_endian(303384, 161);
552
553         #
554         # Firmware 44, type: STD FW    (0x00000000), id: NTSC/M Jp (0000000000002000), size: 161
555         #
556
557         write_le32(0x00000000);                 # Type
558         write_le64(0x00000000, 0x00002000);     # ID
559         write_le32(161);                        # Size
560         write_hunk_fix_endian(303552, 161);
561
562         #
563         # Firmware 45, type: STD FW    MTS (0x00000004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169
564         #
565
566         write_le32(0x00000004);                 # Type
567         write_le64(0x00000000, 0x0000b700);     # ID
568         write_le32(169);                        # Size
569         write_hunk_fix_endian(303720, 169);
570
571         #
572         # Firmware 46, type: STD FW    MTS LCD (0x00001004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169
573         #
574
575         write_le32(0x00001004);                 # Type
576         write_le64(0x00000000, 0x0000b700);     # ID
577         write_le32(169);                        # Size
578         write_hunk_fix_endian(303896, 169);
579
580         #
581         # Firmware 47, type: STD FW    MTS LCD NOGD (0x00003004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169
582         #
583
584         write_le32(0x00003004);                 # Type
585         write_le64(0x00000000, 0x0000b700);     # ID
586         write_le32(169);                        # Size
587         write_hunk_fix_endian(304072, 169);
588
589         #
590         # Firmware 48, type: SCODE FW  HAS IF (0x60000000), IF = 3.28 MHz id: (0000000000000000), size: 192
591         #
592
593         write_le32(0x60000000);                 # Type
594         write_le64(0x00000000, 0x00000000);     # ID
595         write_le16(3280);                       # IF
596         write_le32(192);                        # Size
597         write_hunk(309048, 192);
598
599         #
600         # Firmware 49, type: SCODE FW  HAS IF (0x60000000), IF = 3.30 MHz id: (0000000000000000), size: 192
601         #
602
603 #       write_le32(0x60000000);                 # Type
604 #       write_le64(0x00000000, 0x00000000);     # ID
605 #       write_le16(3300);                       # IF
606 #       write_le32(192);                        # Size
607 #       write_hunk(304440, 192);
608
609         #
610         # Firmware 50, type: SCODE FW  HAS IF (0x60000000), IF = 3.44 MHz id: (0000000000000000), size: 192
611         #
612
613         write_le32(0x60000000);                 # Type
614         write_le64(0x00000000, 0x00000000);     # ID
615         write_le16(3440);                       # IF
616         write_le32(192);                        # Size
617         write_hunk(309432, 192);
618
619         #
620         # Firmware 51, type: SCODE FW  HAS IF (0x60000000), IF = 3.46 MHz id: (0000000000000000), size: 192
621         #
622
623         write_le32(0x60000000);                 # Type
624         write_le64(0x00000000, 0x00000000);     # ID
625         write_le16(3460);                       # IF
626         write_le32(192);                        # Size
627         write_hunk(309624, 192);
628
629         #
630         # Firmware 52, type: SCODE FW  DTV6 ATSC OREN36 HAS IF (0x60210020), IF = 3.80 MHz id: (0000000000000000), size: 192
631         #
632
633         write_le32(0x60210020);                 # Type
634         write_le64(0x00000000, 0x00000000);     # ID
635         write_le16(3800);                       # IF
636         write_le32(192);                        # Size
637         write_hunk(306936, 192);
638
639         #
640         # Firmware 53, type: SCODE FW  HAS IF (0x60000000), IF = 4.00 MHz id: (0000000000000000), size: 192
641         #
642
643         write_le32(0x60000000);                 # Type
644         write_le64(0x00000000, 0x00000000);     # ID
645         write_le16(4000);                       # IF
646         write_le32(192);                        # Size
647         write_hunk(309240, 192);
648
649         #
650         # Firmware 54, type: SCODE FW  DTV6 ATSC TOYOTA388 HAS IF (0x60410020), IF = 4.08 MHz id: (0000000000000000), size: 192
651         #
652
653         write_le32(0x60410020);                 # Type
654         write_le64(0x00000000, 0x00000000);     # ID
655         write_le16(4080);                       # IF
656         write_le32(192);                        # Size
657         write_hunk(307128, 192);
658
659         #
660         # Firmware 55, type: SCODE FW  HAS IF (0x60000000), IF = 4.20 MHz id: (0000000000000000), size: 192
661         #
662
663         write_le32(0x60000000);                 # Type
664         write_le64(0x00000000, 0x00000000);     # ID
665         write_le16(4200);                       # IF
666         write_le32(192);                        # Size
667         write_hunk(308856, 192);
668
669         #
670         # Firmware 56, type: SCODE FW  MONO HAS IF (0x60008000), IF = 4.32 MHz id: NTSC/M Kr (0000000000008000), size: 192
671         #
672
673         write_le32(0x60008000);                 # Type
674         write_le64(0x00000000, 0x00008000);     # ID
675         write_le16(4320);                       # IF
676         write_le32(192);                        # Size
677         write_hunk(305208, 192);
678
679         #
680         # Firmware 57, type: SCODE FW  HAS IF (0x60000000), IF = 4.45 MHz id: (0000000000000000), size: 192
681         #
682
683         write_le32(0x60000000);                 # Type
684         write_le64(0x00000000, 0x00000000);     # ID
685         write_le16(4450);                       # IF
686         write_le32(192);                        # Size
687         write_hunk(309816, 192);
688
689         #
690         # Firmware 58, type: SCODE FW  MTS LCD NOGD MONO IF HAS IF (0x6002b004), IF = 4.50 MHz id: NTSC PAL/M PAL/N (000000000000b700), size: 192
691         #
692
693         write_le32(0x6002b004);                 # Type
694         write_le64(0x00000000, 0x0000b700);     # ID
695         write_le16(4500);                       # IF
696         write_le32(192);                        # Size
697         write_hunk(304824, 192);
698
699         #
700         # Firmware 59, type: SCODE FW  LCD NOGD IF HAS IF (0x60023000), IF = 4.60 MHz id: NTSC/M Kr (0000000000008000), size: 192
701         #
702
703         write_le32(0x60023000);                 # Type
704         write_le64(0x00000000, 0x00008000);     # ID
705         write_le16(4600);                       # IF
706         write_le32(192);                        # Size
707         write_hunk(305016, 192);
708
709         #
710         # Firmware 60, type: SCODE FW  DTV6 QAM DTV7 DTV78 DTV8 ZARLINK456 HAS IF (0x620003e0), IF = 4.76 MHz id: (0000000000000000), size: 192
711         #
712
713         write_le32(0x620003e0);                 # Type
714         write_le64(0x00000000, 0x00000000);     # ID
715         write_le16(4760);                       # IF
716         write_le32(192);                        # Size
717         write_hunk(304440, 192);
718
719         #
720         # Firmware 61, type: SCODE FW  HAS IF (0x60000000), IF = 4.94 MHz id: (0000000000000000), size: 192
721         #
722
723         write_le32(0x60000000);                 # Type
724         write_le64(0x00000000, 0x00000000);     # ID
725         write_le16(4940);                       # IF
726         write_le32(192);                        # Size
727         write_hunk(308664, 192);
728
729         #
730         # Firmware 62, type: SCODE FW  HAS IF (0x60000000), IF = 5.26 MHz id: (0000000000000000), size: 192
731         #
732
733         write_le32(0x60000000);                 # Type
734         write_le64(0x00000000, 0x00000000);     # ID
735         write_le16(5260);                       # IF
736         write_le32(192);                        # Size
737         write_hunk(307704, 192);
738
739         #
740         # Firmware 63, type: SCODE FW  MONO HAS IF (0x60008000), IF = 5.32 MHz id: PAL/BG A2 NICAM (0000000f00000007), size: 192
741         #
742
743         write_le32(0x60008000);                 # Type
744         write_le64(0x0000000f, 0x00000007);     # ID
745         write_le16(5320);                       # IF
746         write_le32(192);                        # Size
747         write_hunk(307896, 192);
748
749         #
750         # Firmware 64, type: SCODE FW  DTV7 DTV78 DTV8 DIBCOM52 CHINA HAS IF (0x65000380), IF = 5.40 MHz id: (0000000000000000), size: 192
751         #
752
753         write_le32(0x65000380);                 # Type
754         write_le64(0x00000000, 0x00000000);     # ID
755         write_le16(5400);                       # IF
756         write_le32(192);                        # Size
757         write_hunk(304248, 192);
758
759         #
760         # Firmware 65, type: SCODE FW  DTV6 ATSC OREN538 HAS IF (0x60110020), IF = 5.58 MHz id: (0000000000000000), size: 192
761         #
762
763         write_le32(0x60110020);                 # Type
764         write_le64(0x00000000, 0x00000000);     # ID
765         write_le16(5580);                       # IF
766         write_le32(192);                        # Size
767         write_hunk(306744, 192);
768
769         #
770         # Firmware 66, type: SCODE FW  HAS IF (0x60000000), IF = 5.64 MHz id: PAL/BG A2 (0000000300000007), size: 192
771         #
772
773         write_le32(0x60000000);                 # Type
774         write_le64(0x00000003, 0x00000007);     # ID
775         write_le16(5640);                       # IF
776         write_le32(192);                        # Size
777         write_hunk(305592, 192);
778
779         #
780         # Firmware 67, type: SCODE FW  HAS IF (0x60000000), IF = 5.74 MHz id: PAL/BG NICAM (0000000c00000007), size: 192
781         #
782
783         write_le32(0x60000000);                 # Type
784         write_le64(0x0000000c, 0x00000007);     # ID
785         write_le16(5740);                       # IF
786         write_le32(192);                        # Size
787         write_hunk(305784, 192);
788
789         #
790         # Firmware 68, type: SCODE FW  HAS IF (0x60000000), IF = 5.90 MHz id: (0000000000000000), size: 192
791         #
792
793         write_le32(0x60000000);                 # Type
794         write_le64(0x00000000, 0x00000000);     # ID
795         write_le16(5900);                       # IF
796         write_le32(192);                        # Size
797         write_hunk(307512, 192);
798
799         #
800         # Firmware 69, type: SCODE FW  MONO HAS IF (0x60008000), IF = 6.00 MHz id: PAL/DK PAL/I SECAM/K3 SECAM/L SECAM/Lc NICAM (0000000c04c000f0), size: 192
801         #
802
803         write_le32(0x60008000);                 # Type
804         write_le64(0x0000000c, 0x04c000f0);     # ID
805         write_le16(6000);                       # IF
806         write_le32(192);                        # Size
807         write_hunk(305576, 192);
808
809         #
810         # Firmware 70, type: SCODE FW  DTV6 QAM ATSC LG60 F6MHZ HAS IF (0x68050060), IF = 6.20 MHz id: (0000000000000000), size: 192
811         #
812
813         write_le32(0x68050060);                 # Type
814         write_le64(0x00000000, 0x00000000);     # ID
815         write_le16(6200);                       # IF
816         write_le32(192);                        # Size
817         write_hunk(306552, 192);
818
819         #
820         # Firmware 71, type: SCODE FW  HAS IF (0x60000000), IF = 6.24 MHz id: PAL/I (0000000000000010), size: 192
821         #
822
823         write_le32(0x60000000);                 # Type
824         write_le64(0x00000000, 0x00000010);     # ID
825         write_le16(6240);                       # IF
826         write_le32(192);                        # Size
827         write_hunk(305400, 192);
828
829         #
830         # Firmware 72, type: SCODE FW  MONO HAS IF (0x60008000), IF = 6.32 MHz id: SECAM/K1 (0000000000200000), size: 192
831         #
832
833         write_le32(0x60008000);                 # Type
834         write_le64(0x00000000, 0x00200000);     # ID
835         write_le16(6320);                       # IF
836         write_le32(192);                        # Size
837         write_hunk(308472, 192);
838
839         #
840         # Firmware 73, type: SCODE FW  HAS IF (0x60000000), IF = 6.34 MHz id: SECAM/K1 (0000000000200000), size: 192
841         #
842
843         write_le32(0x60000000);                 # Type
844         write_le64(0x00000000, 0x00200000);     # ID
845         write_le16(6340);                       # IF
846         write_le32(192);                        # Size
847         write_hunk(306360, 192);
848
849         #
850         # Firmware 74, type: SCODE FW  MONO HAS IF (0x60008000), IF = 6.50 MHz id: PAL/DK SECAM/K3 SECAM/L NICAM (0000000c044000e0), size: 192
851         #
852
853         write_le32(0x60008000);                 # Type
854         write_le64(0x0000000c, 0x044000e0);     # ID
855         write_le16(6500);                       # IF
856         write_le32(192);                        # Size
857         write_hunk(308280, 192);
858
859         #
860         # Firmware 75, type: SCODE FW  DTV6 ATSC ATI638 HAS IF (0x60090020), IF = 6.58 MHz id: (0000000000000000), size: 192
861         #
862
863         write_le32(0x60090020);                 # Type
864         write_le64(0x00000000, 0x00000000);     # ID
865         write_le16(6580);                       # IF
866         write_le32(192);                        # Size
867         write_hunk(304632, 192);
868
869         #
870         # Firmware 76, type: SCODE FW  HAS IF (0x60000000), IF = 6.60 MHz id: PAL/DK A2 (00000003000000e0), size: 192
871         #
872
873         write_le32(0x60000000);                 # Type
874         write_le64(0x00000003, 0x000000e0);     # ID
875         write_le16(6600);                       # IF
876         write_le32(192);                        # Size
877         write_hunk(306168, 192);
878
879         #
880         # Firmware 77, type: SCODE FW  MONO HAS IF (0x60008000), IF = 6.68 MHz id: PAL/DK A2 (00000003000000e0), size: 192
881         #
882
883         write_le32(0x60008000);                 # Type
884         write_le64(0x00000003, 0x000000e0);     # ID
885         write_le16(6680);                       # IF
886         write_le32(192);                        # Size
887         write_hunk(308088, 192);
888
889         #
890         # Firmware 78, type: SCODE FW  DTV6 ATSC TOYOTA794 HAS IF (0x60810020), IF = 8.14 MHz id: (0000000000000000), size: 192
891         #
892
893         write_le32(0x60810020);                 # Type
894         write_le64(0x00000000, 0x00000000);     # ID
895         write_le16(8140);                       # IF
896         write_le32(192);                        # Size
897         write_hunk(307320, 192);
898
899         #
900         # Firmware 79, type: SCODE FW  HAS IF (0x60000000), IF = 8.20 MHz id: (0000000000000000), size: 192
901         #
902
903 #       write_le32(0x60000000);                 # Type
904 #       write_le64(0x00000000, 0x00000000);     # ID
905 #       write_le16(8200);                       # IF
906 #       write_le32(192);                        # Size
907 #       write_hunk(308088, 192);
908 }
909
910 sub main_firmware_27($$$$)
911 {
912         my $out;
913         my $j=0;
914         my $outfile = shift;
915         my $name    = shift;
916         my $version = shift;
917         my $nr_desc = shift;
918
919         for ($j = length($name); $j <32; $j++) {
920                 $name = $name.chr(0);
921         }
922
923         open OUTFILE, ">$outfile";
924         syswrite(OUTFILE, $name);
925         write_le16($version);
926         write_le16($nr_desc);
927
928         #
929         # Firmware 0, type: BASE FW   F8MHZ (0x00000003), id: (0000000000000000), size: 8718
930         #
931
932         write_le32(0x00000003);                 # Type
933         write_le64(0x00000000, 0x00000000);     # ID
934         write_le32(8718);                       # Size
935         write_hunk_fix_endian(813432, 8718);
936
937         #
938         # Firmware 1, type: BASE FW   F8MHZ MTS (0x00000007), id: (0000000000000000), size: 8712
939         #
940
941         write_le32(0x00000007);                 # Type
942         write_le64(0x00000000, 0x00000000);     # ID
943         write_le32(8712);                       # Size
944         write_hunk_fix_endian(822152, 8712);
945
946         #
947         # Firmware 2, type: BASE FW   FM (0x00000401), id: (0000000000000000), size: 8562
948         #
949
950         write_le32(0x00000401);                 # Type
951         write_le64(0x00000000, 0x00000000);     # ID
952         write_le32(8562);                       # Size
953         write_hunk_fix_endian(830872, 8562);
954
955         #
956         # Firmware 3, type: BASE FW   FM INPUT1 (0x00000c01), id: (0000000000000000), size: 8576
957         #
958
959         write_le32(0x00000c01);                 # Type
960         write_le64(0x00000000, 0x00000000);     # ID
961         write_le32(8576);                       # Size
962         write_hunk_fix_endian(839440, 8576);
963
964         #
965         # Firmware 4, type: BASE FW   (0x00000001), id: (0000000000000000), size: 8706
966         #
967
968         write_le32(0x00000001);                 # Type
969         write_le64(0x00000000, 0x00000000);     # ID
970         write_le32(8706);                       # Size
971         write_hunk_fix_endian(848024, 8706);
972
973         #
974         # Firmware 5, type: BASE FW   MTS (0x00000005), id: (0000000000000000), size: 8682
975         #
976
977         write_le32(0x00000005);                 # Type
978         write_le64(0x00000000, 0x00000000);     # ID
979         write_le32(8682);                       # Size
980         write_hunk_fix_endian(856736, 8682);
981
982         #
983         # Firmware 6, type: STD FW    (0x00000000), id: PAL/BG A2/A (0000000100000007), size: 161
984         #
985
986         write_le32(0x00000000);                 # Type
987         write_le64(0x00000001, 0x00000007);     # ID
988         write_le32(161);                        # Size
989         write_hunk_fix_endian(865424, 161);
990
991         #
992         # Firmware 7, type: STD FW    MTS (0x00000004), id: PAL/BG A2/A (0000000100000007), size: 169
993         #
994
995         write_le32(0x00000004);                 # Type
996         write_le64(0x00000001, 0x00000007);     # ID
997         write_le32(169);                        # Size
998         write_hunk_fix_endian(865592, 169);
999
1000         #
1001         # Firmware 8, type: STD FW    (0x00000000), id: PAL/BG A2/B (0000000200000007), size: 161
1002         #
1003
1004         write_le32(0x00000000);                 # Type
1005         write_le64(0x00000002, 0x00000007);     # ID
1006         write_le32(161);                        # Size
1007         write_hunk_fix_endian(865424, 161);
1008
1009         #
1010         # Firmware 9, type: STD FW    MTS (0x00000004), id: PAL/BG A2/B (0000000200000007), size: 169
1011         #
1012
1013         write_le32(0x00000004);                 # Type
1014         write_le64(0x00000002, 0x00000007);     # ID
1015         write_le32(169);                        # Size
1016         write_hunk_fix_endian(865592, 169);
1017
1018         #
1019         # Firmware 10, type: STD FW    (0x00000000), id: PAL/BG NICAM/A (0000000400000007), size: 161
1020         #
1021
1022         write_le32(0x00000000);                 # Type
1023         write_le64(0x00000004, 0x00000007);     # ID
1024         write_le32(161);                        # Size
1025         write_hunk_fix_endian(866112, 161);
1026
1027         #
1028         # Firmware 11, type: STD FW    MTS (0x00000004), id: PAL/BG NICAM/A (0000000400000007), size: 169
1029         #
1030
1031         write_le32(0x00000004);                 # Type
1032         write_le64(0x00000004, 0x00000007);     # ID
1033         write_le32(169);                        # Size
1034         write_hunk_fix_endian(866280, 169);
1035
1036         #
1037         # Firmware 12, type: STD FW    (0x00000000), id: PAL/BG NICAM/B (0000000800000007), size: 161
1038         #
1039
1040         write_le32(0x00000000);                 # Type
1041         write_le64(0x00000008, 0x00000007);     # ID
1042         write_le32(161);                        # Size
1043         write_hunk_fix_endian(866112, 161);
1044
1045         #
1046         # Firmware 13, type: STD FW    MTS (0x00000004), id: PAL/BG NICAM/B (0000000800000007), size: 169
1047         #
1048
1049         write_le32(0x00000004);                 # Type
1050         write_le64(0x00000008, 0x00000007);     # ID
1051         write_le32(169);                        # Size
1052         write_hunk_fix_endian(866280, 169);
1053
1054         #
1055         # Firmware 14, type: STD FW    (0x00000000), id: PAL/DK A2 (00000003000000e0), size: 161
1056         #
1057
1058         write_le32(0x00000000);                 # Type
1059         write_le64(0x00000003, 0x000000e0);     # ID
1060         write_le32(161);                        # Size
1061         write_hunk_fix_endian(866800, 161);
1062
1063         #
1064         # Firmware 15, type: STD FW    MTS (0x00000004), id: PAL/DK A2 (00000003000000e0), size: 169
1065         #
1066
1067         write_le32(0x00000004);                 # Type
1068         write_le64(0x00000003, 0x000000e0);     # ID
1069         write_le32(169);                        # Size
1070         write_hunk_fix_endian(866968, 169);
1071
1072         #
1073         # Firmware 16, type: STD FW    (0x00000000), id: PAL/DK NICAM (0000000c000000e0), size: 161
1074         #
1075
1076         write_le32(0x00000000);                 # Type
1077         write_le64(0x0000000c, 0x000000e0);     # ID
1078         write_le32(161);                        # Size
1079         write_hunk_fix_endian(867144, 161);
1080
1081         #
1082         # Firmware 17, type: STD FW    MTS (0x00000004), id: PAL/DK NICAM (0000000c000000e0), size: 169
1083         #
1084
1085         write_le32(0x00000004);                 # Type
1086         write_le64(0x0000000c, 0x000000e0);     # ID
1087         write_le32(169);                        # Size
1088         write_hunk_fix_endian(867312, 169);
1089
1090         #
1091         # Firmware 18, type: STD FW    (0x00000000), id: SECAM/K1 (0000000000200000), size: 161
1092         #
1093
1094         write_le32(0x00000000);                 # Type
1095         write_le64(0x00000000, 0x00200000);     # ID
1096         write_le32(161);                        # Size
1097         write_hunk_fix_endian(867488, 161);
1098
1099         #
1100         # Firmware 19, type: STD FW    MTS (0x00000004), id: SECAM/K1 (0000000000200000), size: 169
1101         #
1102
1103         write_le32(0x00000004);                 # Type
1104         write_le64(0x00000000, 0x00200000);     # ID
1105         write_le32(169);                        # Size
1106         write_hunk_fix_endian(867656, 169);
1107
1108         #
1109         # Firmware 20, type: STD FW    (0x00000000), id: SECAM/K3 (0000000004000000), size: 161
1110         #
1111
1112         write_le32(0x00000000);                 # Type
1113         write_le64(0x00000000, 0x04000000);     # ID
1114         write_le32(161);                        # Size
1115         write_hunk_fix_endian(867832, 161);
1116
1117         #
1118         # Firmware 21, type: STD FW    MTS (0x00000004), id: SECAM/K3 (0000000004000000), size: 169
1119         #
1120
1121         write_le32(0x00000004);                 # Type
1122         write_le64(0x00000000, 0x04000000);     # ID
1123         write_le32(169);                        # Size
1124         write_hunk_fix_endian(868000, 169);
1125
1126         #
1127         # Firmware 22, type: STD FW    D2633 DTV6 ATSC (0x00010030), id: (0000000000000000), size: 149
1128         #
1129
1130         write_le32(0x00010030);                 # Type
1131         write_le64(0x00000000, 0x00000000);     # ID
1132         write_le32(149);                        # Size
1133         write_hunk_fix_endian(868176, 149);
1134
1135         #
1136         # Firmware 23, type: STD FW    D2620 DTV6 QAM (0x00000068), id: (0000000000000000), size: 149
1137         #
1138
1139         write_le32(0x00000068);                 # Type
1140         write_le64(0x00000000, 0x00000000);     # ID
1141         write_le32(149);                        # Size
1142         write_hunk_fix_endian(868336, 149);
1143
1144         #
1145         # Firmware 24, type: STD FW    D2633 DTV6 QAM (0x00000070), id: (0000000000000000), size: 149
1146         #
1147
1148         write_le32(0x00000070);                 # Type
1149         write_le64(0x00000000, 0x00000000);     # ID
1150         write_le32(149);                        # Size
1151         write_hunk_fix_endian(868488, 149);
1152
1153         #
1154         # Firmware 25, type: STD FW    D2620 DTV7 (0x00000088), id: (0000000000000000), size: 149
1155         #
1156
1157         write_le32(0x00000088);                 # Type
1158         write_le64(0x00000000, 0x00000000);     # ID
1159         write_le32(149);                        # Size
1160         write_hunk_fix_endian(868648, 149);
1161
1162         #
1163         # Firmware 26, type: STD FW    D2633 DTV7 (0x00000090), id: (0000000000000000), size: 149
1164         #
1165
1166         write_le32(0x00000090);                 # Type
1167         write_le64(0x00000000, 0x00000000);     # ID
1168         write_le32(149);                        # Size
1169         write_hunk_fix_endian(868800, 149);
1170
1171         #
1172         # Firmware 27, type: STD FW    D2620 DTV78 (0x00000108), id: (0000000000000000), size: 149
1173         #
1174
1175         write_le32(0x00000108);                 # Type
1176         write_le64(0x00000000, 0x00000000);     # ID
1177         write_le32(149);                        # Size
1178         write_hunk_fix_endian(868960, 149);
1179
1180         #
1181         # Firmware 28, type: STD FW    D2633 DTV78 (0x00000110), id: (0000000000000000), size: 149
1182         #
1183
1184         write_le32(0x00000110);                 # Type
1185         write_le64(0x00000000, 0x00000000);     # ID
1186         write_le32(149);                        # Size
1187         write_hunk_fix_endian(869112, 149);
1188
1189         #
1190         # Firmware 29, type: STD FW    D2620 DTV8 (0x00000208), id: (0000000000000000), size: 149
1191         #
1192
1193         write_le32(0x00000208);                 # Type
1194         write_le64(0x00000000, 0x00000000);     # ID
1195         write_le32(149);                        # Size
1196         write_hunk_fix_endian(868648, 149);
1197
1198         #
1199         # Firmware 30, type: STD FW    D2633 DTV8 (0x00000210), id: (0000000000000000), size: 149
1200         #
1201
1202         write_le32(0x00000210);                 # Type
1203         write_le64(0x00000000, 0x00000000);     # ID
1204         write_le32(149);                        # Size
1205         write_hunk_fix_endian(868800, 149);
1206
1207         #
1208         # Firmware 31, type: STD FW    FM (0x00000400), id: (0000000000000000), size: 135
1209         #
1210
1211         write_le32(0x00000400);                 # Type
1212         write_le64(0x00000000, 0x00000000);     # ID
1213         write_le32(135);                        # Size
1214         write_hunk_fix_endian(869584, 135);
1215
1216         #
1217         # Firmware 32, type: STD FW    (0x00000000), id: PAL/I (0000000000000010), size: 161
1218         #
1219
1220         write_le32(0x00000000);                 # Type
1221         write_le64(0x00000000, 0x00000010);     # ID
1222         write_le32(161);                        # Size
1223         write_hunk_fix_endian(869728, 161);
1224
1225         #
1226         # Firmware 33, type: STD FW    MTS (0x00000004), id: PAL/I (0000000000000010), size: 169
1227         #
1228
1229         write_le32(0x00000004);                 # Type
1230         write_le64(0x00000000, 0x00000010);     # ID
1231         write_le32(169);                        # Size
1232         write_hunk_fix_endian(869896, 169);
1233
1234         #
1235         # Firmware 34, type: STD FW    (0x00000000), id: SECAM/L AM (0000001000400000), size: 169
1236         #
1237
1238         write_le32(0x00000000);                 # Type
1239         write_le64(0x00000010, 0x00400000);     # ID
1240         write_le32(169);                        # Size
1241         write_hunk_fix_endian(870072, 169);
1242
1243         #
1244         # Firmware 35, type: STD FW    (0x00000000), id: SECAM/L NICAM (0000000c00400000), size: 161
1245         #
1246
1247         write_le32(0x00000000);                 # Type
1248         write_le64(0x0000000c, 0x00400000);     # ID
1249         write_le32(161);                        # Size
1250         write_hunk_fix_endian(870248, 161);
1251
1252         #
1253         # Firmware 36, type: STD FW    (0x00000000), id: SECAM/Lc (0000000000800000), size: 161
1254         #
1255
1256         write_le32(0x00000000);                 # Type
1257         write_le64(0x00000000, 0x00800000);     # ID
1258         write_le32(161);                        # Size
1259         write_hunk_fix_endian(870416, 161);
1260
1261         #
1262         # Firmware 37, type: STD FW    (0x00000000), id: NTSC/M Kr (0000000000008000), size: 161
1263         #
1264
1265         write_le32(0x00000000);                 # Type
1266         write_le64(0x00000000, 0x00008000);     # ID
1267         write_le32(161);                        # Size
1268         write_hunk_fix_endian(870584, 161);
1269
1270         #
1271         # Firmware 38, type: STD FW    LCD (0x00001000), id: NTSC/M Kr (0000000000008000), size: 161
1272         #
1273
1274         write_le32(0x00001000);                 # Type
1275         write_le64(0x00000000, 0x00008000);     # ID
1276         write_le32(161);                        # Size
1277         write_hunk_fix_endian(870752, 161);
1278
1279         #
1280         # Firmware 39, type: STD FW    LCD NOGD (0x00003000), id: NTSC/M Kr (0000000000008000), size: 161
1281         #
1282
1283         write_le32(0x00003000);                 # Type
1284         write_le64(0x00000000, 0x00008000);     # ID
1285         write_le32(161);                        # Size
1286         write_hunk_fix_endian(870920, 161);
1287
1288         #
1289         # Firmware 40, type: STD FW    MTS (0x00000004), id: NTSC/M Kr (0000000000008000), size: 169
1290         #
1291
1292         write_le32(0x00000004);                 # Type
1293         write_le64(0x00000000, 0x00008000);     # ID
1294         write_le32(169);                        # Size
1295         write_hunk_fix_endian(871088, 169);
1296
1297         #
1298         # Firmware 41, type: STD FW    (0x00000000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161
1299         #
1300
1301         write_le32(0x00000000);                 # Type
1302         write_le64(0x00000000, 0x0000b700);     # ID
1303         write_le32(161);                        # Size
1304         write_hunk_fix_endian(871264, 161);
1305
1306         #
1307         # Firmware 42, type: STD FW    LCD (0x00001000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161
1308         #
1309
1310         write_le32(0x00001000);                 # Type
1311         write_le64(0x00000000, 0x0000b700);     # ID
1312         write_le32(161);                        # Size
1313         write_hunk_fix_endian(871432, 161);
1314
1315         #
1316         # Firmware 43, type: STD FW    LCD NOGD (0x00003000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161
1317         #
1318
1319         write_le32(0x00003000);                 # Type
1320         write_le64(0x00000000, 0x0000b700);     # ID
1321         write_le32(161);                        # Size
1322         write_hunk_fix_endian(871600, 161);
1323
1324         #
1325         # Firmware 44, type: STD FW    (0x00000000), id: NTSC/M Jp (0000000000002000), size: 161
1326         #
1327
1328         write_le32(0x00000000);                 # Type
1329         write_le64(0x00000000, 0x00002000);     # ID
1330         write_le32(161);                        # Size
1331         write_hunk_fix_endian(871264, 161);
1332
1333         #
1334         # Firmware 45, type: STD FW    MTS (0x00000004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169
1335         #
1336
1337         write_le32(0x00000004);                 # Type
1338         write_le64(0x00000000, 0x0000b700);     # ID
1339         write_le32(169);                        # Size
1340         write_hunk_fix_endian(871936, 169);
1341
1342         #
1343         # Firmware 46, type: STD FW    MTS LCD (0x00001004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169
1344         #
1345
1346         write_le32(0x00001004);                 # Type
1347         write_le64(0x00000000, 0x0000b700);     # ID
1348         write_le32(169);                        # Size
1349         write_hunk_fix_endian(872112, 169);
1350
1351         #
1352         # Firmware 47, type: STD FW    MTS LCD NOGD (0x00003004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169
1353         #
1354
1355         write_le32(0x00003004);                 # Type
1356         write_le64(0x00000000, 0x0000b700);     # ID
1357         write_le32(169);                        # Size
1358         write_hunk_fix_endian(872288, 169);
1359
1360         #
1361         # Firmware 48, type: SCODE FW  HAS IF (0x60000000), IF = 3.28 MHz id: (0000000000000000), size: 192
1362         #
1363
1364         write_le32(0x60000000);                 # Type
1365         write_le64(0x00000000, 0x00000000);     # ID
1366         write_le16(3280);                       # IF
1367         write_le32(192);                        # Size
1368         write_hunk(811896, 192);
1369
1370         #
1371         # Firmware 49, type: SCODE FW  HAS IF (0x60000000), IF = 3.30 MHz id: (0000000000000000), size: 192
1372         #
1373
1374         write_le32(0x60000000);                 # Type
1375         write_le64(0x00000000, 0x00000000);     # ID
1376         write_le16(3300);                       # IF
1377         write_le32(192);                        # Size
1378         write_hunk(813048, 192);
1379
1380         #
1381         # Firmware 50, type: SCODE FW  HAS IF (0x60000000), IF = 3.44 MHz id: (0000000000000000), size: 192
1382         #
1383
1384         write_le32(0x60000000);                 # Type
1385         write_le64(0x00000000, 0x00000000);     # ID
1386         write_le16(3440);                       # IF
1387         write_le32(192);                        # Size
1388         write_hunk(812280, 192);
1389
1390         #
1391         # Firmware 51, type: SCODE FW  HAS IF (0x60000000), IF = 3.46 MHz id: (0000000000000000), size: 192
1392         #
1393
1394         write_le32(0x60000000);                 # Type
1395         write_le64(0x00000000, 0x00000000);     # ID
1396         write_le16(3460);                       # IF
1397         write_le32(192);                        # Size
1398         write_hunk(812472, 192);
1399
1400         #
1401         # Firmware 52, type: SCODE FW  DTV6 ATSC OREN36 HAS IF (0x60210020), IF = 3.80 MHz id: (0000000000000000), size: 192
1402         #
1403
1404         write_le32(0x60210020);                 # Type
1405         write_le64(0x00000000, 0x00000000);     # ID
1406         write_le16(3800);                       # IF
1407         write_le32(192);                        # Size
1408         write_hunk(809784, 192);
1409
1410         #
1411         # Firmware 53, type: SCODE FW  HAS IF (0x60000000), IF = 4.00 MHz id: (0000000000000000), size: 192
1412         #
1413
1414         write_le32(0x60000000);                 # Type
1415         write_le64(0x00000000, 0x00000000);     # ID
1416         write_le16(4000);                       # IF
1417         write_le32(192);                        # Size
1418         write_hunk(812088, 192);
1419
1420         #
1421         # Firmware 54, type: SCODE FW  DTV6 ATSC TOYOTA388 HAS IF (0x60410020), IF = 4.08 MHz id: (0000000000000000), size: 192
1422         #
1423
1424         write_le32(0x60410020);                 # Type
1425         write_le64(0x00000000, 0x00000000);     # ID
1426         write_le16(4080);                       # IF
1427         write_le32(192);                        # Size
1428         write_hunk(809976, 192);
1429
1430         #
1431         # Firmware 55, type: SCODE FW  HAS IF (0x60000000), IF = 4.20 MHz id: (0000000000000000), size: 192
1432         #
1433
1434         write_le32(0x60000000);                 # Type
1435         write_le64(0x00000000, 0x00000000);     # ID
1436         write_le16(4200);                       # IF
1437         write_le32(192);                        # Size
1438         write_hunk(811704, 192);
1439
1440         #
1441         # Firmware 56, type: SCODE FW  MONO HAS IF (0x60008000), IF = 4.32 MHz id: NTSC/M Kr (0000000000008000), size: 192
1442         #
1443
1444         write_le32(0x60008000);                 # Type
1445         write_le64(0x00000000, 0x00008000);     # ID
1446         write_le16(4320);                       # IF
1447         write_le32(192);                        # Size
1448         write_hunk(808056, 192);
1449
1450         #
1451         # Firmware 57, type: SCODE FW  HAS IF (0x60000000), IF = 4.45 MHz id: (0000000000000000), size: 192
1452         #
1453
1454         write_le32(0x60000000);                 # Type
1455         write_le64(0x00000000, 0x00000000);     # ID
1456         write_le16(4450);                       # IF
1457         write_le32(192);                        # Size
1458         write_hunk(812664, 192);
1459
1460         #
1461         # Firmware 58, type: SCODE FW  MTS LCD NOGD MONO IF HAS IF (0x6002b004), IF = 4.50 MHz id: NTSC PAL/M PAL/N (000000000000b700), size: 192
1462         #
1463
1464         write_le32(0x6002b004);                 # Type
1465         write_le64(0x00000000, 0x0000b700);     # ID
1466         write_le16(4500);                       # IF
1467         write_le32(192);                        # Size
1468         write_hunk(807672, 192);
1469
1470         #
1471         # Firmware 59, type: SCODE FW  LCD NOGD IF HAS IF (0x60023000), IF = 4.60 MHz id: NTSC/M Kr (0000000000008000), size: 192
1472         #
1473
1474         write_le32(0x60023000);                 # Type
1475         write_le64(0x00000000, 0x00008000);     # ID
1476         write_le16(4600);                       # IF
1477         write_le32(192);                        # Size
1478         write_hunk(807864, 192);
1479
1480         #
1481         # Firmware 60, type: SCODE FW  DTV6 QAM DTV7 DTV78 DTV8 ZARLINK456 HAS IF (0x620003e0), IF = 4.76 MHz id: (0000000000000000), size: 192
1482         #
1483
1484         write_le32(0x620003e0);                 # Type
1485         write_le64(0x00000000, 0x00000000);     # ID
1486         write_le16(4760);                       # IF
1487         write_le32(192);                        # Size
1488         write_hunk(807288, 192);
1489
1490         #
1491         # Firmware 61, type: SCODE FW  HAS IF (0x60000000), IF = 4.94 MHz id: (0000000000000000), size: 192
1492         #
1493
1494         write_le32(0x60000000);                 # Type
1495         write_le64(0x00000000, 0x00000000);     # ID
1496         write_le16(4940);                       # IF
1497         write_le32(192);                        # Size
1498         write_hunk(811512, 192);
1499
1500         #
1501         # Firmware 62, type: SCODE FW  HAS IF (0x60000000), IF = 5.26 MHz id: (0000000000000000), size: 192
1502         #
1503
1504         write_le32(0x60000000);                 # Type
1505         write_le64(0x00000000, 0x00000000);     # ID
1506         write_le16(5260);                       # IF
1507         write_le32(192);                        # Size
1508         write_hunk(810552, 192);
1509
1510         #
1511         # Firmware 63, type: SCODE FW  MONO HAS IF (0x60008000), IF = 5.32 MHz id: PAL/BG A2 NICAM (0000000f00000007), size: 192
1512         #
1513
1514         write_le32(0x60008000);                 # Type
1515         write_le64(0x0000000f, 0x00000007);     # ID
1516         write_le16(5320);                       # IF
1517         write_le32(192);                        # Size
1518         write_hunk(810744, 192);
1519
1520         #
1521         # Firmware 64, type: SCODE FW  DTV7 DTV78 DTV8 DIBCOM52 CHINA HAS IF (0x65000380), IF = 5.40 MHz id: (0000000000000000), size: 192
1522         #
1523
1524         write_le32(0x65000380);                 # Type
1525         write_le64(0x00000000, 0x00000000);     # ID
1526         write_le16(5400);                       # IF
1527         write_le32(192);                        # Size
1528         write_hunk(807096, 192);
1529
1530         #
1531         # Firmware 65, type: SCODE FW  DTV6 ATSC OREN538 HAS IF (0x60110020), IF = 5.58 MHz id: (0000000000000000), size: 192
1532         #
1533
1534         write_le32(0x60110020);                 # Type
1535         write_le64(0x00000000, 0x00000000);     # ID
1536         write_le16(5580);                       # IF
1537         write_le32(192);                        # Size
1538         write_hunk(809592, 192);
1539
1540         #
1541         # Firmware 66, type: SCODE FW  HAS IF (0x60000000), IF = 5.64 MHz id: PAL/BG A2 (0000000300000007), size: 192
1542         #
1543
1544         write_le32(0x60000000);                 # Type
1545         write_le64(0x00000003, 0x00000007);     # ID
1546         write_le16(5640);                       # IF
1547         write_le32(192);                        # Size
1548         write_hunk(808440, 192);
1549
1550         #
1551         # Firmware 67, type: SCODE FW  HAS IF (0x60000000), IF = 5.74 MHz id: PAL/BG NICAM (0000000c00000007), size: 192
1552         #
1553
1554         write_le32(0x60000000);                 # Type
1555         write_le64(0x0000000c, 0x00000007);     # ID
1556         write_le16(5740);                       # IF
1557         write_le32(192);                        # Size
1558         write_hunk(808632, 192);
1559
1560         #
1561         # Firmware 68, type: SCODE FW  HAS IF (0x60000000), IF = 5.90 MHz id: (0000000000000000), size: 192
1562         #
1563
1564         write_le32(0x60000000);                 # Type
1565         write_le64(0x00000000, 0x00000000);     # ID
1566         write_le16(5900);                       # IF
1567         write_le32(192);                        # Size
1568         write_hunk(810360, 192);
1569
1570         #
1571         # Firmware 69, type: SCODE FW  MONO HAS IF (0x60008000), IF = 6.00 MHz id: PAL/DK PAL/I SECAM/K3 SECAM/L SECAM/Lc NICAM (0000000c04c000f0), size: 192
1572         #
1573
1574         write_le32(0x60008000);                 # Type
1575         write_le64(0x0000000c, 0x04c000f0);     # ID
1576         write_le16(6000);                       # IF
1577         write_le32(192);                        # Size
1578         write_hunk(808824, 192);
1579
1580         #
1581         # Firmware 70, type: SCODE FW  DTV6 QAM ATSC LG60 F6MHZ HAS IF (0x68050060), IF = 6.20 MHz id: (0000000000000000), size: 192
1582         #
1583
1584         write_le32(0x68050060);                 # Type
1585         write_le64(0x00000000, 0x00000000);     # ID
1586         write_le16(6200);                       # IF
1587         write_le32(192);                        # Size
1588         write_hunk(809400, 192);
1589
1590         #
1591         # Firmware 71, type: SCODE FW  HAS IF (0x60000000), IF = 6.24 MHz id: PAL/I (0000000000000010), size: 192
1592         #
1593
1594         write_le32(0x60000000);                 # Type
1595         write_le64(0x00000000, 0x00000010);     # ID
1596         write_le16(6240);                       # IF
1597         write_le32(192);                        # Size
1598         write_hunk(808248, 192);
1599
1600         #
1601         # Firmware 72, type: SCODE FW  MONO HAS IF (0x60008000), IF = 6.32 MHz id: SECAM/K1 (0000000000200000), size: 192
1602         #
1603
1604         write_le32(0x60008000);                 # Type
1605         write_le64(0x00000000, 0x00200000);     # ID
1606         write_le16(6320);                       # IF
1607         write_le32(192);                        # Size
1608         write_hunk(811320, 192);
1609
1610         #
1611         # Firmware 73, type: SCODE FW  HAS IF (0x60000000), IF = 6.34 MHz id: SECAM/K1 (0000000000200000), size: 192
1612         #
1613
1614         write_le32(0x60000000);                 # Type
1615         write_le64(0x00000000, 0x00200000);     # ID
1616         write_le16(6340);                       # IF
1617         write_le32(192);                        # Size
1618         write_hunk(809208, 192);
1619
1620         #
1621         # Firmware 74, type: SCODE FW  MONO HAS IF (0x60008000), IF = 6.50 MHz id: PAL/DK SECAM/K3 SECAM/L NICAM (0000000c044000e0), size: 192
1622         #
1623
1624         write_le32(0x60008000);                 # Type
1625         write_le64(0x0000000c, 0x044000e0);     # ID
1626         write_le16(6500);                       # IF
1627         write_le32(192);                        # Size
1628         write_hunk(811128, 192);
1629
1630         #
1631         # Firmware 75, type: SCODE FW  DTV6 ATSC ATI638 HAS IF (0x60090020), IF = 6.58 MHz id: (0000000000000000), size: 192
1632         #
1633
1634         write_le32(0x60090020);                 # Type
1635         write_le64(0x00000000, 0x00000000);     # ID
1636         write_le16(6580);                       # IF
1637         write_le32(192);                        # Size
1638         write_hunk(807480, 192);
1639
1640         #
1641         # Firmware 76, type: SCODE FW  HAS IF (0x60000000), IF = 6.60 MHz id: PAL/DK A2 (00000003000000e0), size: 192
1642         #
1643
1644         write_le32(0x60000000);                 # Type
1645         write_le64(0x00000003, 0x000000e0);     # ID
1646         write_le16(6600);                       # IF
1647         write_le32(192);                        # Size
1648         write_hunk(809016, 192);
1649
1650         #
1651         # Firmware 77, type: SCODE FW  MONO HAS IF (0x60008000), IF = 6.68 MHz id: PAL/DK A2 (00000003000000e0), size: 192
1652         #
1653
1654         write_le32(0x60008000);                 # Type
1655         write_le64(0x00000003, 0x000000e0);     # ID
1656         write_le16(6680);                       # IF
1657         write_le32(192);                        # Size
1658         write_hunk(810936, 192);
1659
1660         #
1661         # Firmware 78, type: SCODE FW  DTV6 ATSC TOYOTA794 HAS IF (0x60810020), IF = 8.14 MHz id: (0000000000000000), size: 192
1662         #
1663
1664         write_le32(0x60810020);                 # Type
1665         write_le64(0x00000000, 0x00000000);     # ID
1666         write_le16(8140);                       # IF
1667         write_le32(192);                        # Size
1668         write_hunk(810168, 192);
1669
1670         #
1671         # Firmware 79, type: SCODE FW  HAS IF (0x60000000), IF = 8.20 MHz id: (0000000000000000), size: 192
1672         #
1673
1674         write_le32(0x60000000);                 # Type
1675         write_le64(0x00000000, 0x00000000);     # ID
1676         write_le16(8200);                       # IF
1677         write_le32(192);                        # Size
1678         write_hunk(812856, 192);
1679 }
1680
1681
1682 sub extract_firmware {
1683         my $sourcefile_24 = "UDXTTM6000.sys";
1684         my $hash_24 = "cb9deb5508a5e150af2880f5b0066d78";
1685         my $outfile_24 = "xc3028-v24.fw";
1686         my $name_24 = "xc2028 firmware";
1687         my $version_24 = 516;
1688         my $nr_desc_24 = 77;
1689         my $out;
1690
1691         my $sourcefile_27 = "hcw85bda.sys";
1692         my $hash_27 = "0e44dbf63bb0169d57446aec21881ff2";
1693         my $outfile_27 = "xc3028-v27.fw";
1694         my $name_27 = "xc2028 firmware";
1695         my $version_27 = 519;
1696         my $nr_desc_27 = 80;
1697         my $out;
1698
1699         if (-e $sourcefile_24) {
1700                 verify($sourcefile_24, $hash_24);
1701
1702                 open INFILE, "<$sourcefile_24";
1703                 main_firmware_24($outfile_24, $name_24, $version_24, $nr_desc_24);
1704                 close INFILE;
1705         }
1706
1707         if (-e $sourcefile_27) {
1708                 verify($sourcefile_27, $hash_27);
1709
1710                 open INFILE, "<$sourcefile_27";
1711                 main_firmware_27($outfile_27, $name_27, $version_27, $nr_desc_27);
1712                 close INFILE;
1713         }
1714 }
1715
1716 extract_firmware;
1717 printf "Firmwares generated.\n";