2 kcomedilib/kcomedilib.c
3 a comedlib interface for kernel modules
5 COMEDI - Linux Control and Measurement Device Interface
6 Copyright (C) 1997-2000 David A. Schleef <ds@schleef.org>
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #define __NO_VERSION__
25 #include <linux/module.h>
27 #include <linux/errno.h>
28 #include <linux/kernel.h>
29 #include <linux/sched.h>
30 #include <linux/fcntl.h>
31 #include <linux/delay.h>
32 #include <linux/ioport.h>
36 #include "../comedi.h"
37 #include "../comedilib.h"
38 #include "../comedidev.h"
40 MODULE_AUTHOR("David Schleef <ds@schleef.org>");
41 MODULE_DESCRIPTION("Comedi kernel library");
42 MODULE_LICENSE("GPL");
44 struct comedi_device
*comedi_open(const char *filename
)
46 struct comedi_device_file_info
*dev_file_info
;
47 struct comedi_device
*dev
;
50 if (strncmp(filename
, "/dev/comedi", 11) != 0)
53 minor
= simple_strtoul(filename
+ 11, NULL
, 0);
55 if (minor
>= COMEDI_NUM_BOARD_MINORS
)
58 dev_file_info
= comedi_get_device_file_info(minor
);
59 if (dev_file_info
== NULL
)
61 dev
= dev_file_info
->device
;
63 if (dev
== NULL
|| !dev
->attached
)
66 if (!try_module_get(dev
->driver
->module
))
71 EXPORT_SYMBOL(comedi_open
);
73 int comedi_close(struct comedi_device
*d
)
75 struct comedi_device
*dev
= (struct comedi_device
*)d
;
77 module_put(dev
->driver
->module
);
81 EXPORT_SYMBOL(comedi_close
);
83 static int comedi_do_insn(struct comedi_device
*dev
, struct comedi_insn
*insn
)
85 struct comedi_subdevice
*s
;
88 /* a subdevice instruction */
89 if (insn
->subdev
>= dev
->n_subdevices
) {
93 s
= dev
->subdevices
+ insn
->subdev
;
95 if (s
->type
== COMEDI_SUBD_UNUSED
) {
96 printk(KERN_ERR
"%d not useable subdevice\n", insn
->subdev
);
102 ret
= comedi_check_chanlist(s
, 1, &insn
->chanspec
);
104 printk(KERN_ERR
"bad chanspec\n");
115 switch (insn
->insn
) {
117 ret
= s
->insn_bits(dev
, s
, insn
, insn
->data
);
120 ret
= s
->insn_config(dev
, s
, insn
, insn
->data
);
133 int comedi_dio_config(struct comedi_device
*dev
, unsigned int subdev
,
134 unsigned int chan
, unsigned int io
)
136 struct comedi_insn insn
;
138 memset(&insn
, 0, sizeof(insn
));
139 insn
.insn
= INSN_CONFIG
;
142 insn
.subdev
= subdev
;
143 insn
.chanspec
= CR_PACK(chan
, 0, 0);
145 return comedi_do_insn(dev
, &insn
);
147 EXPORT_SYMBOL(comedi_dio_config
);
149 int comedi_dio_bitfield(struct comedi_device
*dev
, unsigned int subdev
,
150 unsigned int mask
, unsigned int *bits
)
152 struct comedi_insn insn
;
153 unsigned int data
[2];
156 memset(&insn
, 0, sizeof(insn
));
157 insn
.insn
= INSN_BITS
;
160 insn
.subdev
= subdev
;
165 ret
= comedi_do_insn(dev
, &insn
);
171 EXPORT_SYMBOL(comedi_dio_bitfield
);
173 int comedi_find_subdevice_by_type(struct comedi_device
*dev
, int type
,
176 if (subd
> dev
->n_subdevices
)
179 for (; subd
< dev
->n_subdevices
; subd
++) {
180 if (dev
->subdevices
[subd
].type
== type
)
185 EXPORT_SYMBOL(comedi_find_subdevice_by_type
);
187 int comedi_get_n_channels(struct comedi_device
*dev
, unsigned int subdevice
)
189 struct comedi_subdevice
*s
= dev
->subdevices
+ subdevice
;
193 EXPORT_SYMBOL(comedi_get_n_channels
);