From: Maps Date: Thu, 12 Dec 2024 11:11:14 +0000 (+0100) Subject: changes in Mimosis module X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=37110604705551637de628c66dd5cd5b1acb009c;p=mimosis_chain.git changes in Mimosis module --- diff --git a/scripts/modules/Mimosis/Makefile b/scripts/modules/Mimosis/Makefile index 7d93d54..0c6f4d6 100644 --- a/scripts/modules/Mimosis/Makefile +++ b/scripts/modules/Mimosis/Makefile @@ -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 diff --git a/scripts/modules/Mimosis/Mimosis.c b/scripts/modules/Mimosis/Mimosis.c index 01d798c..ff5831a 100644 --- a/scripts/modules/Mimosis/Mimosis.c +++ b/scripts/modules/Mimosis/Mimosis.c @@ -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) diff --git a/scripts/modules/Mimosis/Mimosis.o b/scripts/modules/Mimosis/Mimosis.o index 1b75c78..86e203b 100644 Binary files a/scripts/modules/Mimosis/Mimosis.o and b/scripts/modules/Mimosis/Mimosis.o differ diff --git a/scripts/modules/Mimosis/Mimosis.xs b/scripts/modules/Mimosis/Mimosis.xs index 1e9cd52..562b5a3 100755 --- a/scripts/modules/Mimosis/Mimosis.xs +++ b/scripts/modules/Mimosis/Mimosis.xs @@ -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 diff --git a/scripts/modules/Mimosis/blib/lib/Mimosis.pm b/scripts/modules/Mimosis/blib/lib/Mimosis.pm index e9527e9..c805fb8 100755 --- a/scripts/modules/Mimosis/blib/lib/Mimosis.pm +++ b/scripts/modules/Mimosis/blib/lib/Mimosis.pm @@ -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/blib/lib/reg.pl b/scripts/modules/Mimosis/blib/lib/reg.pl index 235422f..d7b2920 100755 --- a/scripts/modules/Mimosis/blib/lib/reg.pl +++ b/scripts/modules/Mimosis/blib/lib/reg.pl @@ -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); +# } diff --git a/scripts/modules/Mimosis/blib/man3/Mimosis.3pm b/scripts/modules/Mimosis/blib/man3/Mimosis.3pm index 3bd8e8a..f7c0577 100644 --- a/scripts/modules/Mimosis/blib/man3/Mimosis.3pm +++ b/scripts/modules/Mimosis/blib/man3/Mimosis.3pm @@ -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 diff --git a/scripts/modules/Mimosis/lib/Mimosis.pm b/scripts/modules/Mimosis/lib/Mimosis.pm index e9527e9..c805fb8 100755 --- a/scripts/modules/Mimosis/lib/Mimosis.pm +++ b/scripts/modules/Mimosis/lib/Mimosis.pm @@ -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 index 235422f..0000000 --- a/scripts/modules/Mimosis/reg.pl +++ /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); -}