1#!/usr/bin/env perl
2
3# Copyright (c) Mauro Carvalho Chehab <mchehab@kernel.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;
23use IO::Handle;
24
25my $debug=0;
26
27sub 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
44sub 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
63sub 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
72sub 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
83sub 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
102sub 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
117sub 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
144sub 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
910sub 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
1682sub 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
1716extract_firmware;
1717printf "Firmwares generated.\n";
1718