"
}
-#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
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 {
#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'});
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;
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);
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: