From fd5bb8de356c92c4b2644668bb32c1bbc992c0dd Mon Sep 17 00:00:00 2001 From: Erik von Reis <evonreis@caltech.edu> Date: Tue, 26 Apr 2022 16:41:35 -0700 Subject: [PATCH] RCG: correct dac duotone amplitude DAC duotone is a straight copy of the ADC duotone signal into a DAC channel. This code takes into account the different bit resolution of the various parts so that DAC duotone amplitude is the same for the various combinations of ADC and DAC. --- src/include/drv/cdsHardware.h | 2 ++ src/include/drv/gsc16ai64.c | 1 + src/include/drv/gsc16ao16.c | 1 + src/include/drv/gsc18ai32.c | 1 + src/include/drv/gsc18ai64.c | 1 + src/include/drv/gsc18ao8.c | 1 + src/include/drv/gsc20ao8.c | 1 + src/include/drv/iop_dac_functions.c | 3 ++- 8 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/include/drv/cdsHardware.h b/src/include/drv/cdsHardware.h index 0adea57f0..031204a88 100644 --- a/src/include/drv/cdsHardware.h +++ b/src/include/drv/cdsHardware.h @@ -209,6 +209,7 @@ typedef struct CDS_HARDWARE{ int dacCount; /* Number of DAC modules found */ long pci_dac[MAX_DAC_MODULES]; /* Remapped addresses of DAC modules */ int dacType[MAX_DAC_MODULES]; + int dacDuoToneMultiplier[MAX_DAC_MODULES]; /* scale amplitude of duotone up for higher bit DACs */ int dacInstance[MAX_DAC_MODULES]; int dacSlot[MAX_DAC_MODULES]; int dacConfig[MAX_DAC_MODULES]; @@ -217,6 +218,7 @@ typedef struct CDS_HARDWARE{ int adcCount; /* Number of ADC modules found */ long pci_adc[MAX_ADC_MODULES]; /* Remapped addresses of ADC modules */ int adcType[MAX_ADC_MODULES]; + int adcDuoToneDivisor[MAX_ADC_MODULES]; /* scale amplitude of duotone down for higher bit ADCs */ int adcInstance[MAX_ADC_MODULES]; int adcSlot[MAX_ADC_MODULES]; int adcChannels[MAX_ADC_MODULES]; diff --git a/src/include/drv/gsc16ai64.c b/src/include/drv/gsc16ai64.c index 4ed938afa..43d7e848d 100644 --- a/src/include/drv/gsc16ai64.c +++ b/src/include/drv/gsc16ai64.c @@ -121,6 +121,7 @@ gsc16ai64Init( CDS_HARDWARE* pHardware, struct pci_dev* adcdev ) pHardware->pci_adc[ devNum ] = (long)pci_alloc_consistent( adcdev, 0x2000, &adc_dma_handle[ devNum ] ); pHardware->adcType[ devNum ] = GSC_16AI64SSA; + pHardware->adcDuoToneDivisor[ devNum ] = 1; pHardware->adcInstance[ devNum ] = pHardware->card_count[ GSC_16AI64SSA ]; pHardware->card_count[ GSC_16AI64SSA ] ++; pHardware->adcChannels[ devNum ] = GSAI_CHAN_COUNT; diff --git a/src/include/drv/gsc16ao16.c b/src/include/drv/gsc16ao16.c index 7bc79a5a4..db7618560 100644 --- a/src/include/drv/gsc16ao16.c +++ b/src/include/drv/gsc16ao16.c @@ -80,6 +80,7 @@ gsc16ao16Init( CDS_HARDWARE* pHardware, struct pci_dev* dacdev ) (long)pci_alloc_consistent( dacdev, 0x200, &dac_dma_handle[ devNum ] ); pHardware->dacAcr[ devNum ] = (int)( _dacPtr[ devNum ]->ASSC ); pHardware->dacType[ devNum ] = GSC_16AO16; + pHardware->dacDuoToneMultiplier[ devNum ] = 1; pHardware->dacCount++; pHardware->dacInstance[ devNum ] = pHardware->card_count[ GSC_16AO16 ]; pHardware->card_count[ GSC_16AO16 ] ++; diff --git a/src/include/drv/gsc18ai32.c b/src/include/drv/gsc18ai32.c index 54bfb14b7..0ef1130e3 100644 --- a/src/include/drv/gsc18ai32.c +++ b/src/include/drv/gsc18ai32.c @@ -135,6 +135,7 @@ gsc18ai32Init( CDS_HARDWARE* pHardware, struct pci_dev* adcdev ) pHardware->pci_adc[ devNum ] = (long)pci_alloc_consistent( adcdev, 0x2000, &adc_dma_handle[ devNum ] ); pHardware->adcType[ devNum ] = GSC_18AI32SSC1M; + pHardware->adcDuoToneDivisor[ devNum ] = 4; pHardware->adcInstance[ devNum ] = pHardware->card_count[ GSC_18AI32SSC1M ]; pHardware->card_count[ GSC_18AI32SSC1M ] ++; pHardware->adcConfig[ devNum ] |= autocal; diff --git a/src/include/drv/gsc18ai64.c b/src/include/drv/gsc18ai64.c index a1acc2784..0815bbe3c 100644 --- a/src/include/drv/gsc18ai64.c +++ b/src/include/drv/gsc18ai64.c @@ -126,6 +126,7 @@ gsc18ai64Init( CDS_HARDWARE* pHardware, struct pci_dev* adcdev ) pHardware->pci_adc[ devNum ] = (long)pci_alloc_consistent( adcdev, 0x2000, &adc_dma_handle[ devNum ] ); pHardware->adcType[ devNum ] = GSC_18AI64SSC; + pHardware->adcDuoToneDivisor[ devNum ] = 4; pHardware->adcInstance[ devNum ] = pHardware->card_count[ GSC_18AI64SSC ]; pHardware->card_count[ GSC_18AI64SSC ] ++; pHardware->adcConfig[ devNum ] = adc18Ptr->ASSC; diff --git a/src/include/drv/gsc18ao8.c b/src/include/drv/gsc18ao8.c index 9031b0a98..e1442150e 100644 --- a/src/include/drv/gsc18ao8.c +++ b/src/include/drv/gsc18ao8.c @@ -115,6 +115,7 @@ gsc18ao8Init( CDS_HARDWARE* pHardware, struct pci_dev* dacdev ) (long)pci_alloc_consistent( dacdev, 0x200, &dac_dma_handle[ devNum ] ); pHardware->dacAcr[ devNum ] |= ((int)( dac18bitPtr->ASY_CONFIG ) & DAC_ACR_MASK); pHardware->dacType[ devNum ] = GSC_18AO8; + pHardware->dacDuoToneMultiplier[ devNum ] = 4; pHardware->dacCount++; pHardware->dacInstance[ devNum ] = pHardware->card_count[ GSC_18AO8 ]; pHardware->card_count[ GSC_18AO8 ] ++; diff --git a/src/include/drv/gsc20ao8.c b/src/include/drv/gsc20ao8.c index 2b22bd4db..04e7bf8c2 100644 --- a/src/include/drv/gsc20ao8.c +++ b/src/include/drv/gsc20ao8.c @@ -135,6 +135,7 @@ gsc20ao8Init( CDS_HARDWARE* pHardware, struct pci_dev* dacdev ) // Return the device type to main code. pHardware->dacType[ devNum ] = GSC_20AO8; + pHardware->dacDuoToneMultiplier[ devNum ] = 8; pHardware->dacCount++; pHardware->dacInstance[ devNum ] = pHardware->card_count[ GSC_20AO8 ]; pHardware->card_count[ GSC_20AO8 ] ++; diff --git a/src/include/drv/iop_dac_functions.c b/src/include/drv/iop_dac_functions.c index e6537656b..ed46935d3 100644 --- a/src/include/drv/iop_dac_functions.c +++ b/src/include/drv/iop_dac_functions.c @@ -156,7 +156,8 @@ iop_dac_write( ) if ( ( dt_diag.dacDuoEnable ) && ( chan == ( num_outs - 1 ) ) && ( card == 0 ) ) { - dac_out = adcinfo.adcData[ 0 ][ ADC_DUOTONE_CHAN ]; + dac_out = adcinfo.adcData[ 0 ][ ADC_DUOTONE_CHAN ] + * cdsPciModules.dacDuoToneMultiplier[0] / cdsPciModules.adcDuoToneDivisor[0]; } // Code below is only for use in DAQ test system. #ifdef DIAG_TEST -- GitLab