wrapflash.pl 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #!/usr/bin/perl
  2. use strict;
  3. use integer;
  4. my $SPIFLASH_MAGIC = 0x7a07fbd6;
  5. my $FDT_END = 0;
  6. my $FDT_DATA = 1;
  7. my $FDT_TARGET = 2;
  8. my $FDT_NOTE = 3;
  9. my $FDF_OPTIONAL = 0x0001;
  10. sub getint($) {
  11. my($s) = @_;
  12. return ($s =~ /^0/) ? oct $s : $s+0;
  13. }
  14. sub filelen($) {
  15. my($f) = @_;
  16. my @s = stat($f);
  17. return $s[7];
  18. }
  19. sub output_chunk($$$$) {
  20. my($type,$flags,$addr,$data) = @_;
  21. print pack("VvvVV", $SPIFLASH_MAGIC, $type, $flags, length($data), $addr);
  22. print $data;
  23. }
  24. my $target = shift @ARGV;
  25. if (!defined($target)) {
  26. die "Usage: $0 target_name [infile addr]...\n";
  27. }
  28. binmode(STDOUT);
  29. output_chunk($FDT_TARGET, 0, 0, $target);
  30. my $err;
  31. while (1) {
  32. my $infile = shift @ARGV;
  33. my $inaddr = getint(shift @ARGV);
  34. last if (!defined($infile));
  35. my $in;
  36. if (!open($in, '<', $infile)) {
  37. $err = "$infile: $!";
  38. last;
  39. }
  40. binmode($in);
  41. my @is = stat($in);
  42. my $data;
  43. my $dlen = read($in, $data, $is[7]);
  44. close($in);
  45. output_chunk($FDT_DATA, 0, $inaddr, $data);
  46. }
  47. output_chunk($FDT_END, 0, 0, '');
  48. if (defined($err)) {
  49. die "$0: $err\n";
  50. }