diff --git a/src/epics/util/feCodeGen.pl b/src/epics/util/feCodeGen.pl index d7b5f38c01936ee25659957582d8bfedab62a76f..82ed1f28d3616e36dba35433a5ee17e10f6c9350 100755 --- a/src/epics/util/feCodeGen.pl +++ b/src/epics/util/feCodeGen.pl @@ -2207,7 +2207,7 @@ close($fg); for($ii=0;$ii<$adcCnt;$ii++) { - ("CDS::Adc::createAdcMedm") -> ($epicsScreensDir,$sysname,$usite,$dcuId,$medmTarget,$ii,@adcScreen); + ("CDS::Adc::createAdcMedm") -> ($epicsScreensDir,$sysname,$adcMaster,$usite,$dcuId,$medmTarget,$ii,@adcScreen); } # ****************************************************************************************** #// - GENERATE DAC SCREENS diff --git a/src/epics/util/lib/Adc.pm b/src/epics/util/lib/Adc.pm index 31b118ba1fd072dc82867e993107360f1ec1d74e..ee8dfbbfa06463a0f5bb9c25ffecddabbd8788f6 100644 --- a/src/epics/util/lib/Adc.pm +++ b/src/epics/util/lib/Adc.pm @@ -172,7 +172,7 @@ sub frontEndCode { #// This code requires /lib/medmGen.pm \n\n sub createAdcMedm { - my ($medmDir,$mdlName,$site,$dcuid,$medmTarget,$adcNum,@adcChannel) = @_; + my ($medmDir,$mdlName,$adcMaster,$site,$dcuid,$medmTarget,$adcNum,@adcChannel) = @_; # Define colors to be sent to screen gen. my %ecolors = ( "white" => "0", "black" => "14", @@ -195,7 +195,7 @@ sub createAdcMedm print "creating file $medmDir\/$fname \n"; open(OUTMEDM, ">$medmDir/$fname") || die "cannot open $medmDir/$fname for writing "; - my $xpos = 0; my $ypos = 0; my $width = 1000; my $height = 440; + my $xpos = 0; my $ypos = 0; my $width = 1000; my $height = 550; $medmdata = ("CDS::medmGen::medmGenFile") -> ($medmDir,$file,$width,$height); # ************* Create Banner ****************************************************************************** @@ -272,6 +272,34 @@ sub createAdcMedm } $ypos += 20; } +#Add ADC Status Info + $xpos = 13; $ypos = 435; $width = 975; $height = 110; + $medmdata .= ("CDS::medmGen::medmGenRectangle") -> ($xpos,$ypos,$width,$height,$ecolors{gray},"","",""); + $xpos = 50; $ypos = 440; $width = 140; $height = 15; + $medmdata .= ("CDS::medmGen::medmGenText") -> ($xpos,$ypos,$width,$height,"ADC STATUS",$ecolors{black}); + + $xpos = 60; $ypos = 460; $width = 140; $height = 15; + $medmdata .= ("CDS::medmGen::medmGenText") -> ($xpos,$ypos,$width,$height,"ADC MAPPED",$ecolors{black}); + $xpos = 60; $ypos = 480; $width = 140; $height = 15; + $medmdata .= ("CDS::medmGen::medmGenText") -> ($xpos,$ypos,$width,$height,"ADC CHANNEL HOP",$ecolors{black}); + $xpos = 60; $ypos = 500; $width = 140; $height = 15; + $medmdata .= ("CDS::medmGen::medmGenText") -> ($xpos,$ypos,$width,$height,"ADC OVERFLOW ",$ecolors{black}); + if($adcMaster == 1) { + $xpos = 60; $ypos = 520; $width = 140; $height = 15; + $medmdata .= ("CDS::medmGen::medmGenText") -> ($xpos,$ypos,$width,$height,"ADC AUTOCAL ",$ecolors{black}); + } + + $xpos = 250; $ypos = 460; $width = 40; $height = 15; + $medmdata .= ("CDS::medmGen::medmGenByte") -> ($xpos,$ypos,$width,$height,"$site\:FEC-$dcuid\_ADC_STAT_$adcNum","0","0",$ecolors{green},$ecolors{red}); + $xpos = 250; $ypos = 480; $width = 40; $height = 15; + $medmdata .= ("CDS::medmGen::medmGenByte") -> ($xpos,$ypos,$width,$height,"$site\:FEC-$dcuid\_ADC_STAT_$adcNum","1","1",$ecolors{green},$ecolors{red}); + $xpos = 250; $ypos = 500; $width = 40; $height = 15; + $medmdata .= ("CDS::medmGen::medmGenByte") -> ($xpos,$ypos,$width,$height,"$site\:FEC-$dcuid\_ADC_STAT_$adcNum","2","2",$ecolors{green},$ecolors{red}); + + if($adcMaster == 1) { + $xpos = 250; $ypos = 520; $width = 40; $height = 15; + $medmdata .= ("CDS::medmGen::medmGenByte") -> ($xpos,$ypos,$width,$height,"$site\:FEC-$dcuid\_ADC_STAT_$adcNum","3","3",$ecolors{green},$ecolors{red}); + } print OUTMEDM "$medmdata \n"; close OUTMEDM; diff --git a/src/epics/util/lib/medmGenGdsTp.pm b/src/epics/util/lib/medmGenGdsTp.pm index 18467c77d580514842ace1eb09cc6ac4b24c3665..d09d5e38e454dec5bf724b10069477cb9bb253ff 100644 --- a/src/epics/util/lib/medmGenGdsTp.pm +++ b/src/epics/util/lib/medmGenGdsTp.pm @@ -435,11 +435,18 @@ sub createGdsMedm $mdlNamelc = lc($mdlName); $xpos = 205; $ypos = 200; $width = 40; $height = 20; $bxpos = 255; $bypos = 201; $bwidth = 21; $bheight = 18; + if($adcMaster == 1) { + $bxpos = 255; $bypos = 201; $bwidth = 28; $bheight = 18; + } for($ii=0;$ii<$adcCnt;$ii++) { $relDisp = "$medmTarget\/$mdlNamelc\/$mdlName\_MONITOR_ADC$::adcCardNum[$ii].adl"; $medmdata .= ("CDS::medmGen::medmGenRelDisp") -> ($xpos,$ypos,$width,$height,$relDisp,$ecolors{white},$ecolors{brown},"A$::adcCardNum[$ii]"); + if($adcMaster == 1) { + $medmdata .= ("CDS::medmGen::medmGenByte") -> ($bxpos,$bypos,$bwidth,$bheight,"$site\:FEC-$dcuid\_ADC_STAT_$ii","0","3",$ecolors{green},$ecolors{red}); + } else { $medmdata .= ("CDS::medmGen::medmGenByte") -> ($bxpos,$bypos,$bwidth,$bheight,"$site\:FEC-$dcuid\_ADC_STAT_$ii","0","2",$ecolors{green},$ecolors{red}); + } $ypos += 22; $bypos += 22; $totalCards ++; diff --git a/src/fe/map.c b/src/fe/map.c index 6748d207445cd926841ac03666f9faf2645aa811..0aa492e590fab1e0179dfc67ced20608aed15d99 100644 --- a/src/fe/map.c +++ b/src/fe/map.c @@ -110,11 +110,12 @@ mapPciModules( CDS_HARDWARE* pCds ) } if ( use_it ) { - printk( "18-bit dac card on bus %x; device %x\n", - dacdev->bus->number, - PCI_SLOT( dacdev->devfn ) ); status = gsc18ao8Init( pCds, dacdev ); modCount++; + printk( "18-bit dac card on bus %x; device %x status %d\n", + dacdev->bus->number, + PCI_SLOT( dacdev->devfn ), + status ); } dac_18bit_cnt++; } @@ -139,11 +140,12 @@ mapPciModules( CDS_HARDWARE* pCds ) } if ( use_it ) { - printk( "20-bit dac card on bus %x; device %x\n", - dacdev->bus->number, - PCI_SLOT( dacdev->devfn ) ); status = gsc20ao8Init( pCds, dacdev ); modCount++; + printk( "20-bit dac card on bus %x; device %x status %d\n", + dacdev->bus->number, + PCI_SLOT( dacdev->devfn ), + status ); } dac_20bit_cnt++; } @@ -173,11 +175,12 @@ mapPciModules( CDS_HARDWARE* pCds ) } if ( use_it ) { - printk( "dac card on bus %x; device %x\n", - dacdev->bus->number, - PCI_SLOT( dacdev->devfn ) ); status = gsc16ao16Init( pCds, dacdev ); modCount++; + printk( "16 bit dac card on bus %x; device %x status %d\n", + dacdev->bus->number, + PCI_SLOT( dacdev->devfn ), + status ); } dac_cnt++; } @@ -208,13 +211,12 @@ mapPciModules( CDS_HARDWARE* pCds ) } if ( use_it ) { - /*printk("adc card on bus %x; device %x prim %x\n", - dacdev->bus->number, - PCI_SLOT(dacdev->devfn), - dacdev->bus->secondary); - */ status = gsc16ai64Init( pCds, dacdev ); modCount++; + printk("adc card on bus %x; device %x status %d\n", + dacdev->bus->number, + PCI_SLOT(dacdev->devfn), + status); } adc_cnt++; } diff --git a/src/include/drv/adc_info.c b/src/include/drv/adc_info.c index e47c0533520aa07c490415bd4aa59a33c0cea410..6a3d81fff495815fd8c2d9ed00590e104b7a67c8 100644 --- a/src/include/drv/adc_info.c +++ b/src/include/drv/adc_info.c @@ -11,22 +11,22 @@ adc_status_update( adcInfo_t* adcinfo ) // SET/CLR Channel Hopping Error if ( adcinfo->adcChanErr[ jj ] ) { - pLocalEpics->epicsOutput.statAdc[ jj ] &= ~( 2 ); + pLocalEpics->epicsOutput.statAdc[ jj ] &= ~( ADC_CHAN_HOP ); status |= FE_ERROR_ADC; ; } else - pLocalEpics->epicsOutput.statAdc[ jj ] |= 2; + pLocalEpics->epicsOutput.statAdc[ jj ] |= ADC_CHAN_HOP; adcinfo->adcChanErr[ jj ] = 0; // SET/CLR Overflow Error if ( adcinfo->adcOF[ jj ] ) { - pLocalEpics->epicsOutput.statAdc[ jj ] &= ~( 4 ); + pLocalEpics->epicsOutput.statAdc[ jj ] &= ~( ADC_OVERFLOW ); status |= FE_ERROR_OVERFLOW; ; } else - pLocalEpics->epicsOutput.statAdc[ jj ] |= 4; + pLocalEpics->epicsOutput.statAdc[ jj ] |= ADC_OVERFLOW; adcinfo->adcOF[ jj ] = 0; for ( ii = 0; ii < 32; ii++ ) { diff --git a/src/include/drv/app_adc_read.c b/src/include/drv/app_adc_read.c index 794fcf077ee4c5f3bc9665e50cb5edfff261d440..6f9af1b8c8a950a45949a34e493a9bc203ff0f52 100644 --- a/src/include/drv/app_adc_read.c +++ b/src/include/drv/app_adc_read.c @@ -82,22 +82,22 @@ app_adc_status_update( adcInfo_t* adcinfo ) // SET/CLR Channel Hopping Error if ( adcinfo->adcChanErr[ jj ] ) { - pLocalEpics->epicsOutput.statAdc[ jj ] &= ~( 2 ); + pLocalEpics->epicsOutput.statAdc[ jj ] &= ~( ADC_CHAN_HOP ); status |= FE_ERROR_ADC; ; } else - pLocalEpics->epicsOutput.statAdc[ jj ] |= 2; + pLocalEpics->epicsOutput.statAdc[ jj ] |= ADC_CHAN_HOP; adcinfo->adcChanErr[ jj ] = 0; // SET/CLR Overflow Error if ( adcinfo->adcOF[ jj ] ) { - pLocalEpics->epicsOutput.statAdc[ jj ] &= ~( 4 ); + pLocalEpics->epicsOutput.statAdc[ jj ] &= ~( ADC_OVERFLOW ); status |= FE_ERROR_OVERFLOW; ; } else - pLocalEpics->epicsOutput.statAdc[ jj ] |= 4; + pLocalEpics->epicsOutput.statAdc[ jj ] |= ADC_OVERFLOW; adcinfo->adcOF[ jj ] = 0; for ( ii = 0; ii < 32; ii++ ) { diff --git a/src/include/drv/cdsHardware.h b/src/include/drv/cdsHardware.h index c41019bdacddec63c32ba804d57ed4cb61e5f9e0..9fef3c31a89dbecdf35a3368be47759e62fa8baf 100644 --- a/src/include/drv/cdsHardware.h +++ b/src/include/drv/cdsHardware.h @@ -86,6 +86,11 @@ typedef struct CDS_REMOTE_NODES { #define DAC_DUOTONE_CHAN 30 #define ADC_BUS_DELAY 1 #define ADC_SHORT_CYCLE 2 +#define ADC_MAPPED 1 +#define ADC_CHAN_HOP 2 +#define ADC_OVERFLOW 4 +#define ADC_CAL_PASS 8 + typedef struct MEM_DATA_BLOCK{ int timeSec; diff --git a/src/include/drv/gsc16ai64.c b/src/include/drv/gsc16ai64.c index b0df4c1cb56a727cc35dd79c51a356f129b4ef6c..686c655d9dafdf14716c97c25f888c37275066f8 100644 --- a/src/include/drv/gsc16ai64.c +++ b/src/include/drv/gsc16ai64.c @@ -33,6 +33,7 @@ gsc16ai64Init( CDS_HARDWARE* pHardware, struct pci_dev* adcdev ) char* _adc_add; /// @param *_adc_add ADC register address space int pedStatus; /// @param pedStatus Status return from call to enable /// device. + int autocal = 0; /// Get index into CDS_HARDWARE struct based on total number of ADC cards /// found by mapping routine in map.c @@ -90,7 +91,17 @@ gsc16ai64Init( CDS_HARDWARE* pHardware, struct pci_dev* adcdev ) /// Wait for internal calibration to complete. do { + autocal ++; + udelay(100); } while ( ( adcPtr[ devNum ]->BCR & GSAI_AUTO_CAL ) != 0 ); + if( ( adcPtr[ devNum ]->BCR & GSAI_AUTO_CAL_PASS ) == 0 ) + { + printk("ADC AUTOCAL FAIL %d\n",autocal); + autocal = 0; + } else { + printk("ADC AUTOCAL PASS %d\n",autocal); + autocal = GSAI_AUTO_CAL_PASS; + } adcPtr[ devNum ]->RAG |= GSAI_SAMPLE_START; adcPtr[ devNum ]->IDBC = ( GSAI_CLEAR_BUFFER | GSAI_THRESHOLD ); adcPtr[ devNum ]->SSC = ( GSAI_64_CHANNEL | GSAI_EXTERNAL_SYNC ); @@ -102,6 +113,7 @@ gsc16ai64Init( CDS_HARDWARE* pHardware, struct pci_dev* adcdev ) pHardware->adcType[ devNum ] = GSC_16AI64SSA; pHardware->adcChannels[ devNum ] = GSAI_CHAN_COUNT; pHardware->adcConfig[ devNum ] = adcPtr[ devNum ]->ASSC; + pHardware->adcConfig[ devNum ] |= autocal; pHardware->adcCount++; /// Return board enable status. return ( pedStatus ); diff --git a/src/include/drv/gsc16ai64.h b/src/include/drv/gsc16ai64.h index f26d173619c5f3eb435210e25c2d606b39e1413f..ccaa86ddc82605b3c02099f6ac5e169bd780768c 100644 --- a/src/include/drv/gsc16ai64.h +++ b/src/include/drv/gsc16ai64.h @@ -55,6 +55,7 @@ typedef struct GSA_ADC_REG{ #define GSAI_CLEAR_BUFFER 0x40000 #define GSAI_THRESHOLD 0x001f #define GSAI_AUTO_CAL 0x2000 +#define GSAI_AUTO_CAL_PASS 0x4000 #define GSAI_DMA_DEMAND_MODE 0x80000 #define GSAI_18BIT_DATA 0x100000 #define GSAI_DATA_CODE_OFFSET 0x8000 diff --git a/src/include/drv/iop_adc_functions.c b/src/include/drv/iop_adc_functions.c index 8046b049dd98f92d164d15b0016f06b39625a71a..a3428cd99c76289f0ed7afed1d7b59d78ede454d 100644 --- a/src/include/drv/iop_adc_functions.c +++ b/src/include/drv/iop_adc_functions.c @@ -38,7 +38,10 @@ iop_adc_init( adcInfo_t* adcinfo ) // ie no upper bits should be set in channel 31. *adcDummyData = DUMMY_ADC_VAL; // Set ADC Present Flag - pLocalEpics->epicsOutput.statAdc[ jj ] = 1; + pLocalEpics->epicsOutput.statAdc[ jj ] = ADC_MAPPED; + // Set ADC AutoCal Pass/Fail Flag + if((cdsPciModules.adcConfig [ jj ] & GSAI_AUTO_CAL_PASS) != 0) + pLocalEpics->epicsOutput.statAdc[ jj ] |= ADC_CAL_PASS; // Reset Diag Info adcinfo->adcRdTimeErr[ jj ] = 0; adcinfo->adcChanErr[ jj ] = 0;