• Home
  • Raw
  • Download

Lines Matching +full:two +full:- +full:channel

1 // SPDX-License-Identifier: GPL-2.0+
4 * Driver for the ComputerBoards / MeasurementComputing PCI-DDA series.
9 * COMEDI - Linux Control and Measurement Device Interface
10 * Copyright (C) 1997-8 David A. Schleef <ds@schleef.org>
15 * Description: MeasurementComputing PCI-DDA series
16 * Devices: [Measurement Computing] PCI-DDA08/12 (pci-dda08/12),
17 * PCI-DDA04/12 (pci-dda04/12), PCI-DDA02/12 (pci-dda02/12),
18 * PCI-DDA08/16 (pci-dda08/16), PCI-DDA04/16 (pci-dda04/16),
19 * PCI-DDA02/16 (pci-dda02/16)
45 #define CB_DDA_DA_CTRL_DAC(x) ((x) << 2) /* Specify DAC channel */
56 #define CAL_CHANNEL_BITS(channel) (((channel) << 1) & CAL_CHANNEL_MASK) argument
110 .name = "pci-dda02/12",
115 .name = "pci-dda04/12",
120 .name = "pci-dda08/12",
125 .name = "pci-dda02/16",
130 .name = "pci-dda04/16",
135 .name = "pci-dda08/16",
153 struct cb_pcidda_private *devpriv = dev->private; in cb_pcidda_serial_in()
160 if (inw_p(devpriv->daqio + DACALIBRATION1) & SERIAL_OUT_BIT) in cb_pcidda_serial_in()
161 value |= 1 << (value_width - i); in cb_pcidda_serial_in()
171 struct cb_pcidda_private *devpriv = dev->private; in cb_pcidda_serial_out()
176 if (value & (1 << (num_bits - i))) in cb_pcidda_serial_out()
177 devpriv->dac_cal1_bits |= SERIAL_IN_BIT; in cb_pcidda_serial_out()
179 devpriv->dac_cal1_bits &= ~SERIAL_IN_BIT; in cb_pcidda_serial_out()
180 outw_p(devpriv->dac_cal1_bits, devpriv->daqio + DACALIBRATION1); in cb_pcidda_serial_out()
188 struct cb_pcidda_private *devpriv = dev->private; in cb_pcidda_read_eeprom()
192 /* one caldac for every two dac channels */ in cb_pcidda_read_eeprom()
201 /* deactivate caldacs (one caldac for every two channels) */ in cb_pcidda_read_eeprom()
204 outw_p(cal2_bits, devpriv->daqio + DACALIBRATION2); in cb_pcidda_read_eeprom()
215 outw_p(cal2_bits, devpriv->daqio + DACALIBRATION2); in cb_pcidda_read_eeprom()
222 unsigned int caldac, unsigned int channel, in cb_pcidda_write_caldac() argument
225 struct cb_pcidda_private *devpriv = dev->private; in cb_pcidda_write_caldac()
228 /* caldacs use 3 bit channel specification */ in cb_pcidda_write_caldac()
231 /* one caldac for every two dac channels */ in cb_pcidda_write_caldac()
234 /* write 3 bit channel */ in cb_pcidda_write_caldac()
235 cb_pcidda_serial_out(dev, channel, num_channel_bits); in cb_pcidda_write_caldac()
243 /* deactivate caldacs (one caldac for every two channels) */ in cb_pcidda_write_caldac()
248 outw_p(cal2_bits, devpriv->daqio + DACALIBRATION2); in cb_pcidda_write_caldac()
251 outw_p(cal2_bits, devpriv->daqio + DACALIBRATION2); in cb_pcidda_write_caldac()
254 /* set caldacs to eeprom values for given channel and range */
255 static void cb_pcidda_calibrate(struct comedi_device *dev, unsigned int channel, in cb_pcidda_calibrate() argument
258 struct cb_pcidda_private *devpriv = dev->private; in cb_pcidda_calibrate()
259 unsigned int caldac = channel / 2; /* two caldacs per channel */ in cb_pcidda_calibrate()
260 unsigned int chan = 4 * (channel % 2); /* caldac channel base */ in cb_pcidda_calibrate()
261 unsigned int index = 2 * range + 12 * channel; in cb_pcidda_calibrate()
266 devpriv->ao_range[channel] = range; in cb_pcidda_calibrate()
269 offset = devpriv->eeprom_data[0x7 + index]; in cb_pcidda_calibrate()
270 gain = devpriv->eeprom_data[0x8 + index]; in cb_pcidda_calibrate()
288 struct cb_pcidda_private *devpriv = dev->private; in cb_pcidda_ao_insn_write()
289 unsigned int channel = CR_CHAN(insn->chanspec); in cb_pcidda_ao_insn_write() local
290 unsigned int range = CR_RANGE(insn->chanspec); in cb_pcidda_ao_insn_write()
294 if (range != devpriv->ao_range[channel]) in cb_pcidda_ao_insn_write()
295 cb_pcidda_calibrate(dev, channel, range); in cb_pcidda_ao_insn_write()
297 ctrl = CB_DDA_DA_CTRL_EN | CB_DDA_DA_CTRL_DAC(channel); in cb_pcidda_ao_insn_write()
317 outw(ctrl, devpriv->daqio + CB_DDA_DA_CTRL_REG); in cb_pcidda_ao_insn_write()
319 for (i = 0; i < insn->n; i++) in cb_pcidda_ao_insn_write()
320 outw(data[i], devpriv->daqio + CB_DDA_DA_DATA_REG(channel)); in cb_pcidda_ao_insn_write()
322 return insn->n; in cb_pcidda_ao_insn_write()
338 return -ENODEV; in cb_pcidda_auto_attach()
339 dev->board_ptr = board; in cb_pcidda_auto_attach()
340 dev->board_name = board->name; in cb_pcidda_auto_attach()
344 return -ENOMEM; in cb_pcidda_auto_attach()
349 dev->iobase = pci_resource_start(pcidev, 2); in cb_pcidda_auto_attach()
350 devpriv->daqio = pci_resource_start(pcidev, 3); in cb_pcidda_auto_attach()
356 s = &dev->subdevices[0]; in cb_pcidda_auto_attach()
358 s->type = COMEDI_SUBD_AO; in cb_pcidda_auto_attach()
359 s->subdev_flags = SDF_WRITABLE; in cb_pcidda_auto_attach()
360 s->n_chan = board->ao_chans; in cb_pcidda_auto_attach()
361 s->maxdata = (1 << board->ao_bits) - 1; in cb_pcidda_auto_attach()
362 s->range_table = &cb_pcidda_ranges; in cb_pcidda_auto_attach()
363 s->insn_write = cb_pcidda_ao_insn_write; in cb_pcidda_auto_attach()
365 /* two 8255 digital io subdevices */ in cb_pcidda_auto_attach()
367 s = &dev->subdevices[1 + i]; in cb_pcidda_auto_attach()
375 devpriv->eeprom_data[i] = cb_pcidda_read_eeprom(dev, i); in cb_pcidda_auto_attach()
378 for (i = 0; i < board->ao_chans; i++) in cb_pcidda_auto_attach()
379 cb_pcidda_calibrate(dev, i, devpriv->ao_range[i]); in cb_pcidda_auto_attach()
395 id->driver_data); in cb_pcidda_pci_probe()
418 MODULE_DESCRIPTION("Comedi low-level driver");