|
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