]> jspc29.x-matter.uni-frankfurt.de Git - mimosis_chain.git/commitdiff
changes in Mimosis module
authorMaps <maps@ikf>
Thu, 12 Dec 2024 11:11:14 +0000 (12:11 +0100)
committerMaps <maps@ikf>
Thu, 12 Dec 2024 11:11:14 +0000 (12:11 +0100)
scripts/modules/Mimosis/Makefile
scripts/modules/Mimosis/Mimosis.c
scripts/modules/Mimosis/Mimosis.o
scripts/modules/Mimosis/Mimosis.xs
scripts/modules/Mimosis/blib/lib/Mimosis.pm
scripts/modules/Mimosis/blib/lib/reg.pl
scripts/modules/Mimosis/blib/man3/Mimosis.3pm
scripts/modules/Mimosis/lib/Mimosis.pm
scripts/modules/Mimosis/reg.pl [deleted file]

index 7d93d5462d83c5262b430b0464bd3f33085c7519..0c6f4d61f88322ef00343a8c03cb909181e19c9e 100644 (file)
@@ -191,8 +191,7 @@ PERL_ARCHIVEDEP    =
 PERL_ARCHIVE_AFTER = 
 
 
-TO_INST_PM = lib/Mimosis.pm \
-       reg.pl
+TO_INST_PM = lib/Mimosis.pm
 
 
 # --- MakeMaker platform_constants section:
@@ -1051,8 +1050,7 @@ ppd :
 
 pm_to_blib : $(FIRST_MAKEFILE) $(TO_INST_PM)
        $(NOECHO) $(ABSPERLRUN) -MExtUtils::Install -e 'pm_to_blib({@ARGV}, '\''$(INST_LIB)/auto'\'', q[$(PM_FILTER)], '\''$(PERM_DIR)'\'')' -- \
-         'lib/Mimosis.pm' 'blib/lib/Mimosis.pm' \
-         'reg.pl' '$(INST_LIB)/reg.pl' 
+         'lib/Mimosis.pm' 'blib/lib/Mimosis.pm' 
        $(NOECHO) $(TOUCH) pm_to_blib
 
 
index 01d798c93c4bcddc4ba127026beb03336024debb..ff5831a2d6fcea0931b6fbda060244b37a97fcd5 100644 (file)
@@ -170,53 +170,6 @@ S_croak_xs_usage(const CV *const cv, const char *const params)
 
 #line 172 "Mimosis.c"
 
-XS_EUPXS(XS_Mimosis_mimosis_register_write); /* prototype to pass -Wmissing-prototypes */
-XS_EUPXS(XS_Mimosis_mimosis_register_write)
-{
-    dVAR; dXSARGS;
-    if (items != 4)
-       croak_xs_usage(cv,  "fpga, reg, data, singleaccess");
-    {
-       int     fpga = (int)SvIV(ST(0))
-;
-       int     reg = (int)SvIV(ST(1))
-;
-       int     data = (int)SvIV(ST(2))
-;
-       bool    singleaccess = (bool)SvTRUE(ST(3))
-;
-#line 28 "Mimosis.xs"
-    mimosis::register_write(fpga,reg,data,singleaccess);
-#line 191 "Mimosis.c"
-    }
-    XSRETURN_EMPTY;
-}
-
-
-XS_EUPXS(XS_Mimosis_mimosis_register_read); /* prototype to pass -Wmissing-prototypes */
-XS_EUPXS(XS_Mimosis_mimosis_register_read)
-{
-    dVAR; dXSARGS;
-    if (items != 3)
-       croak_xs_usage(cv,  "fpga, reg, singleaccess");
-    {
-       int     fpga = (int)SvIV(ST(0))
-;
-       int     reg = (int)SvIV(ST(1))
-;
-       bool    singleaccess = (bool)SvTRUE(ST(2))
-;
-       int     RETVAL;
-       dXSTARG;
-#line 37 "Mimosis.xs"
-        RETVAL = mimosis::register_read(fpga,reg,singleaccess);
-#line 214 "Mimosis.c"
-       XSprePUSH; PUSHi((IV)RETVAL);
-    }
-    XSRETURN(1);
-}
-
-
 XS_EUPXS(XS_Mimosis_mimosis_find_mod); /* prototype to pass -Wmissing-prototypes */
 XS_EUPXS(XS_Mimosis_mimosis_find_mod)
 {
@@ -240,9 +193,9 @@ XS_EUPXS(XS_Mimosis_mimosis_find_mod)
 ;
        int     RETVAL;
        dXSTARG;
-#line 52 "Mimosis.xs"
+#line 31 "Mimosis.xs"
         RETVAL = mimosis::find_mod(source, fpga, yLow, yHig, xLow, xHig, modPulse);
-#line 246 "Mimosis.c"
+#line 199 "Mimosis.c"
        XSprePUSH; PUSHi((IV)RETVAL);
     }
     XSRETURN(1);
@@ -260,7 +213,7 @@ XS_EUPXS(XS_Mimosis_mimosis_loop_vph)
 ;
        int     fpga = (int)SvIV(ST(1))
 ;
-       bool    sa = (bool)SvTRUE(ST(2))
+       int     sa = (int)SvIV(ST(2))
 ;
        int     yLow = (int)SvIV(ST(3))
 ;
@@ -282,9 +235,9 @@ XS_EUPXS(XS_Mimosis_mimosis_loop_vph)
 ;
        int     exp = (int)SvIV(ST(12))
 ;
-#line 74 "Mimosis.xs"
+#line 53 "Mimosis.xs"
         mimosis::loop_vph(source, fpga, sa, yLow, yHig, xLow, xHig, vphSta, vphEnd, vphTra, maxCounts, mod, exp);
-#line 288 "Mimosis.c"
+#line 241 "Mimosis.c"
     }
     XSRETURN_EMPTY;
 }
@@ -317,8 +270,6 @@ XS_EXTERNAL(boot_Mimosis)
 #  endif
 #endif
 
-        newXS_deffile("Mimosis::mimosis_register_write", XS_Mimosis_mimosis_register_write);
-        newXS_deffile("Mimosis::mimosis_register_read", XS_Mimosis_mimosis_register_read);
         newXS_deffile("Mimosis::mimosis_find_mod", XS_Mimosis_mimosis_find_mod);
         newXS_deffile("Mimosis::mimosis_loop_vph", XS_Mimosis_mimosis_loop_vph);
 #if PERL_VERSION_LE(5, 21, 5)
index 1b75c7842ddde4a4740bd30aa9b18b8890bbbc62..86e203b4340658171a062b39ce2519f59b3baf0c 100644 (file)
Binary files a/scripts/modules/Mimosis/Mimosis.o and b/scripts/modules/Mimosis/Mimosis.o differ
index 1e9cd528a93249206c745b287dad26d3ba689d49..562b5a32fa9bf436d541d08aa65f95cb936cfaee 100755 (executable)
@@ -18,27 +18,6 @@ extern "C" {
 MODULE = Mimosis               PACKAGE = Mimosis               
 
 
-void
-mimosis_register_write(fpga,reg,data,singleaccess);
-    int fpga
-    int reg
-    int data
-    bool singleaccess
-    CODE:
-    mimosis::register_write(fpga,reg,data,singleaccess);
-
-
-int
-mimosis_register_read(fpga,reg,singleaccess);
-    int fpga
-    int reg
-    bool singleaccess
-    CODE:
-        RETVAL = mimosis::register_read(fpga,reg,singleaccess);
-    OUTPUT:
-        RETVAL
-
-
 int
 mimosis_find_mod(source, fpga, yLow, yHig, xLow, xHig, modPulse)
     char* source
@@ -59,7 +38,7 @@ void
 mimosis_loop_vph(source, fpga, sa, yLow, yHig, xLow, xHig, vphSta, vphEnd, vphTra, maxCounts, mod, exp)
     char* source
     int fpga
-    bool sa
+    int sa
     int yLow
     int yHig
     int xLow
index e9527e92fd0c35c438885b392c85937e2bc09961..c805fb89ff9b87f2805aaeff1eb195c02bf315b3 100755 (executable)
@@ -6,24 +6,31 @@ use warnings;
 
 require Exporter;
 
+use HADES::TrbNet;
+
+use Time::HiRes qw(usleep);
+
+use Chart::Gnuplot;
+use File::Copy;
+use POSIX;
+
+use Data::Dump qw( dump );
+use Data::Dumper;
+
 our @ISA = qw(Exporter);
 
 # Items to export into callers namespace by default. Note: do not export
 # names by default without a very good reason. Use EXPORT_OK instead.
 # Do not simply export all your public functions/methods/constants.
 
-# This allows declaration      use Mimosis ':all';
+# This allows declaration  use Mimosis ':all';
 # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
 # will save memory.
-our %EXPORT_TAGS = ( 'all' => [ qw(
-       
-) ] );
+our %EXPORT_TAGS = ( 'all' => [ qw() ] );
 
 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
 
-our @EXPORT = qw(
-       
-);
+our @EXPORT = qw();
 
 our $VERSION = '0.01';
 
@@ -32,6 +39,1031 @@ XSLoader::load('Mimosis', $VERSION);
 
 # Preloaded methods go here.
 
+
+my $fpga = 0xa000;
+my $chipid = 0x1;
+my $singleAccess = 0;
+my $sleepVal1 = 1000;
+my $sleepVal2 = 1000000;
+
+my $fpgaHub = 0xc000;
+
+my $mbsStream = 'mbss://localhost:36789';
+
+my $trbI2cSpeedReg = 0xde00;
+
+my $i2cSpeed = 0x1e;
+
+
+my $printall = 0;
+
+my $trbAdcRegWrMem = 0xd681;
+my $trbAdcRegRdMem = 0xd684;
+
+my $trbMimRegWrMem = 0xde01;
+my $trbMimRegRdMem = 0xde04;
+
+my $adc_addr = 0x48;
+my $adc_wreg = 0x1;
+my $adc_rreg = 0x0;
+
+my $adc_cmdV = 0xa380;
+my $adc_cmdI = 0x9380;
+
+
+my $adcConv = ( 2 * 4096 ) / 2**16;
+
+my $collect_i2c_errors = 0;
+
+
+
+sub set_fpga {
+  $fpga = $_[0] if defined $_[0];
+}
+
+
+sub get_fpga {
+    print "$fpga\n";
+    return $fpga }
+
+sub set_chipid {
+  $chipid = $_[0] if defined $_[0];
+}
+
+sub get_chipid { return $chipid; }
+
+sub set_singleAccess {
+  $singleAccess = $_[0] if defined $_[0];
+}
+
+sub get_singleAccess { return $singleAccess; }
+
+
+
+sub set_sleepVal1 {
+  $sleepVal1 = $_[0] if defined $_[0];
+}
+
+sub get_sleepVal1 { return $sleepVal1; }
+
+
+sub set_sleepVal2 {
+  $sleepVal2 = $_[0] if defined $_[0];
+}
+
+sub get_sleepVal2 { return $sleepVal2; }
+
+
+sub set_fpgaHub {
+  $fpgaHub = $_[0] if defined $_[0];
+}
+
+
+sub get_fpgaHub {
+    print "$fpgaHub\n";
+    return $fpgaHub }
+
+
+
+
+sub set_mbsStream {
+  $mbsStream = $_[0] if defined $_[0];
+}
+
+sub get_mbsStream { return $mbsStream; }
+
+
+sub set_printall {
+  $printall = $_[0] if defined $_[0];
+}
+
+sub get_printall { return $printall; }
+
+
+sub set_i2cSpeed {
+    $i2cSpeed = $_[0] if defined $_[0];
+    trb_register_write( $fpga, $trbI2cSpeedReg, $i2cSpeed );
+}
+
+sub get_i2cSpeed { return $i2cSpeed; }
+
+
+sub set_adcToIkfProxy {
+    $adc_cmdV = 0xe380;
+    $adc_cmdI = 0xd380;
+}
+
+sub set_adcToIPHCProxy {
+    $adc_cmdV = 0xa380;
+    $adc_cmdI = 0x9380;
+}
+
+
+
+sub make_require {
+    do "/d/jspc37/mimosis/scripts/TrbNetUart.pm";
+    TNU_set_device("/dev/ttyUSB0");
+}
+
+
+
+sub set_collect_i2c_errors {
+    $collect_i2c_errors = $_[0] if defined $_[0];
+}
+
+sub get_collect_i2c_errors { return $collect_i2c_errors; }
+
+
+our %DAC = (
+    IBIAS => { ADDR => 0x40, MONITOR => 0x25, MONVAL => 1, TYPE => 'CURRENT', RESET => 0x40, },
+    ITHR  => { ADDR => 0x41, MONITOR => 0x25, MONVAL => 3, TYPE => 'CURRENT', RESET => 0x34, },
+    IDB   => { ADDR => 0x42, MONITOR => 0x25, MONVAL => 2, TYPE => 'CURRENT', RESET => 0x1c, },
+    VRESET => { ADDR => 0x43, MONITOR => 0x26, MONVAL => 6, TYPE => 'VOLTAGE', RESET => 0xab, },
+    VPL    => { ADDR => 0x44, MONITOR => 0x26, MONVAL => 2, TYPE => 'VOLTAGE', RESET => 0x57, },
+    VPH    => { ADDR => 0x45, MONITOR => 0x26, MONVAL => 1, TYPE => 'VOLTAGE', RESET => 0x68, },
+    VPHFINE => { ADDR => 0x46, MONITOR => 0x26, MONVAL => 1, TYPE => 'VOLTAGE', RESET => 0x0, },
+    VCASP    => { ADDR => 0x47, MONITOR => 0x26, MONVAL => 4, TYPE => 'VOLTAGE', RESET => 0x43, },
+    VCASNA   => { ADDR => 0x48, MONITOR => 0x26, MONVAL => 7, TYPE => 'VOLTAGE', RESET => 0x53, },
+    VCASNB   => { ADDR => 0x49, MONITOR => 0x26, MONVAL => 8, TYPE => 'VOLTAGE', RESET => 0x53, },
+    VCASNC   => { ADDR => 0x4a, MONITOR => 0x26, MONVAL => 9, TYPE => 'VOLTAGE', RESET => 0x53, },
+    VCASND   => { ADDR => 0x4b, MONITOR => 0x26, MONVAL => 10, TYPE => 'VOLTAGE', RESET => 0x53, },
+    VCASN2   => { ADDR => 0x4c, MONITOR => 0x26, MONVAL => 3, TYPE => 'VOLTAGE', RESET => 0x53, },
+    VCLIP    => { ADDR => 0x4d, MONITOR => 0x26, MONVAL => 5, TYPE => 'VOLTAGE', RESET => 0x32, },
+    IBUFBIAS => { ADDR => 0x4e, MONITOR => undef, MONVAL => undef, TYPE => 'CURRENT', RESET => 0x7d, },
+   );
+
+
+
+sub mimosis_trb_reset {
+
+    my $trbMimRstReg = 0xde05;
+    trb_register_clearbit($fpga, $trbMimRstReg, 0x100);
+    usleep($sleepVal2);
+    trb_register_setbit($fpga, $trbMimRstReg, 0x100);
+    usleep($sleepVal2);
+}
+
+
+
+sub mimosis_trb_word_align {
+
+    my $trbMimInRst = 0x9010;
+    trb_register_setbit($fpga, $trbMimInRst, 1);
+    usleep($sleepVal2);
+    trb_register_clearbit($fpga, $trbMimInRst, 1);
+    usleep($sleepVal2);
+
+    my $trbMimInpStat = 0x9000;
+    my $delpos = trb_register_read($fpga, $trbMimInpStat);
+    $delpos = ($delpos & 0x7f000000) >> 24;
+
+    my $trbMimAlignCtrl = 0x9100;
+    trb_register_clearbit($fpga, $trbMimAlignCtrl, 0b100000000);
+    sleep(1);
+    trb_register_setbit($fpga, $trbMimAlignCtrl, 0b100000000);
+    usleep($sleepVal2);
+
+    my @val = @{trb_register_read_mem($fpga, 0x9110, 0, 8)->{$fpga}};
+    printf("%x\n", ($_ & 0xFFFF)) foreach ( @val );
+    return(@val);
+}
+
+
+
+my @i2c_errors;
+
+
+sub collect_i2c_errors {
+
+    my $regBuf =
+      trb_register_read( $fpga, $trbMimRegRdMem );
+
+    my $status =
+      (($regBuf->{$fpga}//0) >> 16 ) & 0xff;
+
+    push ( @i2c_errors, $status );
+}
+
+
+
+
+sub get_i2c_errors {
+
+    my @tmp_i2c_errors = @i2c_errors;
+    @i2c_errors = ();
+    return @tmp_i2c_errors;
+}
+
+
+
+sub adc_i2c_command {
+
+    my (
+      $addr,
+      $cmd,
+      $data,
+      $rw,
+      $skipCmd,
+      $wordByte
+     ) = @_;
+
+    my $regData =
+      ( $data << 16 ) + ( $cmd << 8 ) + 0x80 + $addr;
+
+    my $regFlag =
+      ( $rw << 8 ) + ( $skipCmd << 4 ) + $wordByte;
+
+    if ( $rw == 0 ) {
+
+        trb_register_write_mem(
+          $fpga,
+          $trbAdcRegWrMem,
+          0,
+          [ $regFlag, $regData ],
+          2 );
+
+        usleep($sleepVal1);
+
+    } elsif ( $rw == 1 ) {
+
+        trb_register_write_mem(
+          $fpga,
+          $trbAdcRegWrMem,
+          0,
+          [ $regFlag, $regData ],
+          2 );
+
+        usleep($sleepVal1);
+
+        my $regReturn =
+          trb_register_read( $fpga, $trbAdcRegRdMem );
+
+        usleep($sleepVal1);
+
+        return $regReturn->{$fpga} & 0xffff;
+    }
+}
+
+
+
+
+sub mimosis_i2c_command {
+
+    my (
+      $addr,
+      $cmd,
+      $data,
+      $rw,
+      $skipCmd,
+      $wordByte
+     ) = @_;
+
+    my $regData =
+      ( $data << 16 ) + ( $cmd << 8 ) + ( $addr << 1 );
+
+    my $regFlag =
+      ( $rw << 8 ) + ( $skipCmd << 4 ) + $wordByte;
+
+    my $regReturn;
+    my $regBuf;
+
+    if ( $rw == 0 ) {
+
+        trb_register_write_mem(
+          $fpga,
+          $trbMimRegWrMem,
+          0,
+          [ $regFlag, $regData, 0x1 ],
+          3 );
+
+        usleep($sleepVal1);
+
+        $regBuf =
+          trb_register_read( $fpga, $trbMimRegRdMem );
+
+    } elsif ( $rw == 1 ) {
+
+        trb_register_write_mem(
+          $fpga,
+          $trbMimRegWrMem,
+          0,
+          [ $regFlag, $regData, 0x1 ],
+          3 );
+
+        usleep($sleepVal1);
+
+        $regBuf =
+          trb_register_read( $fpga, $trbMimRegRdMem );
+
+        usleep($sleepVal1);
+
+    }
+
+    if ( $printall ) {
+
+        my $status =
+          (($regBuf->{$fpga}//0) >> 16 ) & 0xff;
+        printf("I2CStatus: 0x%02x\n", $status);
+    }
+
+    collect_i2c_errors() if $collect_i2c_errors;
+
+    if ( $rw == 1 ) {
+
+        if ($fpga < 0xfe00)
+        {
+          return $regBuf->{$fpga} & 0xffff;
+        }
+    }
+
+}
+
+
+
+
+sub mimosis_register_write {
+
+    my (
+      $mimReg,
+      $mimData,
+     ) = @_;
+
+    my $addr =
+      ($chipid << 4) +  0x2;
+
+    my $cmd  =
+      ( $mimReg >> 8 );
+
+    my $data =
+      ( ( $mimReg & 0xff ) << 8 ) + $mimData;
+
+
+    if ( $singleAccess ) {
+
+        mimosis_i2c_command(
+          $addr,0, $mimReg>>8, 0, 1, 0);
+
+        mimosis_i2c_command(
+          $addr+1, 0, $mimReg, 0, 1, 0);
+
+        mimosis_i2c_command(
+          $addr+2, 0, $mimData, 0, 1, 0);
+
+    } else {
+
+        mimosis_i2c_command(
+          $addr, $cmd, $data, 0, 0, 1);
+    }
+
+}
+
+
+
+
+sub mimosis_register_read {
+
+    my ( $mimReg ) = @_;
+
+    my $addr = ( $chipid << 4 ) +  0x2;
+    my $cmd  = ( $mimReg >> 8 );
+    my $data = ( $mimReg & 0xff );
+
+    if ($singleAccess) {
+
+        mimosis_i2c_command(
+          $addr, 0, $mimReg>>8, 0, 1, 0);
+
+        mimosis_i2c_command(
+          $addr+1, 0, $mimReg, 0, 1, 0);
+
+    } else {
+
+        mimosis_i2c_command(
+          $addr, $cmd, $data, 0, 0, 0);
+    }
+
+    $addr = ($chipid << 4) +  0x5;
+
+    my $val  = mimosis_i2c_command(
+      $addr, 0, 0, 1, 1, 0 );
+
+    return $val & 0xff;
+}
+
+
+
+
+sub mimosis_instr_write {
+
+    my ( $cmd ) = @_;
+
+    # CHIPID???
+    trb_register_write_mem(
+      $fpga, $trbMimRegWrMem, 0,
+      [ 0x0, ( $cmd << 8 ) + ( 0x11 << 1 ), 0x1 ],
+      3 );
+
+     usleep($sleepVal1);
+}
+
+
+
+
+sub mimosis_load_file {
+
+    my %params = @_;
+
+    my $file = $params{'file'};
+    my $printwrong = defined $params{'printwrong'} ? 1 : 0;
+
+    defined $file or die "Mimosis::mimosis_load_file: Must provide \$file.";
+
+    my @config = do $file;
+
+    foreach my $i (@config) {
+
+        if ( defined( @$i[1] ) ) {
+
+            mimosis_register_write(
+              @$i[0], @$i[1] );
+
+            if( $printall ) {
+
+#               printf( "%x %x %x\n",
+#                       $fpga, @$i[0], @$i[1] );
+                      
+              my $retVal =
+                trb_register_read($fpga, 0xde04);
+
+              foreach my $k ( keys %{$retVal} ) {
+
+                  my $status =
+                    (($retVal->{$k}//0) >> 16 ) & 0xff;
+
+                  printf("%x %x    Status: %x\n",
+                          $k, @$i[0], $status);
+              }
+                      
+            }
+        }
+    }
+
+    if ( $printall || $printwrong ) {
+
+        foreach my $i (@config) {
+
+            if ( defined( @$i[1] ) ) {
+
+                my $val =
+                  mimosis_register_read(@$i[0]);
+
+                unless(($val & 0xff) == @$i[1]) {
+
+                    my $retVal =
+                      trb_register_read($fpga, 0xde04);
+
+                    foreach my $k ( keys %{$retVal} ) {
+
+                        my $status =
+                          (($retVal->{$k}//0) >> 16 ) & 0xff;
+
+                        printf("%x %x %x    Status: %x\n",
+                               $k, @$i[0], $val, $status);
+                    }
+                }
+            }
+        }
+    }
+}
+
+
+
+
+sub mimosis_scan_single_dac {
+
+    my %params = @_;
+
+    my $dac = $params{'dac'};
+
+    my $start =
+      defined $params{'start'} ?
+      $params{'start'} : 0;
+
+    my $stop =
+      defined $params{'stop'} ?
+      $params{'stop'} : 255;
+
+    my $step =
+      defined $params{'step'} ?
+      $params{'step'} : 1;
+
+    my $name =
+      defined $params{'name'} ?
+      $params{'name'} : "";
+
+
+    my @resVals;
+    my @resTicks;
+
+    $name .= "_" if $name ne "";
+
+    my $fName = $name . $dac . ".csv";
+    open( FH, '>', $fName ) or die $!;
+
+    mimosis_register_write( $Mimosis::DAC{$dac}{'MONITOR'}, $Mimosis::DAC{$dac}{'MONVAL'} );
+
+    for( my $set = $start;
+         $set <= $stop;
+         $set += $step ) {
+
+        mimosis_register_write( $Mimosis::DAC{$dac}{'ADDR'}, $set );
+
+        my $adcCmd =
+          $Mimosis::DAC{$dac}{'TYPE'} eq "VOLTAGE" ?
+          $adc_cmdV : $adc_cmdI;
+          
+
+        adc_i2c_command(
+          $adc_addr, $adc_wreg, $adcCmd, 0, 0, 1 );
+
+        usleep(8000);
+
+        my $raw = adc_i2c_command(
+          $adc_addr, $adc_rreg, 0x0, 1, 0, 1 );
+
+        printf( FH "%x\t%d\t%f\n",
+                $Mimosis::DAC{$dac}{'ADDR'}, $set, $raw * $adcConv );
+
+        push ( @resVals, $raw*$adcConv );
+        push ( @resTicks, $set );
+    }
+
+    mimosis_register_write(
+        $Mimosis::DAC{$dac}{'ADDR'},
+        $Mimosis::DAC{$dac}{'RESET'}
+       );
+
+    close(FH);
+
+    return ( \@resTicks, \@resVals );
+}
+
+
+
+
+sub mimosis_dacscan {
+
+    my %params = @_;
+
+    my $dacArrRef = $params{'dacs'};
+    my $start = $params{'start'};
+    my $stop = $params{'stop'};
+    my $step = $params{'step'};
+    my $name = $params{'name'};
+
+    my @dacArr =
+      defined $params{'dacs'} ?
+      @{ $dacArrRef } : ();
+    @dacArr = %Mimosis::DAC unless scalar(@dacArr) > 0;
+
+
+    $start = 0 unless defined $start;
+    $stop = 255 unless defined $stop;
+    $step = 1 unless defined $step;
+    $name = "" unless defined $name;
+
+
+    my %results;
+
+    for my $dac ( @dacArr ) {
+
+        next if not defined $Mimosis::DAC{$dac}{'MONVAL'};
+
+        printf( "Scan: %s\n", $dac ) if $printall;
+
+        ( $results{$dac}{X}, $results{$dac}{Y} ) =
+          mimosis_scan_single_dac(
+            dac   => $dac,
+            start => $start,
+            stop  => $stop,
+            step  => $step,
+            name  => $name,
+           );
+    }
+
+    $name .= "_" if $name ne "";
+
+    my $chart = Chart::Gnuplot->new(
+        output => $name . "dacscan.png",
+        terminal => "pngcairo",
+        title  => "DAC-Scan",
+        xlabel => "Setting [LSB]",
+        ylabel => "Voltage output [mV]",
+       );
+
+
+    my @dataArr;
+
+    for my $dac ( keys %results ) {
+
+        my $dataSet = Chart::Gnuplot::DataSet->new(
+          xdata => $results{$dac}{X},
+          ydata => $results{$dac}{Y},
+          title => "Plotting a line from Perl arrays",
+          style => "linespoints",
+         );
+
+        push(@dataArr, $dataSet);
+    }
+
+    $chart->plot2d(@dataArr);
+
+    return %results;
+}
+
+
+
+
+sub mimosis_select_pixel {
+
+    my %params = @_;
+    my $yStart = $params{'ystart'};
+    my $yStop = $params{'ystop'};
+    my $yStep = $params{'ystep'};
+
+    my $xStart = $params{'xstart'};
+    my $xStop = $params{'xstop'};
+    my $xStep = $params{'xstep'};
+
+    $yStart = 0 unless defined $yStart;
+    $yStop = 503 unless defined $yStop;
+    $yStep = 1 unless defined $yStep;
+
+    $xStart = 0 unless defined $xStart;
+    $xStop = 1023 unless defined $xStop;
+    $xStep = 1 unless defined $xStep;
+
+    for ( my $y = $yStart;
+          $y <= $yStop;
+          $y += $yStep ) {
+
+        my $regAddY = $y/8;
+        my $regBitY = 1<<( $y % 8 );
+        my $regWordY = ($regAddY<<8) + 0x84;
+
+        mimosis_register_write($regWordY, $regBitY );
+
+        my $currRegX = floor $xStart/16;
+        my $word82 = 0;
+        my $word81 = 0;
+
+        for ( my $x = $xStart;
+              $x <= $xStop;
+              $x += $xStep ) {
+
+            if( (($x/16) == $currRegX)
+                && ($x != $xStop)
+               ) {
+
+                if    ($x%2 == 1) { $word82 |= (1<<(floor($x/2)%8)); }
+                elsif ($x%2 == 0) { $word81 |= (1<<(floor($x/2)%8)); }
+
+            } else {
+
+                if ( ($x == $xStop) &&
+                     (($x/16) != $currRegX)
+                   ) {
+                    if    ($x%2 == 1) { $word82 |= (1<<(floor($x/2)%8)); }
+                    elsif ($x%2 == 0) { $word81 |= (1<<(floor($x/2)%8)); }
+                }
+
+                if($word82 == $word81) {
+
+                    my $addr = ($currRegX<<8) + 0x83;
+                    mimosis_register_write( $addr, $word81 );
+                    mimosis_instr_write( 0x05 );
+                    mimosis_register_write( $addr, 0 );
+
+                } else {
+
+                    my $addr81 = ($currRegX<<8) + 0x81;
+                    my $addr82 = ($currRegX<<8) + 0x82;
+
+                    mimosis_register_write( $addr81, $word81 );
+                    mimosis_register_write( $addr82, $word82 );
+                    mimosis_instr_write( 0x05 );
+                    mimosis_register_write( $addr81, 0 );
+                    mimosis_register_write( $addr82, 0 );
+                }
+
+                $currRegX = floor $x/16;
+                $word81 = 0;
+                $word82 = 0;
+
+                if    ($x%2 == 1){ $word82 = (1<<(floor($x/2)%8)); }
+                elsif ($x%2 == 0){ $word81 = (1<<(floor($x/2)%8)); }
+            }
+        }
+    }
+    mimosis_register_write( 0x4087, 0x0 );
+}
+
+
+
+
+
+sub mimosis_scan_rows {
+
+    my %params = @_;
+
+    my $yStart = $params{'ystart'};
+    my $yStop = $params{'ystop'};
+    my $yStep = $params{'ystep'};
+    my $ySpan = $params{'yspan'};
+
+    my $xStart = $params{'xstart'};
+    my $xStop = $params{'xstop'};
+    my $xStep = $params{'xstep'};
+
+    my $setStart = $params{'setstart'};
+    my $setStop = $params{'setstop'};
+    my $setStep = $params{'setstep'};
+    my $setCount = $params{'setcount'};
+
+    my $modExp = $params{'modexp'};
+    my $modFound = $params{'modfound'};
+
+    $ySpan = 2 unless defined $ySpan;
+
+    $setStart =   0 unless defined $setStart;
+    $setStop =  255 unless defined $setStop;
+    $setStep =    1 unless defined $setStep;
+    $setCount= 4000 unless defined $setCount;
+
+    $modExp = 3 unless defined $modExp;
+
+    $modFound = mimosis_find_mod(
+        $mbsStream,
+        $fpga,
+        $yStart,
+        $yStart+$ySpan-1,
+        $xStart,
+        $xStop,
+        $modExp ) unless defined $modFound;
+
+
+    mimosis_register_write( 0x20, 0x40);
+
+
+    for( my $yLow = $yStart;
+         $yLow <= $yStop;
+         $yLow += $ySpan ) {
+
+        my $yHigh = $yLow + $ySpan - 1;
+
+        printf("Mark pixels: %d - %d, %d - %d\n",
+               $yLow, $yHigh, $xStart, $xStop);
+
+        mimosis_select_pixel(
+            ystart => $yLow,
+            ystop  => $yHigh,
+            ystep  => $yStep,
+            xstart => $xStart,
+            xstop  => $xStop,
+            xstep  => $xStep,
+           );
+
+        mimosis_register_write( 0x46, 0);
+#         usleep(100000); # usleep(1000000);
+
+        mimosis_loop_vph(
+            $mbsStream, # source
+            $fpga, # fpga
+            $singleAccess, # sa
+            $yLow, # yLow
+            $yHigh, # yHig
+            $xStart, # xLow
+            $xStop, # xHig
+            $setStart, # vphSta
+            $setStop, # vphEnd
+            $setStep, # vphTra
+            $setCount, # maxCounts
+            $modFound, # mod
+            $modExp, # exp
+           );
+
+        mimosis_instr_write( 0x3f );
+        mimosis_instr_write( 0x04 );
+        mimosis_instr_write( 0x3e );
+
+        mimosis_register_write( 0x46, 0);
+    }
+}
+
+
+
+
+
+sub mimosis_scurves {
+
+    my %params = @_;
+
+    my $yStart = $params{'ystart'};
+    my $yStop = $params{'ystop'};
+    my $yStep = $params{'ystep'};
+    my $ySpan = $params{'yspan'};
+
+    my $xStart = $params{'xstart'};
+    my $xStop = $params{'xstop'};
+    my $xStep = $params{'xstep'};
+
+    my $setStart = $params{'setstart'};
+    my $setStop = $params{'setstop'};
+    my $setStep = $params{'setstep'};
+    my $setCount = $params{'setcount'};
+
+    my $vcasnRegStr = $params{'vcasnreg'};
+    my $vcasnStart = $params{'vcasnstart'};
+    my $vcasnStop = $params{'vcasnstop'};
+    my $vcasnStep = $params{'vcasnstep'};
+
+    my $pixpulseAASc = $params{'pixpulseaa'};
+    my $pixpulseABSc = $params{'pixpulseab'};
+    my $pixpulseDASc = $params{'pixpulseda'};
+    my $pixpulseDBSc = $params{'pixpulsedb'};
+
+    my $modExp = $params{'modexp'};
+    my $modFound = $params{'modfound'};
+
+    $yStart = 0 unless defined $yStart;
+    $yStop = 503 unless defined $yStop;
+    $yStep = 1 unless defined $yStep;
+    $ySpan = 1 unless defined $ySpan;
+
+    $xStart = 0 unless defined $xStart;
+    $xStop = 1023 unless defined $xStop;
+    $xStep = 1 unless defined $xStep;
+
+    $setStart =   0 unless defined $setStart;
+    $setStop =  255 unless defined $setStop;
+    $setStep =    1 unless defined $setStep;
+    $setCount= 4000 unless defined $setCount;
+
+    $pixpulseAASc = 25 unless defined $pixpulseAASc;
+    $pixpulseABSc = 75 unless defined $pixpulseABSc;
+    $pixpulseDASc = 0  unless defined $pixpulseDASc;
+    $pixpulseDBSc = 0  unless defined $pixpulseDBSc;
+
+    mimosis_register_write(0x066, $pixpulseAASc&0x00ff    );
+    mimosis_register_write(0x166,($pixpulseAASc&0xff00)>>8);
+    mimosis_register_write(0x076, $pixpulseABSc&0x00ff    );
+    mimosis_register_write(0x176,($pixpulseABSc&0xff00)>>8);
+    mimosis_register_write(0x067, $pixpulseDASc&0x00ff    );
+    mimosis_register_write(0x167,($pixpulseDASc&0xff00)>>8);
+    mimosis_register_write(0x077, $pixpulseDBSc&0x00ff    );
+    mimosis_register_write(0x177,($pixpulseDBSc&0xff00)>>8);
+
+    mimosis_instr_write( 0x3f );
+    mimosis_instr_write( 0x04 );
+    mimosis_instr_write( 0x3e );
+
+    mimosis_register_write( 0x20, 0x40 );
+
+    die "Invalid DAC given" if not exists $Mimosis::DAC{$vcasnRegStr};
+    my $vcasnReg = $Mimosis::DAC{$vcasnRegStr}{'ADDR'};
+    my $vcasnVal = mimosis_register_read( $vcasnReg );
+
+    $vcasnStart = $vcasnVal unless defined $vcasnStart;
+    $vcasnStop  = $vcasnStart unless defined $vcasnStop;
+    $vcasnStep  = 1 unless defined $vcasnStep;
+
+    $modExp = 3 unless defined $modExp;
+
+    Mimosis::mimosis_pulse(
+        ystart => $yStart,
+        ystop  => $yStart + $yStep,
+        yspan  => 1,
+        xstart => $xStart,
+        xstop  => $xStop,
+        modexp => $modExp,
+    );
+
+
+    $modFound = mimosis_find_mod(
+        $mbsStream,
+        $fpga,
+        $yStart,
+        $yStart+$ySpan-1,
+        $xStart,
+        $xStop,
+        # $modExp );
+        $modExp ) unless defined $modFound;
+
+    print "MODFOUND: $modFound\n";
+
+    mimosis_instr_write( 0x3f );
+    mimosis_instr_write( 0x04 );
+    mimosis_instr_write( 0x3e );
+
+    for ( my $vcasnSet = $vcasnStart;
+          $vcasnSet <= $vcasnStop;
+          $vcasnSet += $vcasnStep ) {
+
+        mimosis_register_write( $vcasnReg, $vcasnSet );
+
+        print "DAC: $vcasnSet\n" if $printall;
+
+        mimosis_scan_rows (
+            ystart => $yStart,
+            ystop  => $yStop,
+            ystep  => $yStep,
+            yspan  => $ySpan,
+            xstart => $xStart,
+            xstop  => $xStop,
+            xstep  => $xStep,
+            setstart => $setStart,
+            setstop  => $setStop,
+            setstep  => $setStep,
+            setcount => $setCount,
+            modexp   => $modExp,
+            modfound => $modFound,
+        );
+
+        my $dirName = $vcasnRegStr . "-" . $vcasnSet;
+        mkdir($dirName);
+        my $pulsesFile = "scurve-pulses.csv";
+        move($pulsesFile, $dirName . "/" . $dirName . ".csv");
+    }
+}
+
+
+
+
+
+sub mimosis_mask {
+
+    my %params = @_;
+
+    mimosis_register_write( 0x20, 0x42 );
+
+    mimosis_select_pixel(
+        xstart => $params{'xstart'},
+        xstop  => $params{'xstop'},
+        xstep  => $params{'xstep'},
+        ystart => $params{'ystart'},
+        ystop  => $params{'ystop'},
+        ystep  => $params{'ystep'},
+       );
+}
+
+
+
+
+sub mimosis_pulse {
+
+    my %params = @_;
+
+    my $pixpulseAASc = $params{'pixpulseaa'};
+    my $pixpulseABSc = $params{'pixpulseab'};
+    my $pixpulseDASc = $params{'pixpulseda'};
+    my $pixpulseDBSc = $params{'pixpulsedb'};
+    my $modExp = $params{'modexp'};
+
+    $modExp = 3 unless defined $modExp;
+    mimosis_register_write( 0x7d, $modExp );
+
+    $pixpulseAASc = 25 unless defined $pixpulseAASc;
+    $pixpulseABSc = 75 unless defined $pixpulseABSc;
+    $pixpulseDASc = 0  unless defined $pixpulseDASc;
+    $pixpulseDBSc = 0  unless defined $pixpulseDBSc;
+
+    mimosis_register_write(0x066, $pixpulseAASc&0x00ff    );
+    mimosis_register_write(0x166,($pixpulseAASc&0xff00)>>8);
+    mimosis_register_write(0x076, $pixpulseABSc&0x00ff    );
+    mimosis_register_write(0x176,($pixpulseABSc&0xff00)>>8);
+    mimosis_register_write(0x067, $pixpulseDASc&0x00ff    );
+    mimosis_register_write(0x167,($pixpulseDASc&0xff00)>>8);
+    mimosis_register_write(0x077, $pixpulseDBSc&0x00ff    );
+    mimosis_register_write(0x177,($pixpulseDBSc&0xff00)>>8);
+
+    mimosis_instr_write( 0x3f );
+    mimosis_instr_write( 0x04 );
+    mimosis_instr_write( 0x3e );
+
+    mimosis_register_write( 0x20, 0x40 );
+
+    mimosis_select_pixel(
+        xstart => $params{'xstart'},
+        xstop  => $params{'xstop'},
+        xstep  => $params{'xstep'},
+        ystart => $params{'ystart'},
+        ystop  => $params{'ystop'},
+        ystep  => $params{'ystep'},
+       );
+}
+
+
+
 1;
 __END__
 # Below is stub documentation for your module. You'd better edit it!
@@ -53,6 +1085,8 @@ unedited.
 
 Blah blah blah.
 
+
+
 =head2 EXPORT
 
 None by default.
index 235422f9acf90d847f4f4473a1039b15cbc47d8b..d7b29208442d114a838f6f8340c3909ba1fcab7f 100755 (executable)
@@ -17,30 +17,66 @@ my $val = 0x40;
 my $sa = 0;
 
 
-# Mimosis::mimosis_register_write($fpga, $reg, $val, $sa);
-# my $retval = Mimosis::mimosis_register_read($fpga, $reg, $sa);
-# printf("%x\t%x\n",$val, $retval);
-
-# $val = 0x2;
-# Mimosis::mimosis_register_write($fpga, $reg, $val, $sa);
-# $retval = Mimosis::mimosis_register_read($fpga, $reg, $sa);
-# printf("%x\t%x\n",$val, $retval);
-
-
-{
-    my $source = "mbss://localhost:36789";
-    my $yLow = 250;
-    my $yHig = 253;
-    my $xLow = 0;
-    my $xHig = 127;
-    my $exp = 3;
-    my $mod = Mimosis::mimosis_find_mod($source, $fpga, $yLow, $yHig, $xLow, $xHig, $exp);
-    print "Mod: $mod\n";
-
-    my $vphSta = 0;
-    my $vphEnd = 255;
-    my $vphTra = 1;
-    my $maxCounts = 500;
-
-    Mimosis::mimosis_loop_vph($source, $fpga, $sa, $yLow, $yHig, $xLow, $xHig, $vphSta, $vphEnd, $vphTra, $maxCounts, $mod, $exp);
-}
+# Mimosis::set_printall(1);
+
+# Mimosis::mimosis_dacscan("IBIAS");
+
+# Mimosis::mimosis_select_pixel(
+#   xstart => 0,
+#   xstop  => 10,
+#   xstep  => 1,
+#   ystart => 100,
+#   ystop  => 110,
+#   ystep  => 1,
+#  );
+
+my $yLow = 250;
+my $yHig = 253;
+my $xLow = 0;
+my $xHig = 127;
+
+
+Mimosis::mimosis_scurves(
+    ystart => $yLow,
+    ystop  => $yHig,
+    yspan  => 4,
+
+    xstart => $xLow,
+    xstop  => $xHig,
+
+    vcasnreg => 0x48,
+ );
+
+
+# Mimosis::mimosis_scan_rows(
+#   ystart => $yLow,
+#   ystop  => $yHig,
+#   ystep  => 1,
+#   yspan  => 4,
+#   xstart => $xLow,
+#   xstop  => $xHig,
+#   xstep  => 1,
+#   # setstart =>   0,
+#   # setstop  => 255,
+#   # setstep  =>   1,
+#   # setcount =>   4,
+#  );
+
+
+# {
+#     my $source = "mbss://localhost:36789";
+#     my $yLow = 250;
+#     my $yHig = 253;
+#     my $xLow = 0;
+#     my $xHig = 127;
+#     my $exp = 3;
+#     my $mod = Mimosis::mimosis_find_mod($source, $fpga, $yLow, $yHig, $xLow, $xHig, $exp);
+#     print "Mod: $mod\n";
+
+#     my $vphSta = 0;
+#     my $vphEnd = 255;
+#     my $vphTra = 1;
+#     my $maxCounts = 500;
+
+#     Mimosis::mimosis_loop_vph($source, $fpga, $sa, $yLow, $yHig, $xLow, $xHig, $vphSta, $vphEnd, $vphTra, $maxCounts, $mod, $exp);
+# }
index 3bd8e8afc6a2a77eee6e0ad23641e62696ccfa4b..f7c0577bc207a48e02a5e675f60c70c77ca4bd80 100644 (file)
@@ -67,7 +67,7 @@
 .\" ========================================================================
 .\"
 .IX Title "Mimosis 3"
-.TH Mimosis 3 "2024-05-28" "perl v5.26.1" "User Contributed Perl Documentation"
+.TH Mimosis 3 "2024-12-03" "perl v5.26.1" "User Contributed Perl Documentation"
 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
 .\" way too many mistakes in technical documents.
 .if n .ad l
index e9527e92fd0c35c438885b392c85937e2bc09961..c805fb89ff9b87f2805aaeff1eb195c02bf315b3 100755 (executable)
@@ -6,24 +6,31 @@ use warnings;
 
 require Exporter;
 
+use HADES::TrbNet;
+
+use Time::HiRes qw(usleep);
+
+use Chart::Gnuplot;
+use File::Copy;
+use POSIX;
+
+use Data::Dump qw( dump );
+use Data::Dumper;
+
 our @ISA = qw(Exporter);
 
 # Items to export into callers namespace by default. Note: do not export
 # names by default without a very good reason. Use EXPORT_OK instead.
 # Do not simply export all your public functions/methods/constants.
 
-# This allows declaration      use Mimosis ':all';
+# This allows declaration  use Mimosis ':all';
 # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
 # will save memory.
-our %EXPORT_TAGS = ( 'all' => [ qw(
-       
-) ] );
+our %EXPORT_TAGS = ( 'all' => [ qw() ] );
 
 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
 
-our @EXPORT = qw(
-       
-);
+our @EXPORT = qw();
 
 our $VERSION = '0.01';
 
@@ -32,6 +39,1031 @@ XSLoader::load('Mimosis', $VERSION);
 
 # Preloaded methods go here.
 
+
+my $fpga = 0xa000;
+my $chipid = 0x1;
+my $singleAccess = 0;
+my $sleepVal1 = 1000;
+my $sleepVal2 = 1000000;
+
+my $fpgaHub = 0xc000;
+
+my $mbsStream = 'mbss://localhost:36789';
+
+my $trbI2cSpeedReg = 0xde00;
+
+my $i2cSpeed = 0x1e;
+
+
+my $printall = 0;
+
+my $trbAdcRegWrMem = 0xd681;
+my $trbAdcRegRdMem = 0xd684;
+
+my $trbMimRegWrMem = 0xde01;
+my $trbMimRegRdMem = 0xde04;
+
+my $adc_addr = 0x48;
+my $adc_wreg = 0x1;
+my $adc_rreg = 0x0;
+
+my $adc_cmdV = 0xa380;
+my $adc_cmdI = 0x9380;
+
+
+my $adcConv = ( 2 * 4096 ) / 2**16;
+
+my $collect_i2c_errors = 0;
+
+
+
+sub set_fpga {
+  $fpga = $_[0] if defined $_[0];
+}
+
+
+sub get_fpga {
+    print "$fpga\n";
+    return $fpga }
+
+sub set_chipid {
+  $chipid = $_[0] if defined $_[0];
+}
+
+sub get_chipid { return $chipid; }
+
+sub set_singleAccess {
+  $singleAccess = $_[0] if defined $_[0];
+}
+
+sub get_singleAccess { return $singleAccess; }
+
+
+
+sub set_sleepVal1 {
+  $sleepVal1 = $_[0] if defined $_[0];
+}
+
+sub get_sleepVal1 { return $sleepVal1; }
+
+
+sub set_sleepVal2 {
+  $sleepVal2 = $_[0] if defined $_[0];
+}
+
+sub get_sleepVal2 { return $sleepVal2; }
+
+
+sub set_fpgaHub {
+  $fpgaHub = $_[0] if defined $_[0];
+}
+
+
+sub get_fpgaHub {
+    print "$fpgaHub\n";
+    return $fpgaHub }
+
+
+
+
+sub set_mbsStream {
+  $mbsStream = $_[0] if defined $_[0];
+}
+
+sub get_mbsStream { return $mbsStream; }
+
+
+sub set_printall {
+  $printall = $_[0] if defined $_[0];
+}
+
+sub get_printall { return $printall; }
+
+
+sub set_i2cSpeed {
+    $i2cSpeed = $_[0] if defined $_[0];
+    trb_register_write( $fpga, $trbI2cSpeedReg, $i2cSpeed );
+}
+
+sub get_i2cSpeed { return $i2cSpeed; }
+
+
+sub set_adcToIkfProxy {
+    $adc_cmdV = 0xe380;
+    $adc_cmdI = 0xd380;
+}
+
+sub set_adcToIPHCProxy {
+    $adc_cmdV = 0xa380;
+    $adc_cmdI = 0x9380;
+}
+
+
+
+sub make_require {
+    do "/d/jspc37/mimosis/scripts/TrbNetUart.pm";
+    TNU_set_device("/dev/ttyUSB0");
+}
+
+
+
+sub set_collect_i2c_errors {
+    $collect_i2c_errors = $_[0] if defined $_[0];
+}
+
+sub get_collect_i2c_errors { return $collect_i2c_errors; }
+
+
+our %DAC = (
+    IBIAS => { ADDR => 0x40, MONITOR => 0x25, MONVAL => 1, TYPE => 'CURRENT', RESET => 0x40, },
+    ITHR  => { ADDR => 0x41, MONITOR => 0x25, MONVAL => 3, TYPE => 'CURRENT', RESET => 0x34, },
+    IDB   => { ADDR => 0x42, MONITOR => 0x25, MONVAL => 2, TYPE => 'CURRENT', RESET => 0x1c, },
+    VRESET => { ADDR => 0x43, MONITOR => 0x26, MONVAL => 6, TYPE => 'VOLTAGE', RESET => 0xab, },
+    VPL    => { ADDR => 0x44, MONITOR => 0x26, MONVAL => 2, TYPE => 'VOLTAGE', RESET => 0x57, },
+    VPH    => { ADDR => 0x45, MONITOR => 0x26, MONVAL => 1, TYPE => 'VOLTAGE', RESET => 0x68, },
+    VPHFINE => { ADDR => 0x46, MONITOR => 0x26, MONVAL => 1, TYPE => 'VOLTAGE', RESET => 0x0, },
+    VCASP    => { ADDR => 0x47, MONITOR => 0x26, MONVAL => 4, TYPE => 'VOLTAGE', RESET => 0x43, },
+    VCASNA   => { ADDR => 0x48, MONITOR => 0x26, MONVAL => 7, TYPE => 'VOLTAGE', RESET => 0x53, },
+    VCASNB   => { ADDR => 0x49, MONITOR => 0x26, MONVAL => 8, TYPE => 'VOLTAGE', RESET => 0x53, },
+    VCASNC   => { ADDR => 0x4a, MONITOR => 0x26, MONVAL => 9, TYPE => 'VOLTAGE', RESET => 0x53, },
+    VCASND   => { ADDR => 0x4b, MONITOR => 0x26, MONVAL => 10, TYPE => 'VOLTAGE', RESET => 0x53, },
+    VCASN2   => { ADDR => 0x4c, MONITOR => 0x26, MONVAL => 3, TYPE => 'VOLTAGE', RESET => 0x53, },
+    VCLIP    => { ADDR => 0x4d, MONITOR => 0x26, MONVAL => 5, TYPE => 'VOLTAGE', RESET => 0x32, },
+    IBUFBIAS => { ADDR => 0x4e, MONITOR => undef, MONVAL => undef, TYPE => 'CURRENT', RESET => 0x7d, },
+   );
+
+
+
+sub mimosis_trb_reset {
+
+    my $trbMimRstReg = 0xde05;
+    trb_register_clearbit($fpga, $trbMimRstReg, 0x100);
+    usleep($sleepVal2);
+    trb_register_setbit($fpga, $trbMimRstReg, 0x100);
+    usleep($sleepVal2);
+}
+
+
+
+sub mimosis_trb_word_align {
+
+    my $trbMimInRst = 0x9010;
+    trb_register_setbit($fpga, $trbMimInRst, 1);
+    usleep($sleepVal2);
+    trb_register_clearbit($fpga, $trbMimInRst, 1);
+    usleep($sleepVal2);
+
+    my $trbMimInpStat = 0x9000;
+    my $delpos = trb_register_read($fpga, $trbMimInpStat);
+    $delpos = ($delpos & 0x7f000000) >> 24;
+
+    my $trbMimAlignCtrl = 0x9100;
+    trb_register_clearbit($fpga, $trbMimAlignCtrl, 0b100000000);
+    sleep(1);
+    trb_register_setbit($fpga, $trbMimAlignCtrl, 0b100000000);
+    usleep($sleepVal2);
+
+    my @val = @{trb_register_read_mem($fpga, 0x9110, 0, 8)->{$fpga}};
+    printf("%x\n", ($_ & 0xFFFF)) foreach ( @val );
+    return(@val);
+}
+
+
+
+my @i2c_errors;
+
+
+sub collect_i2c_errors {
+
+    my $regBuf =
+      trb_register_read( $fpga, $trbMimRegRdMem );
+
+    my $status =
+      (($regBuf->{$fpga}//0) >> 16 ) & 0xff;
+
+    push ( @i2c_errors, $status );
+}
+
+
+
+
+sub get_i2c_errors {
+
+    my @tmp_i2c_errors = @i2c_errors;
+    @i2c_errors = ();
+    return @tmp_i2c_errors;
+}
+
+
+
+sub adc_i2c_command {
+
+    my (
+      $addr,
+      $cmd,
+      $data,
+      $rw,
+      $skipCmd,
+      $wordByte
+     ) = @_;
+
+    my $regData =
+      ( $data << 16 ) + ( $cmd << 8 ) + 0x80 + $addr;
+
+    my $regFlag =
+      ( $rw << 8 ) + ( $skipCmd << 4 ) + $wordByte;
+
+    if ( $rw == 0 ) {
+
+        trb_register_write_mem(
+          $fpga,
+          $trbAdcRegWrMem,
+          0,
+          [ $regFlag, $regData ],
+          2 );
+
+        usleep($sleepVal1);
+
+    } elsif ( $rw == 1 ) {
+
+        trb_register_write_mem(
+          $fpga,
+          $trbAdcRegWrMem,
+          0,
+          [ $regFlag, $regData ],
+          2 );
+
+        usleep($sleepVal1);
+
+        my $regReturn =
+          trb_register_read( $fpga, $trbAdcRegRdMem );
+
+        usleep($sleepVal1);
+
+        return $regReturn->{$fpga} & 0xffff;
+    }
+}
+
+
+
+
+sub mimosis_i2c_command {
+
+    my (
+      $addr,
+      $cmd,
+      $data,
+      $rw,
+      $skipCmd,
+      $wordByte
+     ) = @_;
+
+    my $regData =
+      ( $data << 16 ) + ( $cmd << 8 ) + ( $addr << 1 );
+
+    my $regFlag =
+      ( $rw << 8 ) + ( $skipCmd << 4 ) + $wordByte;
+
+    my $regReturn;
+    my $regBuf;
+
+    if ( $rw == 0 ) {
+
+        trb_register_write_mem(
+          $fpga,
+          $trbMimRegWrMem,
+          0,
+          [ $regFlag, $regData, 0x1 ],
+          3 );
+
+        usleep($sleepVal1);
+
+        $regBuf =
+          trb_register_read( $fpga, $trbMimRegRdMem );
+
+    } elsif ( $rw == 1 ) {
+
+        trb_register_write_mem(
+          $fpga,
+          $trbMimRegWrMem,
+          0,
+          [ $regFlag, $regData, 0x1 ],
+          3 );
+
+        usleep($sleepVal1);
+
+        $regBuf =
+          trb_register_read( $fpga, $trbMimRegRdMem );
+
+        usleep($sleepVal1);
+
+    }
+
+    if ( $printall ) {
+
+        my $status =
+          (($regBuf->{$fpga}//0) >> 16 ) & 0xff;
+        printf("I2CStatus: 0x%02x\n", $status);
+    }
+
+    collect_i2c_errors() if $collect_i2c_errors;
+
+    if ( $rw == 1 ) {
+
+        if ($fpga < 0xfe00)
+        {
+          return $regBuf->{$fpga} & 0xffff;
+        }
+    }
+
+}
+
+
+
+
+sub mimosis_register_write {
+
+    my (
+      $mimReg,
+      $mimData,
+     ) = @_;
+
+    my $addr =
+      ($chipid << 4) +  0x2;
+
+    my $cmd  =
+      ( $mimReg >> 8 );
+
+    my $data =
+      ( ( $mimReg & 0xff ) << 8 ) + $mimData;
+
+
+    if ( $singleAccess ) {
+
+        mimosis_i2c_command(
+          $addr,0, $mimReg>>8, 0, 1, 0);
+
+        mimosis_i2c_command(
+          $addr+1, 0, $mimReg, 0, 1, 0);
+
+        mimosis_i2c_command(
+          $addr+2, 0, $mimData, 0, 1, 0);
+
+    } else {
+
+        mimosis_i2c_command(
+          $addr, $cmd, $data, 0, 0, 1);
+    }
+
+}
+
+
+
+
+sub mimosis_register_read {
+
+    my ( $mimReg ) = @_;
+
+    my $addr = ( $chipid << 4 ) +  0x2;
+    my $cmd  = ( $mimReg >> 8 );
+    my $data = ( $mimReg & 0xff );
+
+    if ($singleAccess) {
+
+        mimosis_i2c_command(
+          $addr, 0, $mimReg>>8, 0, 1, 0);
+
+        mimosis_i2c_command(
+          $addr+1, 0, $mimReg, 0, 1, 0);
+
+    } else {
+
+        mimosis_i2c_command(
+          $addr, $cmd, $data, 0, 0, 0);
+    }
+
+    $addr = ($chipid << 4) +  0x5;
+
+    my $val  = mimosis_i2c_command(
+      $addr, 0, 0, 1, 1, 0 );
+
+    return $val & 0xff;
+}
+
+
+
+
+sub mimosis_instr_write {
+
+    my ( $cmd ) = @_;
+
+    # CHIPID???
+    trb_register_write_mem(
+      $fpga, $trbMimRegWrMem, 0,
+      [ 0x0, ( $cmd << 8 ) + ( 0x11 << 1 ), 0x1 ],
+      3 );
+
+     usleep($sleepVal1);
+}
+
+
+
+
+sub mimosis_load_file {
+
+    my %params = @_;
+
+    my $file = $params{'file'};
+    my $printwrong = defined $params{'printwrong'} ? 1 : 0;
+
+    defined $file or die "Mimosis::mimosis_load_file: Must provide \$file.";
+
+    my @config = do $file;
+
+    foreach my $i (@config) {
+
+        if ( defined( @$i[1] ) ) {
+
+            mimosis_register_write(
+              @$i[0], @$i[1] );
+
+            if( $printall ) {
+
+#               printf( "%x %x %x\n",
+#                       $fpga, @$i[0], @$i[1] );
+                      
+              my $retVal =
+                trb_register_read($fpga, 0xde04);
+
+              foreach my $k ( keys %{$retVal} ) {
+
+                  my $status =
+                    (($retVal->{$k}//0) >> 16 ) & 0xff;
+
+                  printf("%x %x    Status: %x\n",
+                          $k, @$i[0], $status);
+              }
+                      
+            }
+        }
+    }
+
+    if ( $printall || $printwrong ) {
+
+        foreach my $i (@config) {
+
+            if ( defined( @$i[1] ) ) {
+
+                my $val =
+                  mimosis_register_read(@$i[0]);
+
+                unless(($val & 0xff) == @$i[1]) {
+
+                    my $retVal =
+                      trb_register_read($fpga, 0xde04);
+
+                    foreach my $k ( keys %{$retVal} ) {
+
+                        my $status =
+                          (($retVal->{$k}//0) >> 16 ) & 0xff;
+
+                        printf("%x %x %x    Status: %x\n",
+                               $k, @$i[0], $val, $status);
+                    }
+                }
+            }
+        }
+    }
+}
+
+
+
+
+sub mimosis_scan_single_dac {
+
+    my %params = @_;
+
+    my $dac = $params{'dac'};
+
+    my $start =
+      defined $params{'start'} ?
+      $params{'start'} : 0;
+
+    my $stop =
+      defined $params{'stop'} ?
+      $params{'stop'} : 255;
+
+    my $step =
+      defined $params{'step'} ?
+      $params{'step'} : 1;
+
+    my $name =
+      defined $params{'name'} ?
+      $params{'name'} : "";
+
+
+    my @resVals;
+    my @resTicks;
+
+    $name .= "_" if $name ne "";
+
+    my $fName = $name . $dac . ".csv";
+    open( FH, '>', $fName ) or die $!;
+
+    mimosis_register_write( $Mimosis::DAC{$dac}{'MONITOR'}, $Mimosis::DAC{$dac}{'MONVAL'} );
+
+    for( my $set = $start;
+         $set <= $stop;
+         $set += $step ) {
+
+        mimosis_register_write( $Mimosis::DAC{$dac}{'ADDR'}, $set );
+
+        my $adcCmd =
+          $Mimosis::DAC{$dac}{'TYPE'} eq "VOLTAGE" ?
+          $adc_cmdV : $adc_cmdI;
+          
+
+        adc_i2c_command(
+          $adc_addr, $adc_wreg, $adcCmd, 0, 0, 1 );
+
+        usleep(8000);
+
+        my $raw = adc_i2c_command(
+          $adc_addr, $adc_rreg, 0x0, 1, 0, 1 );
+
+        printf( FH "%x\t%d\t%f\n",
+                $Mimosis::DAC{$dac}{'ADDR'}, $set, $raw * $adcConv );
+
+        push ( @resVals, $raw*$adcConv );
+        push ( @resTicks, $set );
+    }
+
+    mimosis_register_write(
+        $Mimosis::DAC{$dac}{'ADDR'},
+        $Mimosis::DAC{$dac}{'RESET'}
+       );
+
+    close(FH);
+
+    return ( \@resTicks, \@resVals );
+}
+
+
+
+
+sub mimosis_dacscan {
+
+    my %params = @_;
+
+    my $dacArrRef = $params{'dacs'};
+    my $start = $params{'start'};
+    my $stop = $params{'stop'};
+    my $step = $params{'step'};
+    my $name = $params{'name'};
+
+    my @dacArr =
+      defined $params{'dacs'} ?
+      @{ $dacArrRef } : ();
+    @dacArr = %Mimosis::DAC unless scalar(@dacArr) > 0;
+
+
+    $start = 0 unless defined $start;
+    $stop = 255 unless defined $stop;
+    $step = 1 unless defined $step;
+    $name = "" unless defined $name;
+
+
+    my %results;
+
+    for my $dac ( @dacArr ) {
+
+        next if not defined $Mimosis::DAC{$dac}{'MONVAL'};
+
+        printf( "Scan: %s\n", $dac ) if $printall;
+
+        ( $results{$dac}{X}, $results{$dac}{Y} ) =
+          mimosis_scan_single_dac(
+            dac   => $dac,
+            start => $start,
+            stop  => $stop,
+            step  => $step,
+            name  => $name,
+           );
+    }
+
+    $name .= "_" if $name ne "";
+
+    my $chart = Chart::Gnuplot->new(
+        output => $name . "dacscan.png",
+        terminal => "pngcairo",
+        title  => "DAC-Scan",
+        xlabel => "Setting [LSB]",
+        ylabel => "Voltage output [mV]",
+       );
+
+
+    my @dataArr;
+
+    for my $dac ( keys %results ) {
+
+        my $dataSet = Chart::Gnuplot::DataSet->new(
+          xdata => $results{$dac}{X},
+          ydata => $results{$dac}{Y},
+          title => "Plotting a line from Perl arrays",
+          style => "linespoints",
+         );
+
+        push(@dataArr, $dataSet);
+    }
+
+    $chart->plot2d(@dataArr);
+
+    return %results;
+}
+
+
+
+
+sub mimosis_select_pixel {
+
+    my %params = @_;
+    my $yStart = $params{'ystart'};
+    my $yStop = $params{'ystop'};
+    my $yStep = $params{'ystep'};
+
+    my $xStart = $params{'xstart'};
+    my $xStop = $params{'xstop'};
+    my $xStep = $params{'xstep'};
+
+    $yStart = 0 unless defined $yStart;
+    $yStop = 503 unless defined $yStop;
+    $yStep = 1 unless defined $yStep;
+
+    $xStart = 0 unless defined $xStart;
+    $xStop = 1023 unless defined $xStop;
+    $xStep = 1 unless defined $xStep;
+
+    for ( my $y = $yStart;
+          $y <= $yStop;
+          $y += $yStep ) {
+
+        my $regAddY = $y/8;
+        my $regBitY = 1<<( $y % 8 );
+        my $regWordY = ($regAddY<<8) + 0x84;
+
+        mimosis_register_write($regWordY, $regBitY );
+
+        my $currRegX = floor $xStart/16;
+        my $word82 = 0;
+        my $word81 = 0;
+
+        for ( my $x = $xStart;
+              $x <= $xStop;
+              $x += $xStep ) {
+
+            if( (($x/16) == $currRegX)
+                && ($x != $xStop)
+               ) {
+
+                if    ($x%2 == 1) { $word82 |= (1<<(floor($x/2)%8)); }
+                elsif ($x%2 == 0) { $word81 |= (1<<(floor($x/2)%8)); }
+
+            } else {
+
+                if ( ($x == $xStop) &&
+                     (($x/16) != $currRegX)
+                   ) {
+                    if    ($x%2 == 1) { $word82 |= (1<<(floor($x/2)%8)); }
+                    elsif ($x%2 == 0) { $word81 |= (1<<(floor($x/2)%8)); }
+                }
+
+                if($word82 == $word81) {
+
+                    my $addr = ($currRegX<<8) + 0x83;
+                    mimosis_register_write( $addr, $word81 );
+                    mimosis_instr_write( 0x05 );
+                    mimosis_register_write( $addr, 0 );
+
+                } else {
+
+                    my $addr81 = ($currRegX<<8) + 0x81;
+                    my $addr82 = ($currRegX<<8) + 0x82;
+
+                    mimosis_register_write( $addr81, $word81 );
+                    mimosis_register_write( $addr82, $word82 );
+                    mimosis_instr_write( 0x05 );
+                    mimosis_register_write( $addr81, 0 );
+                    mimosis_register_write( $addr82, 0 );
+                }
+
+                $currRegX = floor $x/16;
+                $word81 = 0;
+                $word82 = 0;
+
+                if    ($x%2 == 1){ $word82 = (1<<(floor($x/2)%8)); }
+                elsif ($x%2 == 0){ $word81 = (1<<(floor($x/2)%8)); }
+            }
+        }
+    }
+    mimosis_register_write( 0x4087, 0x0 );
+}
+
+
+
+
+
+sub mimosis_scan_rows {
+
+    my %params = @_;
+
+    my $yStart = $params{'ystart'};
+    my $yStop = $params{'ystop'};
+    my $yStep = $params{'ystep'};
+    my $ySpan = $params{'yspan'};
+
+    my $xStart = $params{'xstart'};
+    my $xStop = $params{'xstop'};
+    my $xStep = $params{'xstep'};
+
+    my $setStart = $params{'setstart'};
+    my $setStop = $params{'setstop'};
+    my $setStep = $params{'setstep'};
+    my $setCount = $params{'setcount'};
+
+    my $modExp = $params{'modexp'};
+    my $modFound = $params{'modfound'};
+
+    $ySpan = 2 unless defined $ySpan;
+
+    $setStart =   0 unless defined $setStart;
+    $setStop =  255 unless defined $setStop;
+    $setStep =    1 unless defined $setStep;
+    $setCount= 4000 unless defined $setCount;
+
+    $modExp = 3 unless defined $modExp;
+
+    $modFound = mimosis_find_mod(
+        $mbsStream,
+        $fpga,
+        $yStart,
+        $yStart+$ySpan-1,
+        $xStart,
+        $xStop,
+        $modExp ) unless defined $modFound;
+
+
+    mimosis_register_write( 0x20, 0x40);
+
+
+    for( my $yLow = $yStart;
+         $yLow <= $yStop;
+         $yLow += $ySpan ) {
+
+        my $yHigh = $yLow + $ySpan - 1;
+
+        printf("Mark pixels: %d - %d, %d - %d\n",
+               $yLow, $yHigh, $xStart, $xStop);
+
+        mimosis_select_pixel(
+            ystart => $yLow,
+            ystop  => $yHigh,
+            ystep  => $yStep,
+            xstart => $xStart,
+            xstop  => $xStop,
+            xstep  => $xStep,
+           );
+
+        mimosis_register_write( 0x46, 0);
+#         usleep(100000); # usleep(1000000);
+
+        mimosis_loop_vph(
+            $mbsStream, # source
+            $fpga, # fpga
+            $singleAccess, # sa
+            $yLow, # yLow
+            $yHigh, # yHig
+            $xStart, # xLow
+            $xStop, # xHig
+            $setStart, # vphSta
+            $setStop, # vphEnd
+            $setStep, # vphTra
+            $setCount, # maxCounts
+            $modFound, # mod
+            $modExp, # exp
+           );
+
+        mimosis_instr_write( 0x3f );
+        mimosis_instr_write( 0x04 );
+        mimosis_instr_write( 0x3e );
+
+        mimosis_register_write( 0x46, 0);
+    }
+}
+
+
+
+
+
+sub mimosis_scurves {
+
+    my %params = @_;
+
+    my $yStart = $params{'ystart'};
+    my $yStop = $params{'ystop'};
+    my $yStep = $params{'ystep'};
+    my $ySpan = $params{'yspan'};
+
+    my $xStart = $params{'xstart'};
+    my $xStop = $params{'xstop'};
+    my $xStep = $params{'xstep'};
+
+    my $setStart = $params{'setstart'};
+    my $setStop = $params{'setstop'};
+    my $setStep = $params{'setstep'};
+    my $setCount = $params{'setcount'};
+
+    my $vcasnRegStr = $params{'vcasnreg'};
+    my $vcasnStart = $params{'vcasnstart'};
+    my $vcasnStop = $params{'vcasnstop'};
+    my $vcasnStep = $params{'vcasnstep'};
+
+    my $pixpulseAASc = $params{'pixpulseaa'};
+    my $pixpulseABSc = $params{'pixpulseab'};
+    my $pixpulseDASc = $params{'pixpulseda'};
+    my $pixpulseDBSc = $params{'pixpulsedb'};
+
+    my $modExp = $params{'modexp'};
+    my $modFound = $params{'modfound'};
+
+    $yStart = 0 unless defined $yStart;
+    $yStop = 503 unless defined $yStop;
+    $yStep = 1 unless defined $yStep;
+    $ySpan = 1 unless defined $ySpan;
+
+    $xStart = 0 unless defined $xStart;
+    $xStop = 1023 unless defined $xStop;
+    $xStep = 1 unless defined $xStep;
+
+    $setStart =   0 unless defined $setStart;
+    $setStop =  255 unless defined $setStop;
+    $setStep =    1 unless defined $setStep;
+    $setCount= 4000 unless defined $setCount;
+
+    $pixpulseAASc = 25 unless defined $pixpulseAASc;
+    $pixpulseABSc = 75 unless defined $pixpulseABSc;
+    $pixpulseDASc = 0  unless defined $pixpulseDASc;
+    $pixpulseDBSc = 0  unless defined $pixpulseDBSc;
+
+    mimosis_register_write(0x066, $pixpulseAASc&0x00ff    );
+    mimosis_register_write(0x166,($pixpulseAASc&0xff00)>>8);
+    mimosis_register_write(0x076, $pixpulseABSc&0x00ff    );
+    mimosis_register_write(0x176,($pixpulseABSc&0xff00)>>8);
+    mimosis_register_write(0x067, $pixpulseDASc&0x00ff    );
+    mimosis_register_write(0x167,($pixpulseDASc&0xff00)>>8);
+    mimosis_register_write(0x077, $pixpulseDBSc&0x00ff    );
+    mimosis_register_write(0x177,($pixpulseDBSc&0xff00)>>8);
+
+    mimosis_instr_write( 0x3f );
+    mimosis_instr_write( 0x04 );
+    mimosis_instr_write( 0x3e );
+
+    mimosis_register_write( 0x20, 0x40 );
+
+    die "Invalid DAC given" if not exists $Mimosis::DAC{$vcasnRegStr};
+    my $vcasnReg = $Mimosis::DAC{$vcasnRegStr}{'ADDR'};
+    my $vcasnVal = mimosis_register_read( $vcasnReg );
+
+    $vcasnStart = $vcasnVal unless defined $vcasnStart;
+    $vcasnStop  = $vcasnStart unless defined $vcasnStop;
+    $vcasnStep  = 1 unless defined $vcasnStep;
+
+    $modExp = 3 unless defined $modExp;
+
+    Mimosis::mimosis_pulse(
+        ystart => $yStart,
+        ystop  => $yStart + $yStep,
+        yspan  => 1,
+        xstart => $xStart,
+        xstop  => $xStop,
+        modexp => $modExp,
+    );
+
+
+    $modFound = mimosis_find_mod(
+        $mbsStream,
+        $fpga,
+        $yStart,
+        $yStart+$ySpan-1,
+        $xStart,
+        $xStop,
+        # $modExp );
+        $modExp ) unless defined $modFound;
+
+    print "MODFOUND: $modFound\n";
+
+    mimosis_instr_write( 0x3f );
+    mimosis_instr_write( 0x04 );
+    mimosis_instr_write( 0x3e );
+
+    for ( my $vcasnSet = $vcasnStart;
+          $vcasnSet <= $vcasnStop;
+          $vcasnSet += $vcasnStep ) {
+
+        mimosis_register_write( $vcasnReg, $vcasnSet );
+
+        print "DAC: $vcasnSet\n" if $printall;
+
+        mimosis_scan_rows (
+            ystart => $yStart,
+            ystop  => $yStop,
+            ystep  => $yStep,
+            yspan  => $ySpan,
+            xstart => $xStart,
+            xstop  => $xStop,
+            xstep  => $xStep,
+            setstart => $setStart,
+            setstop  => $setStop,
+            setstep  => $setStep,
+            setcount => $setCount,
+            modexp   => $modExp,
+            modfound => $modFound,
+        );
+
+        my $dirName = $vcasnRegStr . "-" . $vcasnSet;
+        mkdir($dirName);
+        my $pulsesFile = "scurve-pulses.csv";
+        move($pulsesFile, $dirName . "/" . $dirName . ".csv");
+    }
+}
+
+
+
+
+
+sub mimosis_mask {
+
+    my %params = @_;
+
+    mimosis_register_write( 0x20, 0x42 );
+
+    mimosis_select_pixel(
+        xstart => $params{'xstart'},
+        xstop  => $params{'xstop'},
+        xstep  => $params{'xstep'},
+        ystart => $params{'ystart'},
+        ystop  => $params{'ystop'},
+        ystep  => $params{'ystep'},
+       );
+}
+
+
+
+
+sub mimosis_pulse {
+
+    my %params = @_;
+
+    my $pixpulseAASc = $params{'pixpulseaa'};
+    my $pixpulseABSc = $params{'pixpulseab'};
+    my $pixpulseDASc = $params{'pixpulseda'};
+    my $pixpulseDBSc = $params{'pixpulsedb'};
+    my $modExp = $params{'modexp'};
+
+    $modExp = 3 unless defined $modExp;
+    mimosis_register_write( 0x7d, $modExp );
+
+    $pixpulseAASc = 25 unless defined $pixpulseAASc;
+    $pixpulseABSc = 75 unless defined $pixpulseABSc;
+    $pixpulseDASc = 0  unless defined $pixpulseDASc;
+    $pixpulseDBSc = 0  unless defined $pixpulseDBSc;
+
+    mimosis_register_write(0x066, $pixpulseAASc&0x00ff    );
+    mimosis_register_write(0x166,($pixpulseAASc&0xff00)>>8);
+    mimosis_register_write(0x076, $pixpulseABSc&0x00ff    );
+    mimosis_register_write(0x176,($pixpulseABSc&0xff00)>>8);
+    mimosis_register_write(0x067, $pixpulseDASc&0x00ff    );
+    mimosis_register_write(0x167,($pixpulseDASc&0xff00)>>8);
+    mimosis_register_write(0x077, $pixpulseDBSc&0x00ff    );
+    mimosis_register_write(0x177,($pixpulseDBSc&0xff00)>>8);
+
+    mimosis_instr_write( 0x3f );
+    mimosis_instr_write( 0x04 );
+    mimosis_instr_write( 0x3e );
+
+    mimosis_register_write( 0x20, 0x40 );
+
+    mimosis_select_pixel(
+        xstart => $params{'xstart'},
+        xstop  => $params{'xstop'},
+        xstep  => $params{'xstep'},
+        ystart => $params{'ystart'},
+        ystop  => $params{'ystop'},
+        ystep  => $params{'ystep'},
+       );
+}
+
+
+
 1;
 __END__
 # Below is stub documentation for your module. You'd better edit it!
@@ -53,6 +1085,8 @@ unedited.
 
 Blah blah blah.
 
+
+
 =head2 EXPORT
 
 None by default.
diff --git a/scripts/modules/Mimosis/reg.pl b/scripts/modules/Mimosis/reg.pl
deleted file mode 100755 (executable)
index 235422f..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/perl
-
-use ExtUtils::testlib;
-use Mimosis;
-
-use HADES::TrbNet;
-
-use warnings;
-use strict;
-
-
-trb_init_ports() or die trb_strerror();
-
-my $fpga = 0xa000;
-my $reg = 0x20;
-my $val = 0x40;
-my $sa = 0;
-
-
-# Mimosis::mimosis_register_write($fpga, $reg, $val, $sa);
-# my $retval = Mimosis::mimosis_register_read($fpga, $reg, $sa);
-# printf("%x\t%x\n",$val, $retval);
-
-# $val = 0x2;
-# Mimosis::mimosis_register_write($fpga, $reg, $val, $sa);
-# $retval = Mimosis::mimosis_register_read($fpga, $reg, $sa);
-# printf("%x\t%x\n",$val, $retval);
-
-
-{
-    my $source = "mbss://localhost:36789";
-    my $yLow = 250;
-    my $yHig = 253;
-    my $xLow = 0;
-    my $xHig = 127;
-    my $exp = 3;
-    my $mod = Mimosis::mimosis_find_mod($source, $fpga, $yLow, $yHig, $xLow, $xHig, $exp);
-    print "Mod: $mod\n";
-
-    my $vphSta = 0;
-    my $vphEnd = 255;
-    my $vphTra = 1;
-    my $maxCounts = 500;
-
-    Mimosis::mimosis_loop_vph($source, $fpga, $sa, $yLow, $yHig, $xLow, $xHig, $vphSta, $vphEnd, $vphTra, $maxCounts, $mod, $exp);
-}