linux/Documentation/video4linux/extract_xc3028.pl
<<
>>
Prefs
   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;
  17use IO::Handle;
  18
  19my $debug=0;
  20
  21sub 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
  38sub 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
  57sub 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
  66sub 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
  77sub 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
  96sub 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
 111sub 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
 138sub 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
 909sub 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
 925extract_firmware;
 926printf "Firmwares generated.\n";
 927
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.