#!/usr/bin/perl #reads EEPROM definition file and writes Intel hex format. #Copyright: Owen Duffy 2011. All rights reserved. use JSON; #use Data::Dumper; $id='$Id: j2h.pl 686 2011-12-24 22:25:33Z owen $'; $ctr=0; $offs=0; $buff0; @r=(0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15); sub rev{ my ($s)=@_; my $i; $out=''; for($i=length($s)-1;$i>=0;$i--){ $out=$out.sprintf("%01X",$r[hex(substr($s,$i,1))]); } $out; } sub dobyte{ ($buff0[$ctr++])=@_; if($ctr==16){inforec()} } sub inforec{ my $i; my $buff1=''; my $chksum=0; my $rectype=0; for($i=0;$i<$ctr;$i++){$buff1.=sprintf("%02X",$buff0[$i])} $buff1=sprintf("%02X%04X%02X",length($buff1)/2,$offs,$rectype).$buff1; $chksum+=$_ for unpack('C*', pack("H*",$buff1)); printf(":%s%02X\n",$buff1,(~($chksum)+1)&0xff); $offs+=$ctr; $ctr=0; } my $regsitem=0; my $buff2=''; #strip leading comments while(<>){if(m/^\s*?\{/m){last}} #skip lines until leading brace #now slurp the rest {local $/;@json=$_.<>;} #decode it $cfg=decode_json(@json); #now traverse the config data $revflag=($cfg->{'rbo'} eq 'R'); for($j=0;$j<($#{$cfg->{'regs'}}+1);$j++){ $buff3=''; $regslen[$j]=0; for($i=0;$i<($#{$cfg->{'regs'}[$j]}+1);$i++){ $yy=($#{$cfg->{'regs'}[$j]}+1); $str=$cfg->{'regs'}[$j][$i]; if(length($str)%2){$str='0'.$str}; if($revflag){$str=rev($str);} $reglen=int(length($str)/2); $buff3.=sprintf("%02X%s",$reglen,$str); $regslen[$j]+=$reglen+1; } $buff2.=sprintf("%02X%s",$regslen[$j]).$buff3; } $off=0; $buff1=''; #build rec $buff1.=$cfg->{'ver'}; $off+=1; $buff1.=$cfg->{'options'}; $off+=2; #built the toc my $nregsets=$#{$cfg->{'regs'}}+1; $buff1.=sprintf("%02X",$nregsets*2); $off+=1; $off+=$nregsets*2; #add in toc length for($j=0;$j<$nregsets;$j++){ # $len=$regslen[$j]; $buff1.=sprintf("%02X%02X",$off&0xff,$off>>8); $off+=$regslen[$j]+1; } $buff1.=$buff2; for $ch (unpack('C*', pack('H*',$buff1))){dobyte($ch)} if($ctr>0){inforec} #residual printf(":00000001FF\n"); #EOF rec