2 * comedi/drivers/acl7225b.c
3 * Driver for Adlink NuDAQ ACL-7225b and clones
8 Description: Adlink NuDAQ ACL-7225b & compatibles
9 Author: José Luis Sánchez (jsanchezv@teleline.es)
11 Devices: [Adlink] ACL-7225b (acl7225b), [ICP] P16R16DIO (p16r16dio)
14 #include "../comedidev.h"
16 #include <linux/ioport.h>
18 #define ACL7225_RIO_LO 0 /* Relays input/output low byte (R0-R7) */
19 #define ACL7225_RIO_HI 1 /* Relays input/output high byte (R8-R15) */
20 #define ACL7225_DI_LO 2 /* Digital input low byte (DI0-DI7) */
21 #define ACL7225_DI_HI 3 /* Digital input high byte (DI8-DI15) */
23 struct acl7225b_boardinfo
{
28 static const struct acl7225b_boardinfo acl7225b_boards
[] = {
31 .io_range
= 8, /* only 4 are used */
38 static int acl7225b_do_insn_bits(struct comedi_device
*dev
,
39 struct comedi_subdevice
*s
,
40 struct comedi_insn
*insn
,
43 unsigned long reg
= (unsigned long)s
->private;
44 unsigned int mask
= data
[0];
45 unsigned int bits
= data
[1];
49 s
->state
|= (bits
& mask
);
52 outb(s
->state
& 0xff, dev
->iobase
+ reg
);
54 outb((s
->state
>> 8), dev
->iobase
+ reg
+ 1);
62 static int acl7225b_di_insn_bits(struct comedi_device
*dev
,
63 struct comedi_subdevice
*s
,
64 struct comedi_insn
*insn
,
67 unsigned long reg
= (unsigned long)s
->private;
69 data
[1] = inb(dev
->iobase
+ reg
) |
70 (inb(dev
->iobase
+ reg
+ 1) << 8);
75 static int acl7225b_attach(struct comedi_device
*dev
,
76 struct comedi_devconfig
*it
)
78 const struct acl7225b_boardinfo
*board
= comedi_board(dev
);
79 struct comedi_subdevice
*s
;
82 ret
= comedi_request_region(dev
, it
->options
[0], board
->io_range
);
86 ret
= comedi_alloc_subdevices(dev
, 3);
90 s
= &dev
->subdevices
[0];
92 s
->type
= COMEDI_SUBD_DO
;
93 s
->subdev_flags
= SDF_WRITABLE
;
96 s
->insn_bits
= acl7225b_do_insn_bits
;
97 s
->range_table
= &range_digital
;
98 s
->private = (void *)ACL7225_RIO_LO
;
100 s
= &dev
->subdevices
[1];
102 s
->type
= COMEDI_SUBD_DI
;
103 s
->subdev_flags
= SDF_READABLE
;
106 s
->insn_bits
= acl7225b_di_insn_bits
;
107 s
->range_table
= &range_digital
;
108 s
->private = (void *)ACL7225_RIO_LO
;
110 s
= &dev
->subdevices
[2];
111 /* Isolated digital inputs */
112 s
->type
= COMEDI_SUBD_DI
;
113 s
->subdev_flags
= SDF_READABLE
;
116 s
->insn_bits
= acl7225b_di_insn_bits
;
117 s
->range_table
= &range_digital
;
118 s
->private = (void *)ACL7225_DI_LO
;
123 static struct comedi_driver acl7225b_driver
= {
124 .driver_name
= "acl7225b",
125 .module
= THIS_MODULE
,
126 .attach
= acl7225b_attach
,
127 .detach
= comedi_legacy_detach
,
128 .board_name
= &acl7225b_boards
[0].name
,
129 .num_names
= ARRAY_SIZE(acl7225b_boards
),
130 .offset
= sizeof(struct acl7225b_boardinfo
),
132 module_comedi_driver(acl7225b_driver
);
134 MODULE_DESCRIPTION("Comedi: NuDAQ ACL-7225B, 16 Relay & 16 Isolated DI Card");
135 MODULE_AUTHOR("Comedi http://www.comedi.org");
136 MODULE_LICENSE("GPL");