|
27 | 27 | *
|
28 | 28 | * The board supports interrupts on change of state of the digital inputs.
|
29 | 29 | * The sample data returned by the async command indicates which inputs
|
30 |
| - * changed state: |
| 30 | + * changed state and the current state of the inputs: |
31 | 31 | *
|
32 |
| - * Bit 7 - IRQ Enable (1) / Disable (0) |
33 |
| - * Bit 1 - Input 8-15 Changed State (1 = Changed, 0 = No Change) |
34 |
| - * Bit 0 - Input 0-7 Changed State (1 = Changed, 0 = No Change) |
| 32 | + * Bit 23 - IRQ Enable (1) / Disable (0) |
| 33 | + * Bit 17 - Input 8-15 Changed State (1 = Changed, 0 = No Change) |
| 34 | + * Bit 16 - Input 0-7 Changed State (1 = Changed, 0 = No Change) |
| 35 | + * Bit 15 - Digital input 15 |
| 36 | + * ... |
| 37 | + * Bit 0 - Digital input 0 |
35 | 38 | */
|
36 | 39 |
|
37 | 40 | #include <linux/module.h>
|
|
51 | 54 | #define AIO_IIRO_16_STATUS_INPUT_8_15 BIT(1)
|
52 | 55 | #define AIO_IIRO_16_STATUS_INPUT_0_7 BIT(0)
|
53 | 56 |
|
| 57 | +static unsigned int aio_iiro_16_read_inputs(struct comedi_device *dev) |
| 58 | +{ |
| 59 | + unsigned int val; |
| 60 | + |
| 61 | + val = inb(dev->iobase + AIO_IIRO_16_INPUT_0_7); |
| 62 | + val |= inb(dev->iobase + AIO_IIRO_16_INPUT_8_15) << 8; |
| 63 | + |
| 64 | + return val; |
| 65 | +} |
| 66 | + |
54 | 67 | static irqreturn_t aio_iiro_16_cos(int irq, void *d)
|
55 | 68 | {
|
56 | 69 | struct comedi_device *dev = d;
|
57 | 70 | struct comedi_subdevice *s = dev->read_subdev;
|
58 | 71 | unsigned int status;
|
| 72 | + unsigned int val; |
59 | 73 |
|
60 | 74 | status = inb(dev->iobase + AIO_IIRO_16_STATUS);
|
61 | 75 | if (!(status & AIO_IIRO_16_STATUS_IRQE))
|
62 | 76 | return IRQ_NONE;
|
63 | 77 |
|
64 |
| - comedi_buf_write_samples(s, &status, 1); |
| 78 | + val = aio_iiro_16_read_inputs(dev); |
| 79 | + val |= (status << 16); |
| 80 | + |
| 81 | + comedi_buf_write_samples(s, &val, 1); |
65 | 82 | comedi_handle_events(dev, s);
|
66 | 83 |
|
67 | 84 | return IRQ_HANDLED;
|
@@ -150,9 +167,7 @@ static int aio_iiro_16_di_insn_bits(struct comedi_device *dev,
|
150 | 167 | struct comedi_insn *insn,
|
151 | 168 | unsigned int *data)
|
152 | 169 | {
|
153 |
| - data[1] = 0; |
154 |
| - data[1] |= inb(dev->iobase + AIO_IIRO_16_INPUT_0_7); |
155 |
| - data[1] |= inb(dev->iobase + AIO_IIRO_16_INPUT_8_15) << 8; |
| 170 | + data[1] = aio_iiro_16_read_inputs(dev); |
156 | 171 |
|
157 | 172 | return insn->n;
|
158 | 173 | }
|
@@ -207,7 +222,7 @@ static int aio_iiro_16_attach(struct comedi_device *dev,
|
207 | 222 | s->insn_bits = aio_iiro_16_di_insn_bits;
|
208 | 223 | if (dev->irq) {
|
209 | 224 | dev->read_subdev = s;
|
210 |
| - s->subdev_flags |= SDF_CMD_READ; |
| 225 | + s->subdev_flags |= SDF_CMD_READ | SDF_LSAMPL; |
211 | 226 | s->len_chanlist = 1;
|
212 | 227 | s->do_cmdtest = aio_iiro_16_cos_cmdtest;
|
213 | 228 | s->do_cmd = aio_iiro_16_cos_cmd;
|
|
0 commit comments