#!/usr/bin/perl
#perl script to generate spi bootable u-boot
#Revision history
#03/27/08 Author Wu Qi Ming

my $SPI_MAGIC=0xAA55;
my $PHY1=0x1;
my $PHY0=0x0;
my $MAC0=0x2c;
my $MAC1=0x02;
my $MAC2=0x00;
my $MAC3=0x92;
my $MAC4=0xe0;
my $MAC5=0x00;
my $VALID=0x1; #always valid
my $OFFSET=0x0c;

if(@ARGV < 2){
	print "not enough arguments\n";
	print "Syntax: ./sgct input output\n";
	print "example: ./sgct ddr_setting.conf u-boot.srec u-boot.sflash\n";
	exit;
}
print "converting now, please wait...\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");

#form a REGCFG head
$head=sprintf("%08x",($SPI_MAGIC<<16)|($PHY1<<8)|($PHY0));
$head=$head.sprintf("%08x",($MAC3<<24)|($MAC2<<16)|($MAC1<<8)|($MAC0));
$head=$head.sprintf("%08x",($OFFSET<<24)|($VALID<<16)|($MAC5)|($MAC4));
printf OUTFILE pack("H*",$head);
$string="";
$count=0;
while ($line = <INFILE1>){
            if($line=~/\w/){
	     if($line!~/[;#\*]/){
		  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//;
		  $string=$string.sprintf("%08x%08x",hex($addr),hex($regval));
                  $count=$count+1;
               }
             }
}


printf OUTFILE pack("H*",$string);
$string="";
$firsttime=1;
$count=0;
while($aline=<INFILE2>){
	$aline=uc($aline);
	chomp($aline);
	next if($aline=~/^S0/);
        ($lineid, $length, $address, @bytes) = unpack"A2A2A8"."A2"x300, $aline;
        $length = hex($length);
        $address = hex($address);
	$i=0;
        if($lineid eq "S3")
        { 
         if($firsttime==1)
          {
             $addstr = sprintf("%08x", $address+1); 
             $string=$addstr;
             $loadaddr=$address;
             $firsttime=0;
          }
          $length=$length-4;
          while($length>1){
           $bytes[$i]=~tr/ABCDEF/abcdef/;
	   #printf ("length=%d,i=%d,byte=%02x\n",$length,$i,hex(@bytes[$i]));
           $string=$string.@bytes[$i];
           #printf ("string=%s\n",$string);
	   $length=$length-1;
           $i=$i+1;
           $count++;
          }
        }
        elsif($lineid eq "S7")
        {
           $exehead=sprintf("%08x",0xffffffff).sprintf("%08x",$address);
	   #print $exehead
        }
}




if($firsttime==1){
    $string=sprintf("%08x",3);
    printf OUTFILE pack("H*",$string);
}
else{
   printf("addstr=%s\n",$addstr); 
   printf OUTFILE pack("H*",$addstr);
   printf OUTFILE pack("H*",sprintf("%08x",$count/4));
   #printf OUTFILE pack("H*",$string);
   @bytes=unpack"A2"x$count,$string;
   for ($i=0;$i<$count;$i++){
    printf OUTFILE pack("H2",$bytes[$i]);  
}
   printf OUTFILE pack("H*",$exehead);
}





