diff --git a/src/epics/util/feCodeGen.pl b/src/epics/util/feCodeGen.pl index 58990f43247be5bb6cae7cb9f427e5404cdbd4e3..a9708fd1c6a6101955a764ce737d6d63e34515d6 100755 --- a/src/epics/util/feCodeGen.pl +++ b/src/epics/util/feCodeGen.pl @@ -155,6 +155,7 @@ $requireIOcnt = 0; #Following provide for non standard IOP clock rates $adcclock = 64; $modelrate = 64; +$servoflag = "-DSERVO64K"; $clock_div = 1; # Load model name without .mdl extension. @@ -1474,7 +1475,7 @@ for($ii=0;$ii<$partCnt;$ii++) #$gdsXstart = ($dcuId - 5) * 1250; #$gdsTstart = $gdsXstart + 10000; - if($rate == 480 || $rate == 240) { + if($modelrate == 2 || $modelrate == 4) { $gdsXstart = 20001; $gdsTstart = 30001; } else { @@ -2213,23 +2214,7 @@ sub debug { #// \b sub \b get_freq \n #// Determine user code sample rate \n\n sub get_freq { - if($rate == 480) { - return 2*1024; - } elsif ($rate == 240) { - return 4*1024; - } elsif ($rate == 60) { - return 16*1024; - } elsif ($rate == 30) { - return 32*1024; - } elsif ($rate == 15) { - return 64*1024; - } elsif ($rate == 4) { - return 256*1024; - } elsif ($rate == 2) { - return 512*1024; - } elsif ($rate == 1) { - return 1024*1024; - } + return $modelrate * 1024; } #// \b sub \b init_vars \n @@ -2450,16 +2435,7 @@ print OUTM "KBUILD_EXTRA_SYMBOLS += \$(PWD)/ModuleIOP.symvers\n"; print OUTM "ALL \+= user_mmap \$(TARGET_RTL)\n"; print OUTM "EXTRA_CFLAGS += -O -w -I../../include\n"; -if($rate == 480) { print OUTM "EXTRA_CFLAGS += -DSERVO2K\n"; } -elsif($rate == 240) { print OUTM "EXTRA_CFLAGS += -DSERVO4K\n"; } -elsif($rate == 60) { print OUTM "EXTRA_CFLAGS += -DSERVO16K\n"; } -elsif($rate == 30) { print OUTM "EXTRA_CFLAGS += -DSERVO32K\n"; } -elsif($rate == 15) { print OUTM "EXTRA_CFLAGS += -DSERVO64K\n"; } -elsif($rate == 7) { print OUTM "EXTRA_CFLAGS += -DSERVO128K\n"; } -elsif($rate == 4) { print OUTM "EXTRA_CFLAGS += -DSERVO256K\n"; } -elsif($rate == 2) { print OUTM "EXTRA_CFLAGS += -DSERVO512K\n"; } -elsif($rate == 1) { print OUTM "EXTRA_CFLAGS += -DSERVO1024K\n"; } - +print OUTM "EXTRA_CFLAGS += $servoflag \n"; print OUTM "EXTRA_CFLAGS += -D"; print OUTM "\U$skeleton"; @@ -2505,24 +2481,6 @@ if ($no_daq) { # SHMEM_DAQ set as the default for RCG V2.8 - No longer support GM print OUTM "#Comment out to disable local frame builder connection\n"; print OUTM "EXTRA_CFLAGS += -DSHMEM_DAQ\n"; - -# Use oversampling code if not 64K system -if($rate > 15) { - if ($no_oversampling) { - print OUTM "#Uncomment to oversample A/D inputs\n"; - print OUTM "#EXTRA_CFLAGS += -DOVERSAMPLE\n"; - print OUTM "#Uncomment to interpolate D/A outputs\n"; - print OUTM "#EXTRA_CFLAGS += -DOVERSAMPLE_DAC\n"; - } else { - print OUTM "#Comment out to stop A/D oversampling\n"; - print OUTM "EXTRA_CFLAGS += -DOVERSAMPLE\n"; - if ($no_dac_interpolation) { - } else { - print OUTM "#Comment out to stop interpolating D/A outputs\n"; - print OUTM "EXTRA_CFLAGS += -DOVERSAMPLE_DAC\n"; - } - } -} # Set to flip polarity of ADC input signals if ($flipSignals) { print OUTM "EXTRA_CFLAGS += -DFLIP_SIGNALS=1\n"; @@ -2619,7 +2577,25 @@ if ($adcSlave > -1) { #************ SETUP FOR USER APP *************** if ($::noZeroPad) { print OUTM "EXTRA_CFLAGS += -DNO_ZERO_PAD=1\n"; } + +# Use oversampling code if not 64K system +if($modelrate < 64) { + if ($no_oversampling) { + print OUTM "#Uncomment to oversample A/D inputs\n"; + print OUTM "#EXTRA_CFLAGS += -DOVERSAMPLE\n"; + print OUTM "#Uncomment to interpolate D/A outputs\n"; + print OUTM "#EXTRA_CFLAGS += -DOVERSAMPLE_DAC\n"; + } else { + print OUTM "#Comment out to stop A/D oversampling\n"; + print OUTM "EXTRA_CFLAGS += -DOVERSAMPLE\n"; + if ($no_dac_interpolation) { + } else { + print OUTM "#Comment out to stop interpolating D/A outputs\n"; + print OUTM "EXTRA_CFLAGS += -DOVERSAMPLE_DAC\n"; + } + } } +} #******************* END SETUP FOR USER APP @@ -2655,15 +2631,7 @@ print OUTM "# User Space Linux\n"; print OUTM "CFLAGS += -O -w -I../../include\n"; print OUTM "CFLAGS += -I/opt/mx/include\n"; -if($rate == 480) { print OUTM "CFLAGS += -DSERVO2K\n"; } -elsif($rate == 240) { print OUTM "CFLAGS += -DSERVO4K\n"; } -elsif($rate == 60) { print OUTM "CFLAGS += -DSERVO16K\n"; } -elsif($rate == 30) { print OUTM "CFLAGS += -DSERVO32K\n"; } -elsif($rate == 15) { print OUTM "CFLAGS += -DSERVO64K\n"; } -elsif($rate == 7) { print OUTM "CFLAGS += -DSERVO128K\n"; } -elsif($rate == 4) { print OUTM "CFLAGS += -DSERVO256K\n"; } -elsif($rate == 2) { print OUTM "CFLAGS += -DSERVO512K\n"; } -elsif($rate == 1) { print OUTM "CFLAGS += -DSERVO1024K\n"; } +print OUTM "EXTRA_CFLAGS += $servoflag \n"; print OUTM "CFLAGS += -D"; print OUTM "\U$skeleton"; @@ -2704,7 +2672,7 @@ if ($no_daq) { print OUTM "CFLAGS += -DSHMEM_DAQ\n"; # Use oversampling code if not 64K system -if($rate > 15) { +if($modelrate < 64) { if ($no_oversampling) { print OUTM "#Uncomment to oversample A/D inputs\n"; print OUTM "#CFLAGS += -DOVERSAMPLE\n"; diff --git a/src/epics/util/lib/Parameters.pm b/src/epics/util/lib/Parameters.pm index e69d629bde24f41ee4a7674d5529ba514d6fc0bb..b0d709ecc4056fff3ec44e480d3f7bcbac24b7bb 100644 --- a/src/epics/util/lib/Parameters.pm +++ b/src/epics/util/lib/Parameters.pm @@ -62,29 +62,40 @@ sub parseParams { my $param_speed = $spp[1]; if ($param_speed eq "2K") { $::rate = 480; + $::modelrate = 2; + $::servoflag = "-DSERVO2K"; } elsif ($param_speed eq "4K") { $::rate = 240; + $::modelrate = 4; + $::servoflag = "-DSERVO4K"; } elsif ($param_speed eq "16K") { $::rate = 60; $::modelrate = 16; + $::servoflag = "-DSERVO16K"; } elsif ($param_speed eq "32K") { $::rate = 30; $::modelrate = 32; + $::servoflag = "-DSERVO32K"; } elsif ($param_speed eq "64K") { $::rate = 15; $::modelrate = 64; + $::servoflag = "-DSERVO64K"; } elsif ($param_speed eq "128K") { $::rate = 8; $::modelrate = 128; + $::servoflag = "-DSERVO128K"; } elsif ($param_speed eq "256K") { $::rate = 4; $::modelrate = 256; + $::servoflag = "-DSERVO256K"; } elsif ($param_speed eq "512K") { $::rate = 2; $::modelrate = 512; + $::servoflag = "-DSERVO512K"; } elsif ($param_speed eq "1024K") { $::rate = 1; $::modelrate = 1024; + $::servoflag = "-DSERVO1024K"; } else { die "Invalid speed $param_speed specified\n"; } } elsif ($spp[0] eq "dcuid") { diff --git a/src/fe/mapApp.c b/src/fe/mapApp.c index 1f9d5de8dc49502e612ac71f32fce3f624de0b01..4b1a50f56c55829fed13abc6fb77d766c277da0b 100644 --- a/src/fe/mapApp.c +++ b/src/fe/mapApp.c @@ -47,6 +47,17 @@ mapPciModules( CDS_HARDWARE* pCds ) status++; } break; + case GSC_18AI32SSC1M: + if ( ( pCds->cards_used[ jj ].type == GSC_18AI32SSC1M ) && + ( pCds->cards_used[ jj ].instance == adcCnt ) ) + { + kk = pCds->adcCount; + pCds->adcType[ kk ] = GSC_18AI32SSC1M; + pCds->adcConfig[ kk ] = ioMemData->ipc[ ii ]; + pCds->adcCount++; + status++; + } + break; case GSC_16AO16: if ( ( pCds->cards_used[ jj ].type == GSC_16AO16 ) && ( pCds->cards_used[ jj ].instance == dacCnt ) ) @@ -167,6 +178,8 @@ mapPciModules( CDS_HARDWARE* pCds ) } if ( ioMemData->model[ ii ] == GSC_16AI64SSA ) adcCnt++; + if ( ioMemData->model[ ii ] == GSC_18AI32SSC1M ) + adcCnt++; if ( ioMemData->model[ ii ] == GSC_16AO16 ) dacCnt++; if ( ioMemData->model[ ii ] == GSC_18AO8 ) diff --git a/src/include/controller.h b/src/include/controller.h index c8b4bea3123a50df499ec089dd97d6b21b44febf..33a0734583a2ec0aa1cb8f1ce78d5a4fe466df64 100644 --- a/src/include/controller.h +++ b/src/include/controller.h @@ -136,6 +136,8 @@ char fp[ 64 * 1024 ]; #define DAQ_RATE ( DAQ_16K_SAMPLE_SIZE * 8 ) #define NET_SEND_WAIT 655360 #define CYCLE_TIME_ALRM 7 +#define CYCLE_TIME_ALRM_HI 9 +#define CYCLE_TIME_ALRM_LO 1 #define EPICS_128_SYNC 1024 #define DAC_PRELOAD_CNT 0 #endif diff --git a/src/include/drv/fm10Gen.c b/src/include/drv/fm10Gen.c index 56002e93aa26e9bf6191dccff24fa6df726ec7f3..0f498eee420452594b843aae0f33acc1140f668c 100644 --- a/src/include/drv/fm10Gen.c +++ b/src/include/drv/fm10Gen.c @@ -103,6 +103,9 @@ double twoKAvgCoeff[ 9 ] = { 7.705446e-9, -1.97673337437048, #ifdef SERVO256K #define FE_RATE 262144 #endif +#ifdef SERVO128K +#define FE_RATE 131072 +#endif #ifdef SERVO64K #define FE_RATE 65536 #endif diff --git a/src/include/drv/iop_adc_functions.c b/src/include/drv/iop_adc_functions.c index 1526aa03a615c44e6cc9e82a838951df0f36f9f6..70cf9816a22d606aadc6bd0ef365ffdcb276a153 100644 --- a/src/include/drv/iop_adc_functions.c +++ b/src/include/drv/iop_adc_functions.c @@ -102,7 +102,7 @@ sync_adc_2_1pps( ) inline int iop_adc_read( adcInfo_t* adcinfo, int cpuClk[] ) { - int kk; + int ii,kk; volatile int* packedData; int limit; int mask; @@ -256,6 +256,15 @@ iop_adc_read( adcInfo_t* adcinfo, int cpuClk[] ) // dWord is the double representation of the ADC data // This is the value used by the rest of the code calculations. dWord[ card ][ chan ][ kk ] = adcinfo->adcData[ card ][ chan ]; + // If running with fast ADC at 512K and gsc16ai64 at 64K, then: + // fill in the missing data by doing data copy + if ( cdsPciModules.adcType[ card ] == GSC_16AI64SSA && + UNDERSAMPLE > 4 ) + { + for ( ii = 1; ii < UNDERSAMPLE; ii++ ) + dWord[ card ][ chan ][ ii ] = + adcinfo->adcData[ card ][ chan ]; + } /// - ---- Load ADC value into ipc memory buffer ioMemData->iodata[ card ][ ioMemCntr ].data[ chan ] = adcinfo->adcData[ card ][ chan ]; @@ -272,14 +281,31 @@ iop_adc_read( adcInfo_t* adcinfo, int cpuClk[] ) packedData++; } + // For normal IOP ADC undersampling ie not a mixed fast 512K adc and + // normal 64K adc + if ( UNDERSAMPLE < 5 ) + { + /// - ---- Write GPS time and cycle count as indicator to slave + /// that adc data is ready + ioMemData->gpsSecond = timeSec; + ioMemData->iodata[ card ][ ioMemCntr ].timeSec = timeSec; + ioMemData->iodata[ card ][ ioMemCntr ].cycle = iocycle; + ioMemCntr++; + iocycle++; + iocycle %= 65536; + } + + } + + // For ADC undersampling when running with a fast ADC at 512K + // to limit rate to user apps at 64K + if ( UNDERSAMPLE > 4 ) + { /// - ---- Write GPS time and cycle count as indicator to slave that /// adc data is ready ioMemData->gpsSecond = timeSec; ioMemData->iodata[ card ][ ioMemCntr ].timeSec = timeSec; ioMemData->iodata[ card ][ ioMemCntr ].cycle = iocycle; - ioMemCntr++; - iocycle++; - iocycle %= 65536; } /// - ---- Clear out last ADC data read for test on next cycle