diff options
Diffstat (limited to 'package/uboot-lantiq/gct')
-rwxr-xr-x | package/uboot-lantiq/gct | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/package/uboot-lantiq/gct b/package/uboot-lantiq/gct new file mode 100755 index 0000000000..4054c15f5f --- /dev/null +++ b/package/uboot-lantiq/gct @@ -0,0 +1,165 @@ +#!/usr/bin/perl + +#use strict; +#use Cwd; +#use Env; + +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){ + die("\n Syntax: ./program_SDRAM input1(memory setup) input2(*\.srec) output\n"); +} + +open(INFILE1, "<$ARGV[0]") || die("\ninput1 open fail\n"); +open(INFILE2, "<$ARGV[1]") || die("\ninput2 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; + } + #printf("*** %x != %x\n", $address, $currentaddr) if $address != $currentaddr; + } + if($currentaddr < $address) { + print OUTFILE "00"; + addchsum("00"); + $count++; + $currentaddr++; + } + else { + while($count<64){ + $bytes[$i]=~tr/ABCDEF/abcdef/; + print OUTFILE "$bytes[$i]"; + addchsum($bytes[$i]); + $i++; + $count++; + $currentaddr++; + $length--; + last if($length==0); + } + } + if($count==64){ + print OUTFILE "\n"; + #print OUTFILE "\r"; + } + } +} +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 + |