#!/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"; }