Lines Matching +full:board +full:- +full:2
1 // SPDX-License-Identifier: GPL-2.0+
6 * COMEDI - Linux Control and Measurement Device Interface
21 * 'ai_encoding' member of board structure:
29 * complete, MSB[7] is an "over-range" bit.
65 /* (W) analog output l.s.b. registers for 2 channels ("JR" boards) */
67 /* (W) analog output m.s.b. registers for 2 channels ("JR" boards) */
75 /* (W) analog output l.s.b. registers for 2 channels ("AOx" boards) */
77 /* (W) analog output m.s.b. registers for 2 channels ("AOx" boards) */
141 8, 0, 10, 2, 12, 4, 14, 6, 1, 3, 5, 7
143 static const int das08_pgl_ai_gainlist[] = { 8, 0, 2, 4, 6, 1, 3, 5, 7 };
161 status = inb(dev->iobase + DAS08_STATUS_REG); in das08_ai_eoc()
164 return -EBUSY; in das08_ai_eoc()
171 const struct das08_board_struct *board = dev->board_ptr; in das08_ai_insn_read() local
172 struct das08_private_struct *devpriv = dev->private; in das08_ai_insn_read()
179 chan = CR_CHAN(insn->chanspec); in das08_ai_insn_read()
180 range = CR_RANGE(insn->chanspec); in das08_ai_insn_read()
183 inb(dev->iobase + DAS08_AI_LSB_REG); in das08_ai_insn_read()
184 inb(dev->iobase + DAS08_AI_MSB_REG); in das08_ai_insn_read()
188 spin_lock(&dev->spinlock); in das08_ai_insn_read()
189 devpriv->do_mux_bits &= ~DAS08_CONTROL_MUX_MASK; in das08_ai_insn_read()
190 devpriv->do_mux_bits |= DAS08_CONTROL_MUX(chan); in das08_ai_insn_read()
191 outb(devpriv->do_mux_bits, dev->iobase + DAS08_CONTROL_REG); in das08_ai_insn_read()
192 spin_unlock(&dev->spinlock); in das08_ai_insn_read()
194 if (devpriv->pg_gainlist) { in das08_ai_insn_read()
196 range = CR_RANGE(insn->chanspec); in das08_ai_insn_read()
197 outb(devpriv->pg_gainlist[range], in das08_ai_insn_read()
198 dev->iobase + DAS08_GAIN_REG); in das08_ai_insn_read()
201 for (n = 0; n < insn->n; n++) { in das08_ai_insn_read()
202 /* clear over-range bits for 16-bit boards */ in das08_ai_insn_read()
203 if (board->ai_nbits == 16) in das08_ai_insn_read()
204 if (inb(dev->iobase + DAS08_AI_MSB_REG) & 0x80) in das08_ai_insn_read()
205 dev_info(dev->class_dev, "over-range\n"); in das08_ai_insn_read()
208 outb_p(0, dev->iobase + DAS08_AI_TRIG_REG); in das08_ai_insn_read()
214 msb = inb(dev->iobase + DAS08_AI_MSB_REG); in das08_ai_insn_read()
215 lsb = inb(dev->iobase + DAS08_AI_LSB_REG); in das08_ai_insn_read()
216 if (board->ai_encoding == das08_encode12) { in das08_ai_insn_read()
218 } else if (board->ai_encoding == das08_pcm_encode12) { in das08_ai_insn_read()
220 } else if (board->ai_encoding == das08_encode16) { in das08_ai_insn_read()
222 * "JR" 16-bit boards are sign-magnitude. in das08_ai_insn_read()
224 * XXX The manual seems to imply that 0 is full-scale in das08_ai_insn_read()
225 * negative and 65535 is full-scale positive, but the in das08_ai_insn_read()
227 * DAS08/JR/16 and DAS08/JR/16-AO boards have it in das08_ai_insn_read()
228 * encoded as sign-magnitude. Assume the original in das08_ai_insn_read()
235 * COMEDI 16-bit bipolar data value for 0V is 0x8000. in das08_ai_insn_read()
240 data[n] = BIT(15) - magnitude; in das08_ai_insn_read()
242 dev_err(dev->class_dev, "bug! unknown ai encoding\n"); in das08_ai_insn_read()
243 return -1; in das08_ai_insn_read()
255 data[1] = DAS08_STATUS_DI(inb(dev->iobase + DAS08_STATUS_REG)); in das08_di_insn_bits()
257 return insn->n; in das08_di_insn_bits()
264 struct das08_private_struct *devpriv = dev->private; in das08_do_insn_bits()
268 spin_lock(&dev->spinlock); in das08_do_insn_bits()
269 devpriv->do_mux_bits &= ~DAS08_CONTROL_DO_MASK; in das08_do_insn_bits()
270 devpriv->do_mux_bits |= DAS08_CONTROL_DO(s->state); in das08_do_insn_bits()
271 outb(devpriv->do_mux_bits, dev->iobase + DAS08_CONTROL_REG); in das08_do_insn_bits()
272 spin_unlock(&dev->spinlock); in das08_do_insn_bits()
275 data[1] = s->state; in das08_do_insn_bits()
277 return insn->n; in das08_do_insn_bits()
285 data[1] = inb(dev->iobase + DAS08JR_DI_REG); in das08jr_di_insn_bits()
287 return insn->n; in das08jr_di_insn_bits()
295 outb(s->state, dev->iobase + DAS08JR_DO_REG); in das08jr_do_insn_bits()
297 data[1] = s->state; in das08jr_do_insn_bits()
299 return insn->n; in das08jr_do_insn_bits()
305 const struct das08_board_struct *board = dev->board_ptr; in das08_ao_set_data() local
311 if (board->is_jr) { in das08_ao_set_data()
312 outb(lsb, dev->iobase + DAS08JR_AO_LSB_REG(chan)); in das08_ao_set_data()
313 outb(msb, dev->iobase + DAS08JR_AO_MSB_REG(chan)); in das08_ao_set_data()
315 inb(dev->iobase + DAS08JR_AO_UPDATE_REG); in das08_ao_set_data()
317 outb(lsb, dev->iobase + DAS08AOX_AO_LSB_REG(chan)); in das08_ao_set_data()
318 outb(msb, dev->iobase + DAS08AOX_AO_MSB_REG(chan)); in das08_ao_set_data()
320 inb(dev->iobase + DAS08AOX_AO_UPDATE_REG); in das08_ao_set_data()
329 unsigned int chan = CR_CHAN(insn->chanspec); in das08_ao_insn_write()
330 unsigned int val = s->readback[chan]; in das08_ao_insn_write()
333 for (i = 0; i < insn->n; i++) { in das08_ao_insn_write()
337 s->readback[chan] = val; in das08_ao_insn_write()
339 return insn->n; in das08_ao_insn_write()
344 const struct das08_board_struct *board = dev->board_ptr; in das08_common_attach() local
345 struct das08_private_struct *devpriv = dev->private; in das08_common_attach()
350 dev->iobase = iobase; in das08_common_attach()
352 dev->board_name = board->name; in das08_common_attach()
358 s = &dev->subdevices[0]; in das08_common_attach()
360 if (board->ai_nbits) { in das08_common_attach()
361 s->type = COMEDI_SUBD_AI; in das08_common_attach()
368 s->subdev_flags = SDF_READABLE | SDF_GROUND; in das08_common_attach()
369 s->n_chan = 8; in das08_common_attach()
370 s->maxdata = (1 << board->ai_nbits) - 1; in das08_common_attach()
371 s->range_table = das08_ai_lranges[board->ai_pg]; in das08_common_attach()
372 s->insn_read = das08_ai_insn_read; in das08_common_attach()
373 devpriv->pg_gainlist = das08_ai_gainlists[board->ai_pg]; in das08_common_attach()
375 s->type = COMEDI_SUBD_UNUSED; in das08_common_attach()
378 s = &dev->subdevices[1]; in das08_common_attach()
380 if (board->ao_nbits) { in das08_common_attach()
381 s->type = COMEDI_SUBD_AO; in das08_common_attach()
382 s->subdev_flags = SDF_WRITABLE; in das08_common_attach()
383 s->n_chan = 2; in das08_common_attach()
384 s->maxdata = (1 << board->ao_nbits) - 1; in das08_common_attach()
385 s->range_table = &range_bipolar5; in das08_common_attach()
386 s->insn_write = das08_ao_insn_write; in das08_common_attach()
393 for (i = 0; i < s->n_chan; i++) { in das08_common_attach()
394 s->readback[i] = s->maxdata / 2; in das08_common_attach()
395 das08_ao_set_data(dev, i, s->readback[i]); in das08_common_attach()
398 s->type = COMEDI_SUBD_UNUSED; in das08_common_attach()
401 s = &dev->subdevices[2]; in das08_common_attach()
403 if (board->di_nchan) { in das08_common_attach()
404 s->type = COMEDI_SUBD_DI; in das08_common_attach()
405 s->subdev_flags = SDF_READABLE; in das08_common_attach()
406 s->n_chan = board->di_nchan; in das08_common_attach()
407 s->maxdata = 1; in das08_common_attach()
408 s->range_table = &range_digital; in das08_common_attach()
409 s->insn_bits = board->is_jr ? das08jr_di_insn_bits : in das08_common_attach()
412 s->type = COMEDI_SUBD_UNUSED; in das08_common_attach()
415 s = &dev->subdevices[3]; in das08_common_attach()
417 if (board->do_nchan) { in das08_common_attach()
418 s->type = COMEDI_SUBD_DO; in das08_common_attach()
419 s->subdev_flags = SDF_WRITABLE; in das08_common_attach()
420 s->n_chan = board->do_nchan; in das08_common_attach()
421 s->maxdata = 1; in das08_common_attach()
422 s->range_table = &range_digital; in das08_common_attach()
423 s->insn_bits = board->is_jr ? das08jr_do_insn_bits : in das08_common_attach()
426 s->type = COMEDI_SUBD_UNUSED; in das08_common_attach()
429 s = &dev->subdevices[4]; in das08_common_attach()
431 if (board->i8255_offset != 0) { in das08_common_attach()
432 ret = subdev_8255_io_init(dev, s, board->i8255_offset); in das08_common_attach()
436 s->type = COMEDI_SUBD_UNUSED; in das08_common_attach()
440 s = &dev->subdevices[5]; in das08_common_attach()
441 if (board->i8254_offset) { in das08_common_attach()
442 dev->pacer = in das08_common_attach()
443 comedi_8254_io_alloc(dev->iobase + board->i8254_offset, in das08_common_attach()
445 if (IS_ERR(dev->pacer)) in das08_common_attach()
446 return PTR_ERR(dev->pacer); in das08_common_attach()
448 comedi_8254_subdevice_init(s, dev->pacer); in das08_common_attach()
450 s->type = COMEDI_SUBD_UNUSED; in das08_common_attach()