]> jspc29.x-matter.uni-frankfurt.de Git - mimosis_chain.git/commitdiff
update Mimosis library to work with SCA on FEB, add options for adc and mux control
authorMaps <maps@ikf>
Tue, 31 Mar 2026 11:07:53 +0000 (13:07 +0200)
committerMaps <maps@ikf>
Tue, 31 Mar 2026 11:07:53 +0000 (13:07 +0200)
scripts/cli/mimosis
scripts/modules/Mimosis/lib/Mimosis.pm

index 5d846386421e9e3bc210289395dca1d597cee054..d1065c8e60d8ef08f7fae86730ea7011de629eb2 100755 (executable)
@@ -3,11 +3,11 @@
 use Getopt::Long::Subcommand;
 use HADES::TrbNet;
 # use ExtUtils::testlib;
-# use lib '/d/jspc37/mimosis/scripts/modules/Mimosis/blib/lib';
+# use lib '/d/jspc37/mimosis/scripts/modules/Mimosis/lib';
 # use lib '/d/jspc37/mimosis/scripts';
 use Mimosis;
 use Time::HiRes qw(usleep sleep);
-use Data::Dump qw(dump);
+use Data::Dump qw(dump dd);
 use File::Copy;
 
 
@@ -19,42 +19,47 @@ sub dos_valid {
     return
         $dos eq 'jspc29:109' ||
        $dos eq 'jspc29:150' ||
+       $dos eq 'jspc29:26' ||
        $dos eq 'jspc29:7';
 }
 
 my $dos = $ENV{'DAQOPSERVER'};
-
-if ( !dos_valid($dos) ) {
-
-    print "\nDAQOPSERVER not defined or wrong value!!\n";
-
-    do {
-        print("Which setup?\n");
-        print("1  Lab317\n");
-        print("2  Probestation\n");
-        print("3  Lab318\n");
-        print("Choose [1,2,3]: ");
-
-        my $choice = <STDIN>;
-        chomp $choice;
-
-        if( $choice ne '2' and
-            $choice ne '1' and
-           $choice ne '3' ) {
-            print("Not a valid input.\n");
-        } elsif( $choice eq '1' ) {
-            $dos = 'jspc29:150';
-        } elsif( $choice eq '2' ) {
-            $dos = 'jspc29:109';
-        } elsif( $choice eq '3' ) {
-            $dos = 'jspc29:7';
-        }
-    } while !dos_valid($dos);
-
-    $ENV{'DAQOPSERVER'} = $dos;
-
-    do "mimosis " . join( " ", @ARGV );
-}
+# 
+# if ( !dos_valid($dos) ) {
+# 
+#     print "\nDAQOPSERVER not defined or wrong value!!\n";
+# 
+#     do {
+#         print("Which setup?\n");
+#         print("1  Lab317\n");
+#         print("2  Probestation\n");
+#         print("3  Lab318\n");
+#         print("4  Whatever...\n");
+#         print("Choose [1,2,3,4]: ");
+# 
+#         my $choice = <STDIN>;
+#         chomp $choice;
+# 
+#         if( $choice ne '2' and
+#             $choice ne '1' and
+#             $choice ne '4' and
+#          $choice ne '3' ) {
+#             print("Not a valid input.\n");
+#         } elsif( $choice eq '1' ) {
+#             $dos = 'jspc29:150';
+#         } elsif( $choice eq '2' ) {
+#             $dos = 'jspc29:109';
+#         } elsif( $choice eq '3' ) {
+#             $dos = 'jspc29:26';
+#         } elsif( $choice eq '4' ) {
+#             $dos = 'jspc29:7';
+#         }
+#     } while !dos_valid($dos);
+# 
+#     $ENV{'DAQOPSERVER'} = $dos;
+# 
+#     do "mimosis " . join( " ", @ARGV );
+# }
 
 
 
@@ -89,6 +94,7 @@ GLOBAL OPTIONS are:
     -c, --chipid=CHIPID  ->  Use ChIPID to address sensor.
     -u, --uart           ->  Use UART backend in TRBNet.
     -i, --ikf            ->  Use settings for IKF proxy.
+    --feb                ->  Sensor name on FEB
     -m, --mbs            ->  Set stream link for Go4analysis, like mbss://localhost:36789
     -d, --i2cspeed=VAL   ->  Use VAL as I2C speed (default: 30).
     -p, --printall       ->  Print all informations possible.
@@ -102,8 +108,10 @@ GLOBAL OPTIONS are:
     mask        Mask pixels.
     pulse       Pulse pixles.
     load        Write registers from configuration file.
-    adc
+    analog      Select analog pixel.
     vnc         Open a vncviewer with preconfigured setup.
+    adc         Read value of --channel
+    initsca     Reset & Activate SCA
 
 For every <command> a short description is accessible with the -h and --help options.
 END_MESSAGE
@@ -378,10 +386,60 @@ END_MESSAGE
 }
 
 
+sub help_analog {
+    my $message = <<'END_MESSAGE';
+
+usage: mimosis [GLOBAL OPTIONS] analog XOUT
+
+GLOBAL OPTIONS are:
+    -f, --fpga=FPGA      ->  Hex address of the FPGA. Defaults to 0xa000.
+    -s, --sleepval1=VAL  ->  Execute I2C commands with a pause of NUM microseconds in between.
+    -a, --singleaccess   ->  Select single access mode.
+    -c, --chipid=CHIPID  ->  Use ChIPID to address sensor.
+    -u, --uart           ->  Use UART backend in TRBNet.
+    -i, --ikf            ->  Use settings for IKF proxy.
+    -m, --mbs            ->  Set stream link for Go4analysis, like mbss://localhost:36789
+    -d, --i2cspeed=VAL   ->  Use VAL as I2C speed (default: 30).
+    -p, --printall       ->  Print all informations possible.
+    -h, --help           ->  Print this or <command> specific help.
+
+EXAMPLES:
+# Select pixel row 3 in range 0-1023: 
+mimosis analog 4
+# Reset analog output with 0 
+mimosis analog 0
+
+END_MESSAGE
+
+    print $message;
+    exit 0;
+}
+
+
+
 sub help_adc {
   my $message = <<'END_MESSAGE';
 
-usage: mimosis adc
+usage: mimosis adc  CHANNEL 
+
+CHANNELS: BB, TB, PT1, PT2, P6, P7, P8, PMON, IMON, VMON
+
+END_MESSAGE
+
+    print $message;
+    exit 0;
+}
+
+sub help_mux {
+  my $message = <<'END_MESSAGE';
+
+Activates one monitoring channel on VMON, IMON or PMON  
+usage: mimosis mux CHANNEL 
+
+CHANNELS: NONE, 
+          IBIAS,ITHR,IDB,
+          VRESET,VPL,VPH,VPHFINE,VCASP,VCASNA,VCASNB,VCASNC,VCASND,VCASN2,VCLIP,
+          VDD0 .. VDD7, VDA0 .. VDA7, GND0 .. GND7, AGND0 .. AGND7
 
 END_MESSAGE
 
@@ -472,6 +530,7 @@ my ( $xstartPulse,
      $modexpPulse,
     );
 
+my ($adcchannel);
 
 
 
@@ -491,8 +550,13 @@ my $res = GetOptions (
             handler => sub { Mimosis::set_sleepVal1($_[1]); }
            },
         'chipid|c=s'        => {
-            handler => sub { Mimosis::set_chipid($_[1]); },
+            handler => sub { Mimosis::set_chipid(hex($_[1])); },
            },
+        'feb=s' => {
+            handler => sub { Mimosis::set_feb($_[1]); },
+            },
+        'channel=s' => \$adcchannel,
+
         'uart|u=s'          => {
             handler => sub {
                 require("/d/jspc37/mimosis/scripts/TrbNetUart.pm");
@@ -628,14 +692,35 @@ my $res = GetOptions (
             },
         },
 
+        analog => {
+            options => {
+                'help|h' => {
+                    handler => \&help_analog,
+                }
+            },
+        },
+        
+        initsca => {
+            options => {
+                'help|h' => {
+                    handler => \&help_global,
+                }
+            },
+        },
         adc => {
             options => {
                 'help|h' => {
                     handler => \&help_adc,
                 }
             },
-        },
-
+        },        
+        mux => {
+            options => {
+                'help|h' => {
+                    handler => \&help_mux,
+                }
+            },
+        },         
         vnc => {
             options => {
                 'help|h' => {
@@ -670,7 +755,9 @@ if( $res->{subcommand}[0] eq 'default' ) {
 }
 
 
-
+if( $res->{subcommand}[0] eq 'initsca' ) {
+    Mimosis::initSca();
+}
 
 
 if( $res->{subcommand}[0] eq 'load' ) {
@@ -789,37 +876,49 @@ if( $res->{subcommand}[0] eq 'load' ) {
     }
 
 } elsif( $res->{subcommand}[0] eq 'adc' ) {
+  die "No ADC input provided\n" unless defined $ARGV[-1];
+  my $adcmap = Mimosis::getAdcMap( $ARGV[-1] );
+  
+  if (defined $adcmap) {
+    
+    my $channel = $adcmap->{channel};
+    
+    if ($adcmap->{type} eq "PT") {
+        Mimosis::writeScaRegister(0xae,0x14,0x60,1 << $channel);
+        }
+    
+    my $ret = Mimosis::adc_conversion("ADC",$channel);
+    $ret = $ret / 4.000 * $adcmap->{conversion};
+    
+    if ($adcmap->{type} eq "PT") {
+        Mimosis::writeScaRegister(0xae,0x14,0x60,0);        
+        $ret = ($ret - 100)/0.385;
+        print "$ret °C\n";
+        }
+    else {
+        print "$ret mV\n";       
+        }
+    }
+    
+} elsif( $res->{subcommand}[0] eq 'mux' ) {
+  my $mux = $ARGV[-1];
+  die "No output provided\n" unless defined $mux;
+
+  Mimosis::mimosis_register_write(0x25,0);
+  Mimosis::mimosis_register_write(0x26,0);
+  Mimosis::mimosis_register_write(0x2F,0); #doesn't do anything on M2
+
+  if ($mux ne "NONE") {  
+    my $c =  Mimosis::getMuxChannel($mux);
+    Mimosis::mimosis_register_write($c->{MONITOR},$c->{MONVAL});
+    }
 
-    my $adc_addr = 0x48;
-    my $adc_wreg = 0x1;
-    my $adc_rreg = 0x0;
-    my $adc_data = hex $ARGV[-1];
-
-    if( defined $ARGV[-1] ) {
-
-        printf("Write to ADC: 0x%04x\n", $adc_data);
-
-        Mimosis::adc_i2c_command (
-            $adc_addr,
-            $adc_wreg,
-            $adc_data,
-            0, 0, 1
-           );
-
-    } else {
+  
+} elsif( $res->{subcommand}[0] eq 'analog' ) {
 
-       my $adcConv = ( 2 * 4096 ) / 2**16;
-
-        # printf( "0x%04x\n",
-        printf( "%f\n",
-                Mimosis::adc_i2c_command(
-                  $adc_addr,
-                  $adc_rreg,
-                  0,
-                  1,0,1
-               )*$adcConv
-           );
-    }
+    Mimosis::mimosis_analog( 
+        xout => hex($ARGV[-1]) 
+);
 
 } elsif( $res->{subcommand}[0] eq 'vnc' ) {
 
index 119b82214975691be13834bfed88bebe8d821985..fdd7c5bfbecd23cfef26f9454096d9ad4cd1460d 100755 (executable)
@@ -41,9 +41,35 @@ XSLoader::load('Mimosis', $VERSION);
 
 # Preloaded methods go here.
 
-
-my $fpga = 0xa000;
+our $mapping = {
+"BUH00" => {id => 0, dat => 0, rst => 31, vmon =>  4, imon =>  3, pmon =>  5, i2c => 1, links => 8},
+"BUH01" => {id => 1, dat => 1, rst => 31, vmon =>  1, imon =>  0, pmon =>  2, i2c => 1, links => 8},
+"BUH10" => {id => 0, dat => 2, rst => 30, vmon => 10, imon =>  9, pmon => 11, i2c => 0, links => 8},
+"BUH11" => {id => 1, dat => 3, rst => 30, vmon =>  7, imon =>  6, pmon =>  8, i2c => 0, links => 8},
+"BUV00" => {id => 0, dat => 4, rst => 29, vmon => 16, imon => 15, pmon => 17, i2c => 7, links => 8},
+"BUV01" => {id => 1, dat => 5, rst => 29, vmon => 13, imon => 12, pmon => 14, i2c => 7, links => 4},
+"BUV10" => {id => 0, dat => 6, rst => 27, vmon => 18, imon => 18, pmon => 23, i2c => 5, links => 8},
+"BUV11" => {id => 1, dat => 7, rst => 27, vmon => 18, imon => 18, pmon => 20, i2c => 5, links => 4},
+};
+
+our $adcmapping = {
+"BUBB"  => {channel => 30, conversion => 1, type =>"Bias"},
+"BUTB"  => {channel => 29, conversion => 7.25, type => "Bias"},
+"BUPT1" => {channel => 25, conversion => 1, type => "PT"},
+"BUPT2" => {channel => 24, conversion => 1, type => "PT"},
+"BUP6"  => {channel => 27, conversion => 1, type => "P"},
+"BUP7"  => {channel => 26, conversion => 1, type => "P"},
+"BUP8"  => {channel => 28, conversion => 1, type => "P"},
+
+"PMON"  => {channel => -1, conversion => 2, type => "Bias"},
+"IMON"  => {channel => -1, conversion => 2, type => "Bias"},
+"VMON"  => {channel => -1, conversion => 2, type => "Bias"},
+};
+
+
+my $fpga = 0xffff;
 my $chipid = 0x1;
+my $i2cchannel = 0;
 my $singleAccess = 0;
 my $sleepVal1 = 1000;
 my $sleepVal2 = 1000000;
@@ -77,7 +103,7 @@ my $adcConv = ( 2 * 4096 ) / 2**16;
 
 my $collect_i2c_errors = 0;
 
-
+my $sensorInfo;
 
 sub set_fpga {
   $fpga = $_[0] if defined $_[0];
@@ -89,10 +115,14 @@ sub get_fpga {
     return $fpga }
 
 sub set_chipid {
-  $chipid = $_[0] if defined $_[0];
+  if (defined $_[0]) {
+    $chipid      = $_[0] & 0xf;
+    $i2cchannel  = -1;
+    $i2cchannel  = ($_[0] >> 4) & 0xf   if ($_[0] >> 4);
+  }
 }
 
-sub get_chipid { return $chipid; }
+sub get_chipid { return $chipid + ($i2cchannel << 4); }
 
 sub set_singleAccess {
   $singleAccess = $_[0] if defined $_[0];
@@ -126,6 +156,13 @@ sub get_fpgaHub {
     return $fpgaHub }
 
 
+sub set_feb {    
+  my $code = shift @_;
+  die "FEB sensor name unknown\n" unless $mapping->{$code};
+  $sensorInfo = $mapping->{$code};
+  $sensorInfo->{name} = $code;
+  set_chipid(0x100 + ($sensorInfo->{i2c} << 4) + $sensorInfo->{id});
+  }
 
 
 sub set_mbsStream {
@@ -168,7 +205,6 @@ sub make_require {
 }
 
 
-
 sub set_collect_i2c_errors {
     $collect_i2c_errors = $_[0] if defined $_[0];
 }
@@ -176,7 +212,7 @@ sub set_collect_i2c_errors {
 sub get_collect_i2c_errors { return $collect_i2c_errors; }
 
 
-our %DAC = (
+my %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, },
@@ -194,7 +230,23 @@ our %DAC = (
     IBUFBIAS => { ADDR => 0x4e, MONITOR => undef, MONVAL => undef, TYPE => 'CURRENT', RESET => 0x7d, },
    );
 
-
+sub writeScaRegister {
+  my ($tid,$channel,$command,$value) = @_;
+  trb_register_write_mem( $fpga, 0xd602, 0, [($command << 16) + ($channel << 8) + $tid, $value, 0x4], 3);
+  usleep(10000);
+  
+}
+   
+sub initSca {
+  trb_register_write( $fpga, 0xd600, 0);   
+  trb_register_write( $fpga, 0xd604, 0x2); #connect 
+  usleep(10000);
+  trb_register_write( $fpga, 0xd604, 0x1); #reset
+  usleep(10000);
+  writeScaRegister(0x11,0,0x2,0xfc000000);
+  writeScaRegister(0x11,0,0x4,0xff000000);
+  writeScaRegister(0x11,0,0x6,0x17000000);
+}
 
 sub mimosis_trb_reset {
 
@@ -257,6 +309,63 @@ sub get_i2c_errors {
 }
 
 
+sub getMuxChannel {
+  my $chan = shift @_;
+  if(defined $DAC{$chan}) {
+     return $DAC{$chan};
+  }
+  
+  my ($p,$i) = $chan =~ /^([A-Z]+)([0-9a-f])$/;
+  die "No valid mux channel provided" unless defined $p && defined $i;
+  
+  my $val = hex($i);
+     $val += 0x10 if ($p eq 'VDD');
+     $val += 0x30 if ($p eq 'VDA');
+     $val += 0x00 if ($p eq 'GND');
+     $val += 0x20 if ($p eq 'AGND');
+  my $ret = {MONITOR => 0x2f, MONVAL => $val};
+  return $ret;
+   #IBIAS => { ADDR => 0x40, MONITOR => 0x25, MONVAL => 1, TYPE => 'CURRENT', RESET => 0x40, },
+}
+
+sub getAdcMap {
+  my $chan = shift @_;
+  if($chan eq "PMON" || $chan eq "IMON" || $chan eq "VMON") {
+    $adcmapping->{$chan}{channel} = $sensorInfo->{pmon}  if($chan eq "PMON");
+    $adcmapping->{$chan}{channel} = $sensorInfo->{imon}  if($chan eq "IMON");
+    $adcmapping->{$chan}{channel} = $sensorInfo->{vmon}  if($chan eq "VMON");  
+    }
+  else {  
+    $chan = substr($sensorInfo->{name},0,2).$chan ;
+    die "No such ADC channel" unless defined $adcmapping->{$chan};
+    }
+  return $adcmapping->{$chan};  
+}
+
+sub adc_conversion {
+  my ($type,$dac) = @_;
+  
+  if($i2cchannel == -1) {
+    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 );
+    return $raw;
+    }
+    
+  else {
+    my $channel = $dac;
+       $channel = $sensorInfo->{vmon} if($type eq 'DAC') && $Mimosis::DAC{$dac}{'TYPE'} eq "VOLTAGE";
+       $channel = $sensorInfo->{imon} if($type eq 'DAC') && $Mimosis::DAC{$dac}{'TYPE'} eq "CURRENT";
+    die "no valid ADC channel: $channel" unless ($channel =~ /^\d+$/);
+    
+    writeScaRegister(0xac,0x14,0x50,$channel);
+    getSCAStatus() if $printall;  
+    writeScaRegister(0xad,0x14,0x02,1);
+    return getSCAStatus() & 0xfff;
+
+    }
+}
 
 sub adc_i2c_command {
 
@@ -269,7 +378,7 @@ sub adc_i2c_command {
       $wordByte
      ) = @_;
 
-    my $regData =
+    my $regData = 
       ( $data << 16 ) + ( $cmd << 8 ) + 0x80 + $addr;
 
     my $regFlag =
@@ -311,79 +420,116 @@ sub adc_i2c_command {
 
 sub mimosis_i2c_command {
 
-    my (
-      $addr,
-      $cmd,
-      $data,
-      $rw,
-      $skipCmd,
-      $wordByte
-     ) = @_;
-
-    # print "$_\t" foreach @_;
-    # print "\n";
+  my (
+    $addr,
+    $cmd,
+    $data,
+    $rw,
+    $skipCmd,
+    $wordByte
+    ) = @_;
 
-    my $regData =
-      ( $data << 16 ) + ( $cmd << 8 ) + ( $addr << 1 );
-
-    my $regFlag =
-      ( $rw << 8 ) + ( $skipCmd << 4 ) + $wordByte;
+  if($i2cchannel ==-1) {
+  
+    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);
 
-        trb_register_write_mem(
-          $fpga,
-          $trbMimRegWrMem,
-          0,
-          [ $regFlag, $regData, 0x1 ],
-          3 );
-
-        usleep($sleepVal1);
-
-        $regBuf =
-          trb_register_read( $fpga, $trbMimRegRdMem );
+      $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);
+      trb_register_write_mem(
+        $fpga,
+        $trbMimRegWrMem,
+        0,
+        [ $regFlag, $regData, 0x1 ],
+        3 );
+      usleep($sleepVal1);
 
+      $regBuf = trb_register_read( $fpga, $trbMimRegRdMem );
     }
 
     if ( $printall ) {
-
-        my $status =
-          (($regBuf->{$fpga}//0) >> 16 ) & 0xff;
-        printf("I2CStatus: 0x%02x\n", $status);
+      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;
+      }
+      else {
+        return $regBuf->{(keys %$regBuf)[0]};
+      }
+    }
+  }
+  else {
+    my $regAddr = $addr << 24;
+
+    my $regData = ($cmd << 24) + ($data << 8)   if ($skipCmd == 0 && $wordByte == 1);
+       $regData = ($data << 16)                 if ($skipCmd == 1 && $wordByte == 1);
+       $regData = ($cmd << 24) + ($data << 16)  if ($skipCmd == 0 && $wordByte == 0);
+       $regData = ($data << 24)                 if ($skipCmd == 1 && $wordByte == 0);    
+    my $regLength = 3 if ($skipCmd == 0 && $wordByte == 1);
+       $regLength = 2 if ($skipCmd == 1 && $wordByte == 1);
+       $regLength = 2 if ($skipCmd == 0 && $wordByte == 0);
+       $regLength = 1 if ($skipCmd == 1 && $wordByte == 0);
+
+       
+    my $channel = ($i2cchannel & 0xf) + 3;
+
+    printf( "Channel: %02x\tAddress %02x\tData %08x\tLength %x\n", $channel, $addr, $regData, $regLength ) if $printall;    
+    
+    if ( $rw == 0 ) {
+      my $SCAdata = $regLength << 26;
+      writeScaRegister(0x1,$channel,0x30,$SCAdata);
+      getSCAStatus() if $printall;
+
+      writeScaRegister(0x2,$channel,0x40,$regData);
+      getSCAStatus() if $printall;
+      
+      writeScaRegister(0x3,$channel,0xda,$regAddr);
+      getSCAStatus() if $printall;
+    }  
+    
     if ( $rw == 1 ) {
-
-        if ($fpga < 0xfe00)
-        {
-          return $regBuf->{$fpga} & 0xffff;
-        }
+      writeScaRegister(0xa,$channel,0x86,$regAddr);
+      return (getSCAStatus() >> 16) & 0xff;     
     }
-
+  }
 }
 
-
+sub getSCAStatus {
+  usleep(1000);
+  my $ret = trb_register_read_mem($fpga,0xd60a,0,3);
+  $fpga = (keys %$ret)[0] if $fpga >= 0xfe00;
+  $ret = $ret->{$fpga};
+  
+  printf("Address 0x%02x\tControl 0x%02x\tTransID 0x%02x\tChannel 0x%02x\tError  0x%02x\tLength 0x%02x\tData 0x%08x\n", 
+              ($ret->[0] >> 0) & 0xff, 
+              ($ret->[0] >> 8) & 0xff, 
+              ($ret->[1] >> 0) & 0xff, 
+              ($ret->[1] >> 8) & 0xff, 
+              ($ret->[1] >> 16) & 0xff, 
+              ($ret->[1] >> 24) & 0xff, 
+              ($ret->[2]))  
+            if $printall;
+  return $ret->[2];
+}
 
 
 sub mimosis_register_write {
@@ -468,7 +614,7 @@ sub mimosis_instr_write {
     # CHIPID???
     trb_register_write_mem(
       $fpga, $trbMimRegWrMem, 0,
-      [ 0x0, ( $cmd << 8 ) + ( 0x11 << 1 ), 0x1 ],
+      [ 0x0, ( $cmd << 8 ) + ($chipid<< 5) + ( 0x1 << 1 ), 0x1 ],
       3 );
 
      usleep($sleepVal1);
@@ -586,23 +732,15 @@ sub mimosis_scan_single_dac {
 
         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 );
+        my $raw = adc_conversion("DAC",$dac);
 
+        $raw = $raw * $adcConv  if $i2cchannel == -1;
+        $raw = $raw / 2         if $i2cchannel >= 0;
+        
         printf( FH "%x\t%d\t%f\n",
-                $Mimosis::DAC{$dac}{'ADDR'}, $set, $raw * $adcConv );
+                $Mimosis::DAC{$dac}{'ADDR'}, $set, $raw );
 
-        push ( @resVals, $raw*$adcConv );
+        push ( @resVals, $raw );
         push ( @resTicks, $set );
     }
 
@@ -717,7 +855,7 @@ sub mimosis_select_pixel {
 
         my $regAddY = $y/8;
         my $regBitY = 1<<( $y % 8 );
-        my $regWordY = ($regAddY<<8) + 0x84;
+        my $regWordY = ($regAddY << 8) + 0x84;
 
         mimosis_register_write($regWordY, $regBitY );
 
@@ -747,15 +885,15 @@ sub mimosis_select_pixel {
 
                 if($word82 == $word81) {
 
-                    my $addr = ($currRegX<<8) + 0x83;
+                    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;
+                    my $addr81 = ($currRegX << 8) + 0x81;
+                    my $addr82 = ($currRegX << 8) + 0x82;
 
                     mimosis_register_write( $addr81, $word81 );
                     mimosis_register_write( $addr82, $word82 );
@@ -850,6 +988,7 @@ sub mimosis_scan_rows {
         mimosis_loop_vph(
             $mbsStream, # source
             $fpga, # fpga
+           $chipid,
             $singleAccess, # sa
             $yLow, # yLow
             $yHigh, # yHig
@@ -1074,6 +1213,13 @@ sub mimosis_pulse {
        );
 }
 
+sub mimosis_analog {
+    my %params = @_;
+    my $xout = $params{'xout'};
+    #die "Invalid xout. 0 <= xout <= 1024." if ($xout > 1024 || $xout < 0);
+    mimosis_register_write(0x8020, $xout & 0x00FF );
+    mimosis_register_write(0x8021, ($xout & 0xFF00)>>8 );
+}
 
 
 1;