return i;
}
-/*
- Write a masked set of bits and the read back the port.
- We track what the bits should be (i.e. we don't read the port first).
-
- DIO devices are slightly special. Although it is possible to
- * implement the insn_read/insn_write interface, it is much more
- * useful to applications if you implement the insn_bits interface.
- * This allows packed reading/writing of the DIO channels. The
- * comedi core can convert between insn_bits and insn_read/write
- */
static int rtd_dio_insn_bits(struct comedi_device *dev,
struct comedi_subdevice *s,
- struct comedi_insn *insn, unsigned int *data)
+ struct comedi_insn *insn,
+ unsigned int *data)
{
struct rtdPrivate *devpriv = dev->private;
+ unsigned int mask = data[0];
+ unsigned int bits = data[1];
- /* The insn data is a mask in data[0] and the new data
- * in data[1], each channel cooresponding to a bit. */
- if (data[0]) {
- s->state &= ~data[0];
- s->state |= data[0] & data[1];
+ if (mask) {
+ s->state &= ~mask;
+ s->state |= (bits & mask);
- /* Write out the new digital output lines */
writew(s->state & 0xff, devpriv->las0 + LAS0_DIO0);
}
- /* on return, data[1] contains the value of the digital
- * input lines. */
+
data[1] = readw(devpriv->las0 + LAS0_DIO0) & 0xff;
return insn->n;