11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#! /usr/bin/perl -w 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# convert an Intel HEX file into a set of C records usable by the firmware 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# loading code in usb-serial.c (or others) 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# accepts the .hex file(s) on stdin, a basename (to name the initialized 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# array) as an argument, and prints the .h file to stdout. Typical usage: 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# perl ezusb_convert.pl foo <foo.hex >fw_foo.h 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmy $basename = $ARGV[0]; 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsdie "no base name specified" unless $basename; 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldswhile (<STDIN>) { 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds # ':' <len> <addr> <type> <len-data> <crc> '\r' 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds # len, type, crc are 2-char hex, addr is 4-char hex. type is 00 for 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds # normal records, 01 for EOF 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds my($lenstring, $addrstring, $typestring, $reststring, $doscrap) = 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /^:(\w\w)(\w\w\w\w)(\w\w)(\w+)(\r?)$/; 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds die "malformed line: $_" unless $reststring; 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds last if $typestring eq '01'; 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds my($len) = hex($lenstring); 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds my($addr) = hex($addrstring); 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds my(@bytes) = unpack("C*", pack("H".(2*$len), $reststring)); 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds #pop(@bytes); # last byte is a CRC 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds push(@records, [$addr, \@bytes]); 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds@sorted_records = sort { $a->[0] <=> $b->[0] } @records; 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsprint <<"EOF"; 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ${basename}_fw.h 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Generated from ${basename}.s by ezusb_convert.pl 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This file is presumed to be under the same copyright as the source file 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * from which it was derived. 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEOF 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsprint "static const struct ezusb_hex_record ${basename}_firmware[] = {\n"; 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsforeach $r (@sorted_records) { 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printf("{ 0x%04x,\t%d,\t{", $r->[0], scalar(@{$r->[1]})); 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds print join(", ", map {sprintf('0x%02x', $_);} @{$r->[1]}); 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds print "} },\n"; 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsprint "{ 0xffff,\t0,\t{0x00} }\n"; 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsprint "};\n"; 51