]> jspc29.x-matter.uni-frankfurt.de Git - daqtools.git/commitdiff
added, mt
authorHades User <M.Traxler@gsi.de>
Wed, 25 Oct 2017 09:07:57 +0000 (11:07 +0200)
committerHades User <M.Traxler@gsi.de>
Wed, 25 Oct 2017 09:07:57 +0000 (11:07 +0200)
users/gsi_photonbeam/dirich_cycle.pl [new file with mode: 0755]

diff --git a/users/gsi_photonbeam/dirich_cycle.pl b/users/gsi_photonbeam/dirich_cycle.pl
new file mode 100755 (executable)
index 0000000..51d9b76
--- /dev/null
@@ -0,0 +1,116 @@
+#!/usr/bin/perl -w
+
+use warnings;
+use HADES::TrbNet;
+use Dmon;
+use Time::HiRes qq|usleep|;
+use Data::Dumper;
+
+trb_init_ports() or die trb_strerror();
+
+my $act_ports;
+my $to_ports;
+my $er_ports;
+my $number_of_dirich;
+my $number_of_combiner;
+
+sub read_regs {
+  $act_ports = trb_register_read(0xfe52,0x84); #active ports
+  $to_ports  = trb_register_read(0xfe52,0x8b); #ports with timeouts
+  $er_ports  = trb_register_read(0xfe52,0xa4); #ports with errors on sctrl
+}
+
+sub count {
+  my $dirich = trb_read_uid(0xfe51);
+  my $combiner = trb_read_uid(0xfe52);
+  $number_of_dirich = scalar keys %$dirich;
+  $number_of_combiner = scalar keys %$combiner;
+
+  printf("Combiners: %i\tDiRich: %i\n",$number_of_combiner, $number_of_dirich);
+  }
+
+count();
+
+my $error = 0;
+my $warning_error_count = 0;
+my $max_warning_error_count = 6;
+
+read_regs();
+
+
+#turn all dirich on
+trb_register_write(0xfe52,0xd580,0);
+
+while (($error = trb_errno()) != 0 && ($warning_error_count < $max_warning_error_count) ) {
+  print "error: $error\n";
+  if ($error == 26) { # status warning
+    my $error_str = trb_strerror();
+    if ($error_str =~ /no endpoint has been reached/mg) {
+      print "Warning: no endpoint has been reached. => reset\n";
+      qx(trbcmd reset);
+      sleep 1;
+    }
+  }
+  read_regs();
+  print "count after error:\n";
+  count();
+  $warning_error_count++;
+}
+
+my $expected_number_of_dirich = 9;
+my $expected_number_of_combiner = 1;
+my $mask;
+#my $always_missing = (0x1<<7);
+#my $always_missing = (0x1<<7) | (0x1 << 2);
+my $always_missing = 0;
+
+#determine_mask();
+
+my $nr_of_ldo_cycle_retries = 0;
+my $max_nr_of_ldo_cycle_retries = 20;
+my $first_check_completed = 0;
+
+while ( ($number_of_dirich < $expected_number_of_dirich || $first_check_completed==0 || $number_of_combiner < $expected_number_of_combiner)
+        && $nr_of_ldo_cycle_retries < $max_nr_of_ldo_cycle_retries) {
+  $first_check_completed = 1;
+  $nr_of_ldo_cycle_retries++;
+  print "ldo cycle counter: ", $nr_of_ldo_cycle_retries++ . "\n";
+  foreach my $combs (keys %$act_ports) {
+  #($combs) = keys %$act_ports;
+  #while (1) {
+    #not active or timeout or error
+    my $active_ports  = ((~$act_ports->{$combs}) & 0x1ffe);
+    my $timeout_ports = ($to_ports->{$combs}     & 0x1ffe);
+    my $error_ports   = ($er_ports->{$combs}     & 0x1ffe);
+
+    $active_ports  ^= $always_missing if($combs == 0x8301);
+
+    $mask = ( $active_ports | $timeout_ports | $error_ports);
+    #shift for LDO switch
+    #$mask = 0x1 << 3;
+    #$mask ^= $always_missing;
+    printf("%04x\t%08x\t%08x\t%08x\t%08x\n",$combs, $active_ports, $timeout_ports, $error_ports, $mask);
+    $mask <<= 15;
+    next if $mask == 0;
+    trb_register_setbit($combs,0xd580,$mask); #off
+    #usleep(500000);
+    qx(trbcmd reset);
+    trb_register_clearbit($combs,0xd580,$mask); #on
+    usleep(1000000);
+    qx(trbcmd reset);
+  }
+  qx(trbcmd reset);
+
+  count();
+  read_regs();
+  while (($error = trb_errno()) != 0 && $warning_error_count < $max_warning_error_count ) {
+    print "error: $error\n";
+    qx(trbcmd reset);
+    read_regs();
+  }
+
+}
+
+if ($number_of_dirich < $expected_number_of_dirich || $number_of_combiner < $expected_number_of_combiner) {
+  print "Complete Power-Cycle needed!\n";
+}