reset_caldac( setup, layout->adc_gain( channel ) );
reset_caldac( setup, layout->adc_offset_fine( channel ) );
reset_caldac( setup, layout->adc_gain_fine( channel ) );
- // don't reset postgain offset here
}else
{
- // need to preserve postgain offset? XXX
retval = comedi_apply_calibration( setup->dev, setup->ad_subdev,
channel, range, AREF_GROUND, setup->cal_save_file_path);
if( retval < 0 )
reset_caldac( setup, layout->adc_gain( channel ) );
reset_caldac( setup, layout->adc_offset_fine( channel ) );
reset_caldac( setup, layout->adc_gain_fine( channel ) );
- // don't reset postgain offset here
}
}
}
saved_calibration_t *saved_cals, unsigned int saved_cals_length, saved_calibration_t *current_cal,
unsigned int channel, unsigned int range )
{
- generic_prep_dac_caldacs( setup, layout, channel, range );
-
generic_prep_adc_for_dac( setup, layout, saved_cals, saved_cals_length,
layout->dac_ground_observable( setup, channel, range ) );
static void generic_do_adc_channel( calibration_setup_t *setup, const generic_layout_t *layout,
saved_calibration_t *current_cal, unsigned int channel, unsigned int range )
{
- generic_prep_adc_caldacs( setup, layout, channel, range );
-
generic_do_relative( setup, current_cal, layout->adc_high_observable( setup, channel, range ),
layout->adc_ground_observable( setup, channel, range ), layout->adc_gain( channel ) );
generic_do_cal( setup, current_cal, layout->adc_ground_observable( setup, channel, range ),
sc_push_aref( current_cal, SC_ALL_AREFS );
}
+static void generic_do_adc_postgain_offset( calibration_setup_t *setup, const generic_layout_t *layout,
+ saved_calibration_t *current_cal, unsigned int channel, int unipolar )
+{
+ int lowgain, highgain;
+
+ if( unipolar )
+ {
+ lowgain = get_unipolar_lowgain( setup->dev, setup->ad_subdev );
+ highgain = get_unipolar_highgain( setup->dev, setup->ad_subdev );
+ }else
+ {
+ lowgain = get_bipolar_lowgain( setup->dev, setup->ad_subdev );
+ highgain = get_bipolar_highgain( setup->dev, setup->ad_subdev );
+ }
+
+ generic_do_relative( setup, current_cal, layout->adc_ground_observable( setup, channel, lowgain ),
+ layout->adc_ground_observable( setup, channel, highgain ), layout->adc_postgain_offset( channel ) );
+
+ current_cal->subdevice = setup->ad_subdev;
+ sc_push_channel( current_cal, channel );
+ sc_push_aref( current_cal, SC_ALL_AREFS );
+}
+
int generic_cal_by_channel_and_range( calibration_setup_t *setup,
const generic_layout_t *layout )
{
num_ai_calibrations = num_ai_ranges * num_ai_channels;
num_calibrations = num_ai_calibrations + num_ao_ranges * num_ao_channels;
+ for( channel = 0; channel < num_ai_channels; channel++ )
+ if( layout->adc_postgain_offset( channel ) >= 0 )
+ num_calibrations += 2;
+ saved_cals = malloc( num_calibrations * sizeof( saved_calibration_t ) );
saved_cals = malloc( num_calibrations * sizeof( saved_calibration_t ) );
if( saved_cals == NULL ) return -1;
for( channel = 0; channel < num_ai_channels; channel++ )
{
+ int postgain_bip, postgain_unip;
+
+ if( layout->adc_postgain_offset( 0 ) >= 0 )
+ {
+ /* bipolar postgain */
+ generic_do_adc_postgain_offset( setup, layout, current_cal, channel, 0 );
+ for( range = 0; range < num_ai_ranges; range++ )
+ if( is_bipolar( setup->dev, setup->ad_subdev, channel, range ) )
+ sc_push_range( current_cal, range );
+ postgain_bip = setup->caldacs[ layout->adc_postgain_offset( channel ) ].current;
+ current_cal++;
+ /* unipolar postgain */
+ generic_do_adc_postgain_offset( setup, layout, current_cal, channel, 1 );
+ for( range = 0; range < num_ai_ranges; range++ )
+ if( is_unipolar( setup->dev, setup->ad_subdev, channel, range ) )
+ sc_push_range( current_cal, range );
+ postgain_unip = setup->caldacs[ layout->adc_postgain_offset( channel ) ].current;
+ current_cal++;
+ }else
+ postgain_bip = postgain_unip = -1;
+
for( range = 0; range < num_ai_ranges; range++ )
{
+ generic_prep_adc_caldacs( setup, layout, channel, range );
+ if( is_unipolar( setup->dev, setup->ad_subdev, channel, range ) )
+ update_caldac( setup, layout->adc_postgain_offset( channel ), postgain_bip );
+ else
+ update_caldac( setup, layout->adc_postgain_offset( channel ), postgain_unip );
generic_do_adc_channel( setup, layout, current_cal, channel, range );
current_cal++;
}
{
for( range = 0; range < num_ao_ranges; range++ )
{
+ generic_prep_dac_caldacs( setup, layout, channel, range );
generic_do_dac_channel( setup, layout, saved_cals, num_ai_calibrations,
current_cal, channel, range );
current_cal++;
int channel, range, num_ai_ranges, num_ao_ranges,
num_ao_channels, retval, num_calibrations, i;
saved_calibration_t *saved_cals, *current_cal;
+ int postgain_bip, postgain_unip;
assert( comedi_range_is_chan_specific( setup->dev, setup->ad_subdev ) == 0 );
num_ao_ranges = num_ao_channels = 0;
num_calibrations = num_ai_ranges + num_ao_ranges * num_ao_channels;
-
+ if( layout->adc_postgain_offset( 0 ) >= 0 )
+ num_calibrations += 2;
saved_cals = malloc( num_calibrations * sizeof( saved_calibration_t ) );
if( saved_cals == NULL ) return -1;
current_cal = saved_cals;
+ if( layout->adc_postgain_offset( 0 ) >= 0 )
+ {
+ /* bipolar postgain */
+ generic_do_adc_postgain_offset( setup, layout, current_cal, 0, 0 );
+ sc_push_channel( current_cal, SC_ALL_CHANNELS );
+ for( range = 0; range < num_ai_ranges; range++ )
+ if( is_bipolar( setup->dev, setup->ad_subdev, 0, range ) )
+ sc_push_range( current_cal, range );
+ postgain_bip = setup->caldacs[ layout->adc_postgain_offset( 0 ) ].current;
+ current_cal++;
+ /* unipolar postgain */
+ generic_do_adc_postgain_offset( setup, layout, current_cal, 0, 1 );
+ sc_push_channel( current_cal, SC_ALL_CHANNELS );
+ for( range = 0; range < num_ai_ranges; range++ )
+ if( is_unipolar( setup->dev, setup->ad_subdev, 0, range ) )
+ sc_push_range( current_cal, range );
+ postgain_unip = setup->caldacs[ layout->adc_postgain_offset( 0 ) ].current;
+ current_cal++;
+ }else
+ postgain_bip = postgain_unip = -1;
+
for( range = 0; range < num_ai_ranges; range++ )
{
+ generic_prep_adc_caldacs( setup, layout, 0, range );
+ if( is_unipolar( setup->dev, setup->ad_subdev, 0, range ) )
+ update_caldac( setup, layout->adc_postgain_offset( 0 ), postgain_bip );
+ else
+ update_caldac( setup, layout->adc_postgain_offset( 0 ), postgain_unip );
generic_do_adc_channel( setup, layout, current_cal, 0, range );
sc_push_channel( current_cal, SC_ALL_CHANNELS );
current_cal++;
{
for( range = 0; range < num_ao_ranges; range++ )
{
+ generic_prep_dac_caldacs( setup, layout, channel, range );
generic_do_dac_channel( setup, layout, saved_cals, num_ai_ranges,
current_cal, channel, range );
current_cal++;
static const int calpot_subdev = 5;
static const int dac08_subdev = 6;
- init_observables_1602_16( setup );
+ init_observables_1xxx( setup );
setup_caldacs( setup, caldac_subdev );
setup_caldacs( setup, calpot_subdev );
setup_caldacs( setup, dac08_subdev );
return generic_cal_by_range( setup, &layout );
}
+enum cal_knobs_1602_16
+{
+ DAC0_GAIN_FINE_1602_16 = 0,
+ DAC0_GAIN_COARSE_1602_16 = 1,
+ DAC0_OFFSET_COARSE_1602_16 = 2,
+ DAC1_OFFSET_COARSE_1602_16 = 3,
+ DAC1_GAIN_FINE_1602_16 = 4,
+ DAC1_GAIN_COARSE_1602_16 = 5,
+ DAC0_OFFSET_FINE_1602_16 = 6,
+ DAC1_OFFSET_FINE_1602_16 = 7,
+ ADC_GAIN_1602_16 = 8,
+ ADC_POSTGAIN_OFFSET_1602_16 = 9,
+ ADC_PREGAIN_OFFSET_1602_16 = 10,
+};
+static int dac_gain_coarse_1602_16( unsigned int channel )
+{
+ if( channel ) return DAC1_GAIN_COARSE_1602_16;
+ else return DAC0_GAIN_COARSE_1602_16;
+}
+static int dac_gain_fine_1602_16( unsigned int channel )
+{
+ if( channel ) return DAC1_GAIN_FINE_1602_16;
+ else return DAC0_GAIN_FINE_1602_16;
+}
+static int dac_offset_coarse_1602_16( unsigned int channel )
+{
+ if( channel ) return DAC1_OFFSET_COARSE_1602_16;
+ else return DAC0_OFFSET_COARSE_1602_16;
+}
+static int dac_offset_fine_1602_16( unsigned int channel )
+{
+ if( channel ) return DAC1_OFFSET_FINE_1602_16;
+ else return DAC0_OFFSET_FINE_1602_16;
+}
+static int adc_gain_1602_16( unsigned int channel )
+{
+ return ADC_GAIN_1602_16;
+}
+static int adc_pregain_offset_1602_16( unsigned int channel )
+{
+ return ADC_PREGAIN_OFFSET_1602_16;
+}
+static int adc_postgain_offset_1602_16( unsigned int channel )
+{
+ return ADC_POSTGAIN_OFFSET_1602_16;
+}
+static int cal_cb_pci_1602_16( calibration_setup_t *setup )
+{
+ generic_layout_t layout;
+
+ init_generic_layout( &layout );
+ layout.adc_gain = adc_gain_1602_16;
+ layout.adc_offset = adc_pregain_offset_1602_16;
+ layout.adc_postgain_offset = adc_postgain_offset_1602_16;
+ layout.dac_gain = dac_gain_coarse_1602_16;
+ layout.dac_gain_fine = dac_gain_fine_1602_16;
+ layout.dac_offset = dac_offset_coarse_1602_16;
+ layout.dac_offset_fine = dac_offset_fine_1602_16;
+ layout.adc_high_observable = ai_high_observable_1xxx;
+ layout.adc_ground_observable = ai_ground_observable_1xxx;
+ layout.dac_high_observable = ao_high_observable_1xxx;
+ layout.dac_ground_observable = ao_ground_observable_1xxx;
+ return generic_cal_by_range( setup, &layout );
+}
+
+#if 0
static int cal_cb_pci_1602_16( calibration_setup_t *setup )
{
enum cal_knobs_1602_16
return 0;
}
+#endif
// converts calibration source voltages from two 16 bit eeprom values to a floating point value
static float eeprom16_to_source( uint16_t *data )