Lines Matching +full:board +full:- +full:2

1 // SPDX-License-Identifier: GPL-2.0
4 * Driver for Advantech PCL-730 and clones
10 * Description: Advantech PCL-730 (& compatibles)
11 * Devices: [Advantech] PCL-730 (pcl730), PCM-3730 (pcm3730), PCL-725 (pcl725),
12 * PCL-733 (pcl733), PCL-734 (pcl734),
13 * [ADLink] ACL-7130 (acl7130), ACL-7225b (acl7225b),
14 * [ICP] ISO-730 (iso730), P8R8-DIO (p8r8dio), P16R16-DIO (p16r16dio),
15 * [Diamond Systems] OPMM-1616-XT (opmm-1616-xt), PEARL-MM-P (pearl-mm-p),
16 * IR104-PBF (ir104-pbf),
21 * [0] - I/O port base
24 * The ACL-7130 card has an 8254 timer/counter not supported by this driver.
33 * The register map varies slightly depending on the board type but
34 * all registers are 8-bit.
37 * proper range required by the board.
45 * BASE+0 Isolated outputs 0-7 (write) / inputs 0-7 (read)
46 * BASE+1 Isolated outputs 8-15 (write) / inputs 8-15 (read)
47 * BASE+2 TTL outputs 0-7 (write) / inputs 0-7 (read)
48 * BASE+3 TTL outputs 8-15 (write) / inputs 8-15 (read)
50 * The pcm3730 board does not have register BASE+1.
54 * BASE+0 Isolated outputs 0-7 (write) (read back on p8r8dio)
55 * BASE+1 Isolated inputs 0-7 (read)
59 * BASE+0 Isolated outputs 0-7 (write) (read back)
60 * BASE+1 Isolated outputs 8-15 (write) (read back)
61 * BASE+2 Isolated inputs 0-7 (read)
62 * BASE+3 Isolated inputs 8-15 (read)
66 * BASE+0 Isolated outputs 0-7 (write) or inputs 0-7 (read)
67 * BASE+1 Isolated outputs 8-15 (write) or inputs 8-15 (read)
68 * BASE+2 Isolated outputs 16-23 (write) or inputs 16-23 (read)
69 * BASE+3 Isolated outputs 24-31 (write) or inputs 24-31 (read)
71 * The opmm-1616-xt board has this register mapping:
73 * BASE+0 Isolated outputs 0-7 (write) (read back)
74 * BASE+1 Isolated outputs 8-15 (write) (read back)
75 * BASE+2 Isolated inputs 0-7 (read)
76 * BASE+3 Isolated inputs 8-15 (read)
80 * BASE+2 Relay select register (write)
81 * BASE+3 Board reset control register (write)
83 * BASE+4 Change detect 7-0 status register (read)
85 * BASE+5 Change detect 15-8 status register (read)
87 * The pearl-mm-p board has this register mapping:
89 * BASE+0 Isolated outputs 0-7 (write)
90 * BASE+1 Isolated outputs 8-15 (write)
92 * The ir104-pbf board has this register mapping:
94 * BASE+0 Isolated outputs 0-7 (write) (read back)
95 * BASE+1 Isolated outputs 8-15 (write) (read back)
96 * BASE+2 Isolated outputs 16-19 (write) (read back)
97 * BASE+4 Isolated inputs 0-7 (read)
98 * BASE+5 Isolated inputs 8-15 (read)
99 * BASE+6 Isolated inputs 16-19 (read)
152 .n_subdevs = 2,
160 .n_subdevs = 2,
168 .n_subdevs = 2,
176 .n_subdevs = 2,
190 .name = "opmm-1616-xt",
194 .n_subdevs = 2,
198 .name = "pearl-mm-p",
203 .name = "ir104-pbf",
217 unsigned long reg = (unsigned long)s->private; in pcl730_do_insn_bits()
223 outb(s->state & 0xff, dev->iobase + reg); in pcl730_do_insn_bits()
224 if ((mask & 0xff00) && (s->n_chan > 8)) in pcl730_do_insn_bits()
225 outb((s->state >> 8) & 0xff, dev->iobase + reg + 1); in pcl730_do_insn_bits()
226 if ((mask & 0xff0000) && (s->n_chan > 16)) in pcl730_do_insn_bits()
227 outb((s->state >> 16) & 0xff, dev->iobase + reg + 2); in pcl730_do_insn_bits()
228 if ((mask & 0xff000000) && (s->n_chan > 24)) in pcl730_do_insn_bits()
229 outb((s->state >> 24) & 0xff, dev->iobase + reg + 3); in pcl730_do_insn_bits()
232 data[1] = s->state; in pcl730_do_insn_bits()
234 return insn->n; in pcl730_do_insn_bits()
240 unsigned long reg = (unsigned long)s->private; in pcl730_get_bits()
243 val = inb(dev->iobase + reg); in pcl730_get_bits()
244 if (s->n_chan > 8) in pcl730_get_bits()
245 val |= (inb(dev->iobase + reg + 1) << 8); in pcl730_get_bits()
246 if (s->n_chan > 16) in pcl730_get_bits()
247 val |= (inb(dev->iobase + reg + 2) << 16); in pcl730_get_bits()
248 if (s->n_chan > 24) in pcl730_get_bits()
249 val |= (inb(dev->iobase + reg + 3) << 24); in pcl730_get_bits()
261 return insn->n; in pcl730_di_insn_bits()
267 const struct pcl730_board *board = dev->board_ptr; in pcl730_attach() local
272 ret = comedi_request_region(dev, it->options[0], board->io_range); in pcl730_attach()
276 ret = comedi_alloc_subdevices(dev, board->n_subdevs); in pcl730_attach()
282 if (board->n_iso_out_chan) { in pcl730_attach()
284 s = &dev->subdevices[subdev++]; in pcl730_attach()
285 s->type = COMEDI_SUBD_DO; in pcl730_attach()
286 s->subdev_flags = SDF_WRITABLE; in pcl730_attach()
287 s->n_chan = board->n_iso_out_chan; in pcl730_attach()
288 s->maxdata = 1; in pcl730_attach()
289 s->range_table = &range_digital; in pcl730_attach()
290 s->insn_bits = pcl730_do_insn_bits; in pcl730_attach()
291 s->private = (void *)0; in pcl730_attach()
294 if (board->has_readback) in pcl730_attach()
295 s->state = pcl730_get_bits(dev, s); in pcl730_attach()
298 if (board->n_iso_in_chan) { in pcl730_attach()
300 s = &dev->subdevices[subdev++]; in pcl730_attach()
301 s->type = COMEDI_SUBD_DI; in pcl730_attach()
302 s->subdev_flags = SDF_READABLE; in pcl730_attach()
303 s->n_chan = board->n_iso_in_chan; in pcl730_attach()
304 s->maxdata = 1; in pcl730_attach()
305 s->range_table = &range_digital; in pcl730_attach()
306 s->insn_bits = pcl730_di_insn_bits; in pcl730_attach()
307 s->private = board->is_ir104 ? (void *)4 : in pcl730_attach()
308 board->is_acl7225b ? (void *)2 : in pcl730_attach()
309 board->is_pcl725 ? (void *)1 : (void *)0; in pcl730_attach()
312 if (board->has_ttl_io) { in pcl730_attach()
314 s = &dev->subdevices[subdev++]; in pcl730_attach()
315 s->type = COMEDI_SUBD_DO; in pcl730_attach()
316 s->subdev_flags = SDF_WRITABLE; in pcl730_attach()
317 s->n_chan = board->n_ttl_chan; in pcl730_attach()
318 s->maxdata = 1; in pcl730_attach()
319 s->range_table = &range_digital; in pcl730_attach()
320 s->insn_bits = pcl730_do_insn_bits; in pcl730_attach()
321 s->private = (void *)2; in pcl730_attach()
324 s = &dev->subdevices[subdev++]; in pcl730_attach()
325 s->type = COMEDI_SUBD_DI; in pcl730_attach()
326 s->subdev_flags = SDF_READABLE; in pcl730_attach()
327 s->n_chan = board->n_ttl_chan; in pcl730_attach()
328 s->maxdata = 1; in pcl730_attach()
329 s->range_table = &range_digital; in pcl730_attach()
330 s->insn_bits = pcl730_di_insn_bits; in pcl730_attach()
331 s->private = (void *)2; in pcl730_attach()
349 MODULE_DESCRIPTION("Comedi low-level driver");