Lines Matching +full:wo +full:- +full:data
1 // SPDX-License-Identifier: GPL-2.0+
4 * Driver for Computer Boards PC-CARD DAS16/16.
6 * COMEDI - Linux Control and Measurement Device Interface
19 * Description: Computer Boards PC-CARD DAS16/16
20 * Devices: [ComputerBoards] PC-CARD DAS16/16 (cb_das16_cs),
21 * PC-CARD DAS16/16-AO
23 * Updated: Mon, 04 Nov 2002 20:04:21 -0800
52 #define DAS16CS_MISC1_OVR BIT(10) /* ro - 1=FIFO overflow */
59 #define DAS16CS_MISC1_EOC BIT(7) /* ro - 0=busy; 1=ready */
61 #define DAS16CS_MISC1_INTB BIT(4) /* ro - 0=latched; 1=cleared */
62 #define DAS16CS_MISC1_MA_MASK (0xf << 0) /* ro - current ai mux */
63 #define DAS16CS_MISC1_DAC1CS BIT(3) /* wo - DAC1 chip select */
64 #define DAS16CS_MISC1_DACCLK BIT(2) /* wo - Serial DAC clock */
65 #define DAS16CS_MISC1_DACSD BIT(1) /* wo - Serial DAC data */
66 #define DAS16CS_MISC1_DAC0CS BIT(0) /* wo - DAC0 chip select */
71 #define DAS16CS_MISC2_AI_GAIN_1 DAS16CS_MISC2_AI_GAIN(4) /* +/-10V */
72 #define DAS16CS_MISC2_AI_GAIN_2 DAS16CS_MISC2_AI_GAIN(0) /* +/-5V */
73 #define DAS16CS_MISC2_AI_GAIN_4 DAS16CS_MISC2_AI_GAIN(1) /* +/-2.5V */
74 #define DAS16CS_MISC2_AI_GAIN_8 DAS16CS_MISC2_AI_GAIN(2) /* +-1.25V */
80 #define DAS16CS_MISC2_FFNE BIT(3) /* ro - 1=FIFO not empty */
81 #define DAS16CS_MISC2_TRGCLR BIT(3) /* wo - 1=clr (monstable) */
97 .name = "PC-CARD DAS16/16-AO",
102 .name = "PCM-DAS16s/16",
105 .name = "PC-CARD DAS16/16",
131 status = inw(dev->iobase + DAS16CS_MISC1_REG); in das16cs_ai_eoc()
134 return -EBUSY; in das16cs_ai_eoc()
140 unsigned int *data) in das16cs_ai_insn_read() argument
142 struct das16cs_private *devpriv = dev->private; in das16cs_ai_insn_read()
143 int chan = CR_CHAN(insn->chanspec); in das16cs_ai_insn_read()
144 int range = CR_RANGE(insn->chanspec); in das16cs_ai_insn_read()
145 int aref = CR_AREF(insn->chanspec); in das16cs_ai_insn_read()
150 dev->iobase + DAS16CS_AI_MUX_REG); in das16cs_ai_insn_read()
153 devpriv->misc1 &= ~(DAS16CS_MISC1_INTE | DAS16CS_MISC1_INT_SRC_MASK | in das16cs_ai_insn_read()
156 devpriv->misc1 &= ~DAS16CS_MISC1_SEDIFF; in das16cs_ai_insn_read()
158 devpriv->misc1 |= DAS16CS_MISC1_SEDIFF; in das16cs_ai_insn_read()
159 outw(devpriv->misc1, dev->iobase + DAS16CS_MISC1_REG); in das16cs_ai_insn_read()
161 devpriv->misc2 &= ~(DAS16CS_MISC2_BME | DAS16CS_MISC2_AI_GAIN_MASK); in das16cs_ai_insn_read()
164 devpriv->misc2 |= DAS16CS_MISC2_AI_GAIN_1; in das16cs_ai_insn_read()
167 devpriv->misc2 |= DAS16CS_MISC2_AI_GAIN_2; in das16cs_ai_insn_read()
170 devpriv->misc2 |= DAS16CS_MISC2_AI_GAIN_4; in das16cs_ai_insn_read()
173 devpriv->misc2 |= DAS16CS_MISC2_AI_GAIN_8; in das16cs_ai_insn_read()
176 outw(devpriv->misc2, dev->iobase + DAS16CS_MISC2_REG); in das16cs_ai_insn_read()
178 for (i = 0; i < insn->n; i++) { in das16cs_ai_insn_read()
179 outw(0, dev->iobase + DAS16CS_AI_DATA_REG); in das16cs_ai_insn_read()
185 data[i] = inw(dev->iobase + DAS16CS_AI_DATA_REG); in das16cs_ai_insn_read()
194 unsigned int *data) in das16cs_ao_insn_write() argument
196 struct das16cs_private *devpriv = dev->private; in das16cs_ao_insn_write()
197 unsigned int chan = CR_CHAN(insn->chanspec); in das16cs_ao_insn_write()
198 unsigned int val = s->readback[chan]; in das16cs_ao_insn_write()
203 for (i = 0; i < insn->n; i++) { in das16cs_ao_insn_write()
204 val = data[i]; in das16cs_ao_insn_write()
206 outw(devpriv->misc1, dev->iobase + DAS16CS_MISC1_REG); in das16cs_ao_insn_write()
209 /* raise the DACxCS line for the non-selected channel */ in das16cs_ao_insn_write()
210 misc1 = devpriv->misc1 & ~DAS16CS_MISC1_DAC_MASK; in das16cs_ao_insn_write()
216 outw(misc1, dev->iobase + DAS16CS_MISC1_REG); in das16cs_ao_insn_write()
219 for (bit = 15; bit >= 0; bit--) { in das16cs_ao_insn_write()
224 outw(misc1, dev->iobase + DAS16CS_MISC1_REG); in das16cs_ao_insn_write()
227 dev->iobase + DAS16CS_MISC1_REG); in das16cs_ao_insn_write()
232 * the new data and update analog the output in das16cs_ao_insn_write()
235 dev->iobase + DAS16CS_MISC1_REG); in das16cs_ao_insn_write()
237 s->readback[chan] = val; in das16cs_ao_insn_write()
239 return insn->n; in das16cs_ao_insn_write()
245 unsigned int *data) in das16cs_dio_insn_bits() argument
247 if (comedi_dio_update_state(s, data)) in das16cs_dio_insn_bits()
248 outw(s->state, dev->iobase + DAS16CS_DIO_REG); in das16cs_dio_insn_bits()
250 data[1] = inw(dev->iobase + DAS16CS_DIO_REG); in das16cs_dio_insn_bits()
252 return insn->n; in das16cs_dio_insn_bits()
258 unsigned int *data) in das16cs_dio_insn_config() argument
260 struct das16cs_private *devpriv = dev->private; in das16cs_dio_insn_config()
261 unsigned int chan = CR_CHAN(insn->chanspec); in das16cs_dio_insn_config()
270 ret = comedi_dio_insn_config(dev, s, insn, data, mask); in das16cs_dio_insn_config()
274 if (s->io_bits & 0xf0) in das16cs_dio_insn_config()
275 devpriv->misc2 |= DAS16CS_MISC2_UDIR; in das16cs_dio_insn_config()
277 devpriv->misc2 &= ~DAS16CS_MISC2_UDIR; in das16cs_dio_insn_config()
278 if (s->io_bits & 0x0f) in das16cs_dio_insn_config()
279 devpriv->misc2 |= DAS16CS_MISC2_LDIR; in das16cs_dio_insn_config()
281 devpriv->misc2 &= ~DAS16CS_MISC2_LDIR; in das16cs_dio_insn_config()
282 outw(devpriv->misc2, dev->iobase + DAS16CS_MISC2_REG); in das16cs_dio_insn_config()
284 return insn->n; in das16cs_dio_insn_config()
290 unsigned int *data) in das16cs_counter_insn_config() argument
292 struct das16cs_private *devpriv = dev->private; in das16cs_counter_insn_config()
294 switch (data[0]) { in das16cs_counter_insn_config()
296 switch (data[1]) { in das16cs_counter_insn_config()
298 devpriv->misc2 |= DAS16CS_MISC2_CTR1; in das16cs_counter_insn_config()
301 devpriv->misc2 &= ~DAS16CS_MISC2_CTR1; in das16cs_counter_insn_config()
304 return -EINVAL; in das16cs_counter_insn_config()
306 outw(devpriv->misc2, dev->iobase + DAS16CS_MISC2_REG); in das16cs_counter_insn_config()
309 if (devpriv->misc2 & DAS16CS_MISC2_CTR1) { in das16cs_counter_insn_config()
310 data[1] = 0; in das16cs_counter_insn_config()
311 data[2] = I8254_OSC_BASE_100KHZ; in das16cs_counter_insn_config()
313 data[1] = 1; in das16cs_counter_insn_config()
314 data[2] = 0; /* unknown */ in das16cs_counter_insn_config()
318 return -EINVAL; in das16cs_counter_insn_config()
321 return insn->n; in das16cs_counter_insn_config()
332 if (board->device_id == link->card_id) in das16cs_find_boardinfo()
350 return -ENODEV; in das16cs_auto_attach()
351 dev->board_ptr = board; in das16cs_auto_attach()
352 dev->board_name = board->name; in das16cs_auto_attach()
354 link->config_flags |= CONF_AUTO_SET_IO | CONF_ENABLE_IRQ; in das16cs_auto_attach()
358 dev->iobase = link->resource[0]->start; in das16cs_auto_attach()
360 link->priv = dev; in das16cs_auto_attach()
364 return -ENOMEM; in das16cs_auto_attach()
366 dev->pacer = comedi_8254_io_alloc(dev->iobase + DAS16CS_TIMER_BASE, in das16cs_auto_attach()
368 if (IS_ERR(dev->pacer)) in das16cs_auto_attach()
369 return PTR_ERR(dev->pacer); in das16cs_auto_attach()
376 s = &dev->subdevices[0]; in das16cs_auto_attach()
377 s->type = COMEDI_SUBD_AI; in das16cs_auto_attach()
378 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DIFF; in das16cs_auto_attach()
379 s->n_chan = 16; in das16cs_auto_attach()
380 s->maxdata = 0xffff; in das16cs_auto_attach()
381 s->range_table = &das16cs_ai_range; in das16cs_auto_attach()
382 s->insn_read = das16cs_ai_insn_read; in das16cs_auto_attach()
385 s = &dev->subdevices[1]; in das16cs_auto_attach()
386 if (board->has_ao) { in das16cs_auto_attach()
387 s->type = COMEDI_SUBD_AO; in das16cs_auto_attach()
388 s->subdev_flags = SDF_WRITABLE; in das16cs_auto_attach()
389 s->n_chan = 2; in das16cs_auto_attach()
390 s->maxdata = 0xffff; in das16cs_auto_attach()
391 s->range_table = &range_bipolar10; in das16cs_auto_attach()
392 s->insn_write = &das16cs_ao_insn_write; in das16cs_auto_attach()
398 s->type = COMEDI_SUBD_UNUSED; in das16cs_auto_attach()
402 s = &dev->subdevices[2]; in das16cs_auto_attach()
403 s->type = COMEDI_SUBD_DIO; in das16cs_auto_attach()
404 s->subdev_flags = SDF_READABLE | SDF_WRITABLE; in das16cs_auto_attach()
405 s->n_chan = board->has_4dio ? 4 : 8; in das16cs_auto_attach()
406 s->maxdata = 1; in das16cs_auto_attach()
407 s->range_table = &range_digital; in das16cs_auto_attach()
408 s->insn_bits = das16cs_dio_insn_bits; in das16cs_auto_attach()
409 s->insn_config = das16cs_dio_insn_config; in das16cs_auto_attach()
412 s = &dev->subdevices[3]; in das16cs_auto_attach()
413 comedi_8254_subdevice_init(s, dev->pacer); in das16cs_auto_attach()
415 dev->pacer->insn_config = das16cs_counter_insn_config; in das16cs_auto_attach()
418 comedi_8254_set_busy(dev->pacer, 1, true); in das16cs_auto_attach()
419 comedi_8254_set_busy(dev->pacer, 2, true); in das16cs_auto_attach()
453 MODULE_DESCRIPTION("Comedi driver for Computer Boards PC-CARD DAS16/16");