2
0

checksum.pl 967 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #!/usr/bin/perl
  2. use strict;
  3. use integer;
  4. my($infile,$outfile,$length) = @ARGV;
  5. unless (defined($outfile)) {
  6. die "Usage: $0 infile outfile [length]\n";
  7. }
  8. sub nextblock($$$) {
  9. my($block,$len,$limit) = @_;
  10. my $bytes = $block;
  11. if (defined($limit) && $limit - $len < $bytes) {
  12. $bytes = $limit - $len;
  13. }
  14. return $bytes;
  15. }
  16. open(my $in, '<', $infile) or die "$0: $infile: $!\n";
  17. binmode $in;
  18. my $data;
  19. my $sum = 0;
  20. my $len = 0;
  21. my $blocklen;
  22. while (($blocklen = nextblock(4096, $len, $length)) &&
  23. read($in, $data, $blocklen) == $blocklen) {
  24. foreach my $w (unpack("V*", $data)) {
  25. $sum = ($sum + $w) & 0xffffffff;
  26. }
  27. $len += $blocklen;
  28. }
  29. close($in);
  30. open(my $out, '>', $outfile) or die "$0: $outfile: $!\n";
  31. my $outfile_c = uc($outfile);
  32. $outfile_c =~ s/[\W_]+/_/g;
  33. print $out "#ifndef $outfile_c\n";
  34. print $out "#define $outfile_c\n";
  35. printf $out "#define SDRAM_SUM 0x%08x\n", $sum;
  36. print $out "#endif\n";
  37. close($out);