Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm
[linux-2.6] / Documentation / video4linux / extract_xc3028.pl
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  MTS LCD NOGD MONO IF HAS IF (0x6002b004), IF = 4.50 MHz id: NTSC PAL/M PAL/N (000000000000b700), size: 192
690         #
691
692         write_le32(0x6002b004);                 # Type
693         write_le64(0x00000000, 0x0000b700);     # 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  DTV6 QAM DTV7 DTV78 DTV8 ZARLINK456 HAS IF (0x620003e0), IF = 4.76 MHz id: (0000000000000000), size: 192
710         #
711
712         write_le32(0x620003e0);                 # 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  HAS IF (0x60000000), IF = 5.26 MHz id: (0000000000000000), size: 192
730         #
731
732         write_le32(0x60000000);                 # 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 A2 NICAM (0000000f00000007), size: 192
740         #
741
742         write_le32(0x60008000);                 # Type
743         write_le64(0x0000000f, 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  DTV7 DTV78 DTV8 DIBCOM52 CHINA HAS IF (0x65000380), IF = 5.40 MHz id: (0000000000000000), size: 192
750         #
751
752         write_le32(0x65000380);                 # 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 (0000000300000007), size: 192
770         #
771
772         write_le32(0x60000000);                 # Type
773         write_le64(0x00000003, 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 (0000000c00000007), size: 192
780         #
781
782         write_le32(0x60000000);                 # Type
783         write_le64(0x0000000c, 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  HAS IF (0x60000000), IF = 5.90 MHz id: (0000000000000000), size: 192
790         #
791
792         write_le32(0x60000000);                 # 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/DK PAL/I SECAM/K3 SECAM/L SECAM/Lc NICAM (0000000c04c000f0), size: 192
800         #
801
802         write_le32(0x60008000);                 # Type
803         write_le64(0x0000000c, 0x04c000f0);     # 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 ATSC LG60 F6MHZ HAS IF (0x68050060), IF = 6.20 MHz id: (0000000000000000), size: 192
810         #
811
812         write_le32(0x68050060);                 # 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: PAL/DK SECAM/K3 SECAM/L NICAM (0000000c044000e0), size: 192
850         #
851
852         write_le32(0x60008000);                 # Type
853         write_le64(0x0000000c, 0x044000e0);     # 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";