]> pilppa.org Git - familiar-h63xx-build.git/blob - org.handhelds.familiar/packages/orinoco/spectrum-fw/parse_symbol_fw
OE tree imported from monotone branch org.openembedded.oz354fam083 at revision 8b12e3...
[familiar-h63xx-build.git] / org.handhelds.familiar / packages / orinoco / spectrum-fw / parse_symbol_fw
1 #!/usr/bin/perl -w
2
3 # Extract Symbol firmware and convert is to a header file and two binary
4 # files.
5
6 # Copyright (C) 2004 Pavel Roskin <proski@gnu.org>
7
8 # This script is Free Software, and it can be copied, distributed and
9 # modified as defined in the GNU General Public License.  A copy of
10 # its license can be downloaded from http://www.gnu.org/copyleft/gpl.html
11
12 # Usage:
13 #  parse_symbol_fw infile header binfile1 binfile2
14
15 use strict;
16
17 # Print message and exit (like "die", but without raising an exception).
18 # Newline is added at the end.
19 sub error
20 {
21         printf STDERR "ERROR: ";
22         printf STDERR @_;
23         printf STDERR "\n";
24         exit 1;
25 }
26
27 sub readnum_ba ()
28 {
29         my $byte_a;
30         read INFILE,$byte_a,1;
31         my $byte_b;
32         read INFILE,$byte_b,1;
33         return (ord($byte_b) << 8) + ord($byte_a);
34 }
35
36
37 if ($#ARGV != 3) {
38         error ("Usage: parse_symbol_fw infile header binfile1 binfile2");
39 }
40
41 unless (open (INFILE, "< $ARGV[0]")) {
42         error ("couldn't open $ARGV[0] for reading: $!");
43 }
44
45 unless (open (OUTFILE, "> $ARGV[1]")) {
46         error ("couldn't open $ARGV[1] for writing: $!");
47 }
48
49 # Process one array, either for primary or for secondary firmware
50 sub process_one_array($$) {
51         my $arrname = shift(@_);
52         my $binfile = shift(@_);
53         my $offset = -1;
54         my $str_offset = 0;
55
56         # Skip to the beginning of firmware
57         $/ = "\x00";
58         while (<INFILE>) {
59                 if (m{FILE: }g) {
60                         $offset = $str_offset + pos() - 6;
61                         last;
62                 }
63                 $str_offset = tell(INFILE);
64         }
65
66         if ($offset == -1) {
67                 error("Cannot find FILE: marker");
68         }
69
70         my @fwdata = split;
71         print $fwdata[1] . "\n";
72         seek(INFILE, $offset, 0);
73
74         my $blknum = $fwdata[3];
75         my $pdrlen = $fwdata[4];
76         my $crclen = $fwdata[5];
77         my $compatlen = $fwdata[6];
78
79         while (!eof(INFILE)) {
80                 my $byte;
81                 read INFILE, $byte, 1;
82                 last if (ord($byte) == 0x1a);
83         }
84
85         # Walk all blocks
86         my $block = $blknum;
87         while ($block-- > 0) {
88                 seek(INFILE, 4, 1);
89                 my $len = readnum_ba();
90                 seek(INFILE, $len, 1);
91         }
92
93         my $img_len = tell(INFILE) - $offset + $pdrlen + $crclen + $compatlen + 2;
94         seek(INFILE, $offset, 0);
95
96         # Write binary file for the section
97         unless (open (BINFILE, "> $binfile")) {
98                 error ("couldn't open $binfile for writing: $!");
99         }
100
101         # Output the array
102         printf OUTFILE "/* %s %s */\n", $fwdata[1], $fwdata[2];
103         printf OUTFILE "static u8 %s[] = {\n", $arrname;
104
105         my $count = 0;
106         while ($count++ < $img_len) {
107                 my $byte;
108                 read INFILE, $byte, 1;
109                 $byte = ord($byte);
110                 printf OUTFILE "0x%02x,", $byte;
111                 printf BINFILE "%c", $byte;
112                 if ($count % 16 == 0) {
113                         printf OUTFILE "\n";
114                 }
115         }
116
117         if ($img_len % 16) {
118                 printf OUTFILE "\n";
119         }
120
121         print OUTFILE "};\n";
122         close(BINFILE);
123 }
124
125 process_one_array("primsym", $ARGV[2]);
126 process_one_array("secsym", $ARGV[3]);
127
128 close(INFILE);
129 close(OUTFILE);