PERL_ARCHIVE_AFTER =
-TO_INST_PM = lib/Mimosis.pm \
- reg.pl
+TO_INST_PM = lib/Mimosis.pm
# --- MakeMaker platform_constants section:
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
#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)
{
;
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);
;
int fpga = (int)SvIV(ST(1))
;
- bool sa = (bool)SvTRUE(ST(2))
+ int sa = (int)SvIV(ST(2))
;
int yLow = (int)SvIV(ST(3))
;
;
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;
}
# 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)
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
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
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';
# 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!
Blah blah blah.
+
+
=head2 EXPORT
None by default.
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);
+# }
.\" ========================================================================
.\"
.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
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';
# 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!
Blah blah blah.
+
+
=head2 EXPORT
None by default.
+++ /dev/null
-#!/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);
-}