Cleanup master
authorJan Michel <j.michel@gsi.de>
Fri, 19 Jul 2013 16:44:08 +0000 (18:44 +0200)
committerJan Michel <j.michel@gsi.de>
Fri, 19 Jul 2013 16:44:08 +0000 (18:44 +0200)
soft/toolbox/jtag_atomic/ui_writeram.pl

index a8881d886364de7d1d73857074d8ffd355a8c85c..382e040b365a907cbb476eeda043f4042e7cbc93 100755 (executable)
@@ -41,18 +41,9 @@ required:
 "
 }
 
-#push(@INC, "./BN");
-#use lib "$ENV{PWD}/BN";
-#use lib "/d/sugar/bneumann/vhdl/jtag_proj/trb_maps_jtag2/ui/";
-#use lib "/d/sugar/bneumann/vhdl/jtag_proj/trb_maps_jtag2/ui/BN/blib/arch";
-#use lib "/d/sugar/bneumann/vhdl/jtag_proj/trb_maps_jtag2/ui/";
-#use lib "/d/sugar/bneumann/vhdl/jtag_proj/trb_maps_jtag2/ui/BN/blib/arch";
-
 use lib "libs/BN/blib/arch";
 use BN::CRC32;
-#use String::CRC32;
 
-#use feature "state";
 use POSIX;
 
 # whitespace trimming from http://www.somacon.com/p114.php
@@ -61,18 +52,9 @@ sub trim($);
 sub ltrim($);
 sub rtrim($);
 
-# Create a test string
-my $string = "  \t  Hello world!   ";
-
-# Here is how to output the trimmed text "Hello world!"
-#print trim($string)."\n";
-#print ltrim($string)."\n";
-#print rtrim($string)."\n";
 sub any2dec { # converts numeric expressions 0x, 0b or decimal to decimal
-  
   my $argument = $_[0];
   #print "any2dec input argument $argument\n";  
-
   if ( $argument =~ m/0[bxBX]/) { 
     return oct $argument;
   } else {
@@ -109,32 +91,32 @@ sub reverse32bit($) {
   #return 1;
 }
 
-sub int_to_32bit_hex($) {
-  my ($in) = @_;
-  my $hex = sprintf("%.8X", $in);
-  return $hex;
-}
+# sub int_to_32bit_hex($) {
+#   my ($in) = @_;
+#   my $hex = sprintf("%.8X", $in);
+#   return $hex;
+# }
+# 
+# sub report {
+#   if(defined($opt_quiet)){
+#     if($_[0] eq 'data') { print $_[1]; }
+#   }
+#   else {
+#     print $_[1];
+#   }
+# }
+# sub reportd {
+#   if(!defined($opt_quiet)){
+#     print "debug:" . $_[0];
+#   }
+# }
 
-sub report {
-  if(defined($opt_quiet)){
-    if($_[0] eq 'data') { print $_[1]; }
-  }
-  else {
-    print $_[1];
-  }
-}
-sub reportd {
-  if(!defined($opt_quiet)){
-    print "debug:" . $_[0];
-  }
-}
 
 
 
-
-if(not( -e "/tmp/jtag_initmem")) {
-  system("mkdir /tmp/jtag_initmem");
-}
+# if(not( -e "/tmp/jtag_initmem")) {
+#   system("mkdir /tmp/jtag_initmem");
+# }
 
 my $chainsfile= 'chains.ini';
 $chainsfile = $ENV{'JTAGCONFIGPATH'}."/".$chainsfile if defined($ENV{'JTAGCONFIGPATH'});
@@ -142,20 +124,6 @@ $chainsfile = $ENV{'JTAGCONFIGPATH'}."/".$chainsfile if defined($ENV{'JTAGCONFIG
 my $chainsSettings = new Config::Abstract::Ini($chainsfile);
 my %allchains = $chainsSettings->get_all_settings;
 
-my $date = strftime "%Y%m%d%H%M%S", localtime;
-#my $initmem_folder = "/tmp/jtag_initmem/$date";
-my $initmem_folder = "/tmp/jtag_initmem/jtag_atomic";
-
-if(-e $initmem_folder) {
-  #die("Error: Folder with the same date already exists!");
-}
-else {
-  mkdir $initmem_folder,0755;
-}
-
-# File with prefix names files for last programmed values
-my $lastprogfilename = "/tmp/jtag_initmem/lastprog.txt";
-my $handle_lastprog = FileHandle->new($lastprogfilename, 'w');
 my $memhash;
 
 
@@ -179,14 +147,9 @@ foreach my $chain (keys %allchains) {
   my $cmd_reg_addr  = any2dec($settings{'CMDreg_trbnetAddr'});
   my $ram_base_addr = any2dec($settings{'RAMbase_trbnetAddr'});
   my $data_reg_addr = any2dec($settings{'DATAreg_trbnetAddr'});
-  my $memfiles_prefix; # the same prefix is used for the files for one chain
-                       # need one file per chip with at maximum 256 32 bit words
-                       # that are written at once.
-                       # then the RAM base pointer has to be changed for the next chip
-  my @memfilenames=();
+  my @settingnames=();
 
 
-  $memfiles_prefix="$initmem_folder/$chain";
   foreach my $setting_name (sort keys %settings) {
     if ($setting_name =~ /sensor[0-9]+/) {
       push(@sensors, $setting_name);
@@ -231,243 +194,90 @@ foreach my $chain (keys %allchains) {
             print ("Warning: Length of the same DR of two sensors differs.");
         }
       }
-      my $memfilename = $memfiles_prefix . "." . $setting_name . ".txt";
-      if( -e ($memfilename)) {
-        #die ("Error: RAM text file \"$memfilename\" exists.");
-      }
-      if( not defined($opt_quiet)) { print "Opening $memfilename...\n"; }
-#       my $handle = FileHandle->new($memfilename, 'w');
-      push(@memfilenames, $memfilename);
+      push(@settingnames, $setting_name);
       # write numregs + IRlen
-      my $word = scalar($this_irlen)<<16;
+      my $word = scalar($this_irlen) << 16;
       $word = $word + scalar @irs;
-      ### $word = ($word<<16) + pack("L", scalar(@irs));
-#       print $handle "0x" . uc (substr(reverse(join('',unpack("h8", pack("L", $word)))),0,8)) . "\t# IRlen & numregs \n";
-      push(@{$memhash->{$memfilename}},$word);
-      #####print $handle "0x" .uc (substr(reverse(join('',unpack("h8", pack("L", scalar($this_irlen))))),4,4)) . uc (substr(reverse(join('',unpack("h8", pack("L", scalar(@irs))))),4,4)) . "\t# IRlen & numregs \n";
+      push(@{$memhash->{$setting_name}},$word);
 
-      #print "reverse test: " . reverse32bit(0x00000001)."\n";
       my $initial = 0x00000000;
       my $crcword = pack("L", reverse32bit($word));
       my $crc0 = crc32($crcword, $initial);
-      #my $crc0_rn = ~reverse32bit($crc0);
-      #printf "crc0: %0.8X, crc0_rn: %0.8X, word: %0.8X\n", $crc0, $crc0_rn, $word;
       # write DEV_ID
       $word = 0x4D323601; 
-#       print $handle "0x" . uc (substr(reverse(join('',unpack("h8", pack("L", $word)))),0,8)) . "\t# DEV_ID \n";
-      push(@{$memhash->{$memfilename}},$word);
+      push(@{$memhash->{$setting_name}},$word);
       $crcword = pack("L", reverse32bit($word));
       $crc0 = crc32($crcword, $crc0);
       my $crc0_rn = ~reverse32bit($crc0);
-      #printf "crc0: %0.8X, crc0_rn: %0.8X, word: %0.8X\n", $crc0, $crc0_rn, $word;
       # write pointer
       my $offset = 3*@irs+4;
       for(my $reg_i=0;$reg_i<@irs;$reg_i++) {
         my $drlen = $drs_length[$reg_i];
         $word = $offset;
-        #print $handle "0x". uc (substr(reverse(join('',unpack("h8", pack("L", 0)))),4,4)) . uc (substr(reverse(join('',unpack("h8", pack("L", scalar($offset))))),4,4))   . "\t# Pointer + reserved\n";
         $crcword = pack("L", reverse32bit($word));
         $crc0 = crc32($crcword, $crc0);
-#         print $handle "0x" . uc (substr(reverse(join('',unpack("h8", pack("L",  $word)))),0,8)) . "\t# Pointer + reserved \n";
-        push(@{$memhash->{$memfilename}},$word);
+        push(@{$memhash->{$setting_name}},$word);
         $word = $drlen;
         $crcword = pack("L", reverse32bit($word));
         $crc0 = crc32($crcword, $crc0);
-        #print $handle "0x0000". uc (substr(reverse(join('',unpack("h8", pack("L", scalar($drlen))))),4,4))  . "\t# Length\n";
-#         print $handle "0x" . uc (substr(reverse(join('',unpack("h8",pack("L",  $word)))),0,8)) . "\t# Length\n";
-        push(@{$memhash->{$memfilename}},$word);
+        push(@{$memhash->{$setting_name}},$word);
         $offset += floor(($drlen+31)/32);
       }
       # write CRC-32
-      #my $ir_packed_r = pack("B*", scalar reverse substr(unpack("B*", pack("H*", $ir.("0"x (7-(length($ir)-1)%8)))),0, 32));
       $crc0_rn = ~reverse32bit($crc0);
-      #printf "CRC: %0.8X.\n", $crc0_rn, 1;
-      my $line_crc = sprintf "%0.8X", $crc0_rn;
-#       print $handle "0x". substr($line_crc,length($line_crc)-8,8) . "\t# CRC-32\n";
-      push(@{$memhash->{$memfilename}},$crc0_rn & 0xFFFFFFFF);
+      push(@{$memhash->{$setting_name}},$crc0_rn & 0xFFFFFFFF);
 
       my $crc1 = 0xFFFFFFFF;
       # write IRs
       for(my $reg_i=0;$reg_i<@irs;$reg_i++) {
         my $ir = $irs[$reg_i];
-        #my @words = unpack("L", pack("H*", uc($ir)));
         $word = unpack("L", pack("h*", (scalar reverse uc($ir)) ."000000"));
-       #print "ir=$ir.IR word: $word\n";
         $crcword = pack("L", reverse32bit($word));
         $crc1 = crc32($crcword, $crc1);
-#         print $handle "0x".("0"x(8-length($ir))).uc($ir) . "\t# IR\n";
-        push(@{$memhash->{$memfilename}},hex($ir));
+        push(@{$memhash->{$setting_name}},hex($ir));
         
       }
       # write BYPASSREG IR
       $word = unpack("L", pack("h*", (scalar reverse uc($bypassreg)) ."000000"));
       $crcword = pack("L", reverse32bit($word));
       $crc1 = crc32($crcword, $crc1);
-#       print $handle "0x".("0"x(8-length($bypassreg))).uc($bypassreg) . "\t# IR BYPASS\n";
-      push(@{$memhash->{$memfilename}},hex($bypassreg));
+      push(@{$memhash->{$setting_name}},hex($bypassreg));
       
       # write DRs
       for(my $reg_i=0;$reg_i<@irs;$reg_i++) {
         my $length = $drs_length[$reg_i];
         my $numwords = floor(($length+31)/32);
         for(my $i=0;$i<$numwords; $i++) {
-               #print "length: $length\n";
-               #print "numwords: $numwords\n";
-         
           $word = unpack("L", pack("h*", (scalar reverse uc(substr($drs[$reg_i],($numwords-$i-1)*8,8)))));
           $crcword = pack("L", reverse32bit($word));
           $crc1 = crc32($crcword, $crc1);
-          my $linestr = "0x". substr($drs[$reg_i],($numwords-$i-1)*8,8) . "\t# DR" . $reg_i . "\n";
-#           print $handle $linestr; 
-          push(@{$memhash->{$memfilename}},hex(substr($drs[$reg_i],($numwords-$i-1)*8,8)));
+#           my $linestr = "0x". substr($drs[$reg_i],($numwords-$i-1)*8,8) . "\t# DR" . $reg_i . "\n";
+          push(@{$memhash->{$setting_name}},hex(substr($drs[$reg_i],($numwords-$i-1)*8,8)));
         }
       }
       #write CRC-32
       my $crc1_rn = ~reverse32bit($crc1);
-      $line_crc = sprintf "%0.8X", $crc1_rn;
-#       print $handle "0x". substr($line_crc,length($line_crc)-8,8) . "\t# CRC-32\n";
-      push(@{$memhash->{$memfilename}},$crc1_rn & 0xFFFFFFFF);
+      push(@{$memhash->{$setting_name}},$crc1_rn & 0xFFFFFFFF);
     }
   }
-#   my $numchips_hex = int_to_32bit_hex(scalar @sensors);
-  #if(not defined($opt_quiet)) { print "trbcmd w $fpga_addr $cmd_reg_addr 0x0000000A 2>&1\n"; } # CMD_STOP
-  #my $result = `trbcmd w $fpga_addr $cmd_reg_addr 0x0000000A 2>&1 \n`; # CMD_STOP
   trb_register_write($fpga_addr ,$cmd_reg_addr,0x0000000A) or die trb_strerror();
-#   execute_shell_command("trbcmd w $fpga_addr $cmd_reg_addr 0x0000000A", ""); # CMD_STOP
-  #if(not($? == 0)) {syslog("ERR", "trbcmd returned $?. Output: $result.")}
-  #if(not defined($opt_quiet)) { print "trbcmd w $fpga_addr $data_reg_addr 0x$numchips_hex\n"; } # ADDR_CONTROL_DATA_REGISTER
-  #$result = `trbcmd w $fpga_addr $data_reg_addr 0x$numchips_hex 2>&1\n`; # ADDR_CONTROL_DATA_REGISTER
   trb_register_write($fpga_addr ,$data_reg_addr,scalar @sensors) or die trb_strerror();
-#   execute_shell_command("trbcmd w $fpga_addr $data_reg_addr 0x$numchips_hex", ""); # ADDR_CONTROL_DATA_REGISTER
-  #if(not defined($opt_quiet)) { print "trbcmd w $fpga_addr $cmd_reg_addr 0x00000033\n"; }      # COMMAND: M26C_CMD_SET_NUMCHIPS_CONFIGURED
-  #$result = `trbcmd w $fpga_addr $cmd_reg_addr 0x00000033\n`;      # COMMAND: M26C_CMD_SET_NUMCHIPS_CONFIGURED
   trb_register_write($fpga_addr ,$cmd_reg_addr,0x00000033) or die trb_strerror();
-#   execute_shell_command("trbcmd w $fpga_addr $cmd_reg_addr 0x00000033", "");
-  for(my $i=0;$i<scalar @memfilenames;$i++) {
 
+  for(my $i=0;$i<scalar @settingnames;$i++) {
     # write RAM base pointer
-    my $ihex = int_to_32bit_hex($i);
     if(not defined($opt_quiet)) { print "set RAM base pointer: \n"; }
-    #if(not defined($opt_quiet)) { print "trbcmd w $fpga_addr $ram_base_addr 0x$ihex\n"; }
-    #$result = `trbcmd w $fpga_addr $ram_base_addr 0x$ihex\n`;
     trb_register_write($fpga_addr, $ram_base_addr, $i) or die trb_strerror();
-#     execute_shell_command("trbcmd w $fpga_addr $ram_base_addr 0x$ihex", "");
     # write to configuration RAM
     if(not defined($opt_quiet)) { print "write max. 256 32-bit-words: \n"; }
-    #if(not defined($opt_quiet)) { print "trbcmd wm $fpga_addr $ram_addr 0 $memfilenames[$i]\n"; }
-    #$result = `trbcmd wm $fpga_addr $ram_addr 0 $memfilenames[$i]`;
-#    execute_shell_command("trbcmd wm $fpga_addr $ram_addr 0 $memfilenames[$i]", "");
-    trb_register_write_mem($fpga_addr,$ram_addr,0,$memhash->{$memfilenames[$i]},scalar @{$memhash->{$memfilenames[$i]}}) or die trb_strerror();
-    
-#   print "---------------\n";
-#   foreach my $s (@{$memhash->{$memfilenames[$i]}}) {
-#     printf("0x%08X\n",$s);
-#     }
-#   print "---------------\n";    
+    trb_register_write_mem($fpga_addr,$ram_addr,0,$memhash->{$settingnames[$i]},scalar @{$memhash->{$settingnames[$i]}}) or die trb_strerror();
   }
   
-  #if(not defined($opt_quiet)){ print "trbcmd w $fpga_addr $cmd_reg_addr 0x00000009\n"; }     # CMD_START
-  #$result = `trbcmd w $fpga_addr $cmd_reg_addr 0x00000009\n`;      # CMD_START
+  
   trb_register_write($fpga_addr, $cmd_reg_addr, 0x00000009) or die trb_strerror();
-#   execute_shell_command("trbcmd w $fpga_addr $cmd_reg_addr 0x00000009", ""); # CMD_START
 
   if(not defined($opt_quiet)) { print "\n"; }
   print "done.\n";
   syslog("INFO", "$chain done.\n");
 }
 
-print $handle_lastprog $initmem_folder;
-#   #print "data registers for FPGA $fpga_addr:", map { "$_ => $drs_binary{$_}\n" } keys %drs_binary;
-#   $drs_offset{$irs[0]} = 4+(scalar @irs)*2;
-#   for (my $i=1;$i<@irs;$i++) {
-#     my $dr_length = $drs_length{$irs[$i-1]};
-#     $drs_offset{$irs[$i]} = $drs_offset{$irs[$i-1]} + floor(($dr_length*(scalar @sensors)+31)/32) + 2; # add one x 32 bit for CRC, one x 32 bit for IR, integer division rounds down, right?
-#   }
-#   #open RAMTEXT, ">$memfiles_prefix{$chain}";
-#   $num_words = 0;
-#   my $ram_fh;
-#   my @mem_filenames;
-#   memfile_writeline( $ram_fh, \@mem_filenames, $memfiles_prefix, "0x".uc (reverse(join('',unpack("h8", pack("L", scalar(@sensors)))))) . "\t# numchips \n"); # numchips; the reverse is done here because apparently internally the unsigned long is stored LSByte first (little endian)
-#   memfile_writeline( $ram_fh, \@mem_filenames, $memfiles_prefix, "0x".uc(reverse(join('',unpack("h8", pack("L", 0))))) . "\t# reserved\n"); # reserved
-#   for (my $i=0;$i<@irs;$i++) {
-#     memfile_writeline( $ram_fh, \@mem_filenames, $memfiles_prefix, "0x".uc(reverse(join('',unpack("h8", pack("L", $drs_offset{$irs[$i]}))))) . "\t# pointer\n"); # pointer
-#     memfile_writeline( $ram_fh, \@mem_filenames, $memfiles_prefix,  "0x".uc(reverse(join('',unpack("h8", pack("L", $drs_length{$irs[$i]}))))) . "\t# length \n"); # length
-#   }
-#   memfile_writeline( $ram_fh, \@mem_filenames, $memfiles_prefix, "0x00000000\t# pointer (end of list)\n");
-#   memfile_writeline( $ram_fh, \@mem_filenames, $memfiles_prefix, "0x00000000\t# length  (end of list)\n");
-#   for (my $i=0;$i<@irs;$i++) {
-#     my $ir=$irs[$i];
-#     #print "ir: $ir\n";
-#     my $ir_packed = pack("h*", (scalar reverse($ir)).("0"x (7-(length($ir)-1)%8)));
-#     my $ir_packed_r = pack("B*", scalar reverse substr(unpack("B*", pack("H*", $ir.("0"x (7-(length($ir)-1)%8)))),0, 32));
-#     #print "debug ir_packed   (h*): ". (scalar reverse($ir)).("0"x (8-length($ir)%32))."\n";
-#     #print "debug ir_packed_r (B*): ". scalar reverse unpack("B*", pack("H*", $ir.("0"x (7-(length($ir)-1)%8)))) ."\n";
-#     #print "debug2: " . (7-(length($ir)-1)%8) . "\n";
-#     #print "debug3: " . $ir . "\n";
-#     #print "debug4: " . $ir.("0"x (7-(length($ir)-1)%8)) . "\n";
-#     #print "debug5 (B*): ". unpack("B*", pack("H*", $ir.("0"x (7-(length($ir)-1)%8)))) ."\n";
-# 
-#     my $initial = 0x00000000;
-#     my $crc0 = crc32($ir_packed_r, $initial);
-#     #printf "CRC0: %X. ~reversed: %X\n", $crc0, $crc0_rn;
-# 
-#     for(my $i=0; $i<floor((length($drs_binary{$ir})-1)/32)+1;$i++){
-#       my $dr_word_packed_r = pack("b*", scalar reverse substr($drs_binary{$ir}.("0"x (31-(length($drs_binary{$ir})-1)%32)),($i)*32, 32));
-#       $crc0 = crc32($dr_word_packed_r, $crc0);
-#       my $crc0_rn = ~reverse32bit($crc0);
-#       printf "CRC: 0x%0.8X.\n", $crc0_rn;
-#     }
-#     my $crc0_rn = ~reverse32bit($crc0);
-#     #printf "CRC: %0.8X.\n", $crc0_rn, 1;
-#     my $line_crc = sprintf "0x%0.8X\t# CRC-32\n", $crc0_rn;
-#     print "debug dr_binary: " . $drs_binary{$ir} . "\n";
-#     my $dr_packed = pack("b*", $drs_binary{$ir}.("0"x (31-(length($drs_binary{$ir})-1)%32)));
-#     $drs{$ir} = unpack('h*', $dr_packed);
-#     print "debug drs: " . $drs{$ir} . "\n";
-#     memfile_writeline( $ram_fh, \@mem_filenames, $memfiles_prefix, "0x".("0"x(8-length($ir))).uc($ir) . "\n");
-#     for(my $i=0; $i<floor((length( $drs{$ir}) -1)/8)+1; $i++){
-#       #print "dbg: i=$i, len=".length( $drs{$ir})."\n";
-#       if(length($drs{$ir}) >= ($i+1)*8) {
-#         memfile_writeline( $ram_fh, \@mem_filenames, $memfiles_prefix, "0x".uc(reverse(substr($drs{$ir}, ($i)*8, 8))) . "\n");
-#       }
-#       else {
-#         memfile_writeline( $ram_fh, \@mem_filenames, $memfiles_prefix, "0x".("0"x(($i+1)*8-length($drs{$ir}))).uc(reverse(substr($drs{$ir}, ($i)*8, length($drs{$ir})%8))) . "\n");
-#       }
-#     }
-#     memfile_writeline( $ram_fh, \@mem_filenames, $memfiles_prefix, $line_crc);
-#     
-#     #print "IR $ir, DR ". $drs{$ir} . "\n";
-#   }
-#   #close RAMTEXT;
-#   $ram_fh->close();
-#   #my $result = `cat $memfile{$fpga_addr}`;
-#   $ENV{'DAQOPSERVER'}="trb126";
-#   for(my $i=0;$i<scalar @mem_filenames;$i++) {
-#     # write RAM base pointer
-#     my $ihex = int_to_32bit_hex($i);
-#     print "trbcmd w $fpga_addr $ram_base_addr 0x$ihex\n";
-#     my $result = `trbcmd w $fpga_addr $ram_base_addr 0x$ihex\n`;
-#     print "set RAM base pointer: " . $result;
-#     # write to configuration RAM
-#     print "trbcmd wm $fpga_addr $ram_addr 0 $mem_filenames[$i]\n";
-#     $result = `trbcmd wm $fpga_addr $ram_addr 0 $mem_filenames[$i]`;
-#     print "write max. 256 32-bit-words: " . $result;
-#   }
-#}
-
-
-# init_writemem:
-# - loop through chains
-#   - loop through sensors
-#     - test if IR length is the same as for other sensors
-#     - loop through DRs
-#       - test if DR length is the same as for other sensors
-#     - add DR content to chain data register (hexadecimal string)
-#   - write contents for JTAG chain controller RAM to text file(s)
-#   - execute trbcmd to transfer file(s) to RAM of FPGA configured in chains.ini
-#
-# get_status:
-# get_error_counts:
-# reactivate_sensor:
-# deactivate_sensor: