mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-04 06:54:27 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			158 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/perl
 | 
						|
my $aline;
 | 
						|
my $lineid;
 | 
						|
my $length;
 | 
						|
my $address;
 | 
						|
my @bytes;
 | 
						|
my $addstr;
 | 
						|
my $chsum=0;
 | 
						|
my $count=0;
 | 
						|
my $firstime=1;
 | 
						|
my $i;
 | 
						|
my $currentaddr;
 | 
						|
my $tmp;
 | 
						|
my $holder="";
 | 
						|
my $loadaddr;
 | 
						|
 | 
						|
if(@ARGV < 2){
 | 
						|
	print "\n not enough arguments";
 | 
						|
	print "\n Syntax: ./program_SDRAM input output\n";
 | 
						|
}
 | 
						|
 | 
						|
open(INFILE1, "<$ARGV[0]") || die("\ninput open fail\n");
 | 
						|
open(INFILE2, "<$ARGV[1]") || die("\ninput open fail\n");
 | 
						|
open(OUTFILE, ">$ARGV[2]") || die("\nOutput file open fail\n");
 | 
						|
 | 
						|
$i=0;
 | 
						|
while ($line = <INFILE1>){
 | 
						|
            if($line=~/\w/){
 | 
						|
	     if($line!~/[;#\*]/){
 | 
						|
                  if($i eq 0){
 | 
						|
		  printf OUTFILE ("33333333");
 | 
						|
		  }
 | 
						|
		  chomp($line);
 | 
						|
		  $line=~s/\t//;
 | 
						|
		  @array=split(/ +/,$line);
 | 
						|
                  $j=0;
 | 
						|
		  while(@array[$j]!~/\w/)
 | 
						|
		  {
 | 
						|
                    $j=$j+1;
 | 
						|
 | 
						|
		  }
 | 
						|
		  $addr=@array[$j];
 | 
						|
	          $regval=@array[$j+1];
 | 
						|
                  $addr=~s/0x//;
 | 
						|
                  $regval=~s/0x//;
 | 
						|
		  printf OUTFILE ("%08x%08x",hex($addr),hex($regval));
 | 
						|
                  $i=$i+1;
 | 
						|
		  if($i eq 8)
 | 
						|
		  {
 | 
						|
                      $i=0;
 | 
						|
		      printf OUTFILE ("\n");
 | 
						|
		  }
 | 
						|
 | 
						|
               }
 | 
						|
             }
 | 
						|
 | 
						|
	    }
 | 
						|
 | 
						|
        while($i lt 8 && $i gt 0){
 | 
						|
                   printf OUTFILE "00"x8;
 | 
						|
		   $i=$i+1;
 | 
						|
		   }
 | 
						|
        if($i eq 8){
 | 
						|
	printf OUTFILE ("\n");
 | 
						|
        }
 | 
						|
 | 
						|
while($aline=<INFILE2>){
 | 
						|
	$aline=uc($aline);
 | 
						|
	chomp($aline);
 | 
						|
	next if(($aline=~/^S0/) || ($aline=~/^S7/));
 | 
						|
	($lineid, $length, $address, @bytes) = unpack"A2A2A8"."A2"x300, $aline;
 | 
						|
	$length = hex($length);
 | 
						|
	$address = hex($address);
 | 
						|
	$length -=5;
 | 
						|
	$i=0;
 | 
						|
 | 
						|
	while($length>0){
 | 
						|
		if($firstime==1){
 | 
						|
				$addstr = sprintf("%x", $address);
 | 
						|
				$addstr = "0"x(8-length($addstr)).$addstr;
 | 
						|
				print OUTFILE $addstr;
 | 
						|
				addchsum($addstr);
 | 
						|
				$firstime=0;
 | 
						|
				$currentaddr=$address;
 | 
						|
				$loadaddr = $addstr;
 | 
						|
		}
 | 
						|
		else{
 | 
						|
			if($count==64){
 | 
						|
				$addstr = sprintf("%x", $currentaddr);
 | 
						|
				$addstr = "0"x(8-length($addstr)).$addstr;
 | 
						|
				print OUTFILE $addstr;
 | 
						|
				addchsum($addstr);
 | 
						|
				$count=0;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		while($count<64){
 | 
						|
		        $bytes[$i]=~tr/ABCDEF/abcdef/;
 | 
						|
			print OUTFILE "$bytes[$i]";
 | 
						|
			addchsum($bytes[$i]);
 | 
						|
			$i++;
 | 
						|
			$count++;
 | 
						|
			$length--;
 | 
						|
			last if($length==0);
 | 
						|
		}
 | 
						|
		if($count==64){
 | 
						|
			print OUTFILE "\n";
 | 
						|
			#print OUTFILE "\r";
 | 
						|
			$currentaddr+=64;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
if($count != 64){
 | 
						|
	$tmp = "00";
 | 
						|
	for($i=0;$i<(64-$count);$i++){
 | 
						|
		print OUTFILE "00";
 | 
						|
		addchsum($tmp);
 | 
						|
	}
 | 
						|
	print OUTFILE "\n";
 | 
						|
	#print OUTFILE "\r";
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
print OUTFILE "11"x4;
 | 
						|
use integer;
 | 
						|
$chsum=$chsum & 0xffffffff;
 | 
						|
$chsum = sprintf("%X", $chsum);
 | 
						|
$chsum = "0"x(8-length($chsum)).$chsum;
 | 
						|
$chsum =~tr/ABCDEF/abcdef/;
 | 
						|
print OUTFILE $chsum;
 | 
						|
print OUTFILE "00"x60;
 | 
						|
print OUTFILE "\n";
 | 
						|
#print OUTFILE "\r";
 | 
						|
 | 
						|
print OUTFILE "99"x4;
 | 
						|
print OUTFILE $loadaddr;
 | 
						|
print OUTFILE "00"x60;
 | 
						|
print OUTFILE "\n";
 | 
						|
#print OUTFILE "\r";
 | 
						|
 | 
						|
 | 
						|
close OUTFILE;
 | 
						|
#END of Program
 | 
						|
 | 
						|
 | 
						|
 | 
						|
sub addchsum{
 | 
						|
	my $cc=$_[0];
 | 
						|
	$holder=$holder.$cc;
 | 
						|
	if(length($holder)==8){
 | 
						|
		$holder = hex($holder);
 | 
						|
		$chsum+=$holder;
 | 
						|
		$holder="";
 | 
						|
	}
 | 
						|
}
 | 
						|
#END
 | 
						|
 | 
						|
 |