123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #!/usr/bin/perl
- use strict;
- use integer;
- my $SPIFLASH_MAGIC = 0x7a07fbd6;
- my $FDT_END = 0;
- my $FDT_DATA = 1;
- my $FDT_TARGET = 2;
- my $FDT_NOTE = 3;
- my $FDF_OPTIONAL = 0x0001;
- sub getint($) {
- my($s) = @_;
- return ($s =~ /^0/) ? oct $s : $s+0;
- }
- sub filelen($) {
- my($f) = @_;
- my @s = stat($f);
- return $s[7];
- }
- sub output_chunk($$$$) {
- my($type,$flags,$addr,$data) = @_;
- print pack("VvvVV", $SPIFLASH_MAGIC, $type, $flags, length($data), $addr);
- print $data;
- }
- my $target = shift @ARGV;
- if (!defined($target)) {
- die "Usage: $0 target_name [infile addr]...\n";
- }
- binmode(STDOUT);
- output_chunk($FDT_TARGET, 0, 0, $target);
- my $err;
- while (1) {
- my $infile = shift @ARGV;
- my $inaddr = getint(shift @ARGV);
- last if (!defined($infile));
- my $in;
- if (!open($in, '<', $infile)) {
- $err = "$infile: $!";
- last;
- }
- binmode($in);
- my @is = stat($in);
- my $data;
- my $dlen = read($in, $data, $is[7]);
- close($in);
- output_chunk($FDT_DATA, 0, $inaddr, $data);
- }
- output_chunk($FDT_END, 0, 0, '');
- if (defined($err)) {
- die "$0: $err\n";
- }
|