5 COMEDILIB - Linux Control and Measurement Device Interface Library
6 Copyright (C) 1997-2001 David A. Schleef <ds@schleef.org>
8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public
10 License as published by the Free Software Foundation, version 2.1
13 This library 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 GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with this library; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
27 #include <sys/types.h>
31 #include <sys/ioctl.h>
35 #include "libinternal.h"
37 INTERNAL int __comedi_init=0;
39 INTERNAL void initialize(void)
45 if( (s=getenv("COMEDILIB_LOGLEVEL")) ){
46 __comedi_loglevel=strtol(s,NULL,0);
47 COMEDILIB_DEBUG(3,"setting loglevel to %d\n",__comedi_loglevel);
51 EXPORT_ALIAS_DEFAULT(_comedi_open,comedi_open,0.7.18);
52 comedi_t* _comedi_open(const char *fn)
59 if(!(it=malloc(sizeof(comedi_t))))
61 memset(it,0,sizeof(comedi_t));
63 if((it->fd=open(fn,O_RDWR))<0){
68 if(comedi_ioctl(it->fd, COMEDI_DEVINFO, &it->devinfo) < 0)
71 it->n_subdevices=it->devinfo.n_subdevs;
73 if(get_subdevices(it) < 0)
76 it->magic=COMEDILIB_MAGIC;
81 /* As long as get_subdevices is the last action above,
82 it->subdevices should not need any cleanup, since
83 get_subdevices should have done the cleanup already */
92 EXPORT_ALIAS_DEFAULT(_comedi_close,comedi_close,0.7.18);
93 int _comedi_close(comedi_t *it)
102 for(i=0;i<it->n_subdevices;i++){
104 if(s->type==COMEDI_SUBD_UNUSED)
107 if(s->subd_flags&SDF_FLAGS){
110 if(s->subd_flags&SDF_MAXDATA){
111 free(s->maxdata_list);
113 if(s->subd_flags&SDF_RANGETYPE){
114 free(s->range_type_list);
115 for(j=0;j<s->n_chan;j++)
116 free(s->rangeinfo_list[j]);
117 free(s->rangeinfo_list);
121 if(s->cmd_mask)free(s->cmd_mask);
122 if(s->cmd_timed)free(s->cmd_timed);
125 free(it->subdevices);
132 EXPORT_ALIAS_DEFAULT(_comedi_cancel,comedi_cancel,0.7.18);
133 int _comedi_cancel(comedi_t *it,unsigned int subdevice)
135 if(!valid_dev(it)) return -1;
136 return comedi_ioctl(it->fd, COMEDI_CANCEL, (void*)(unsigned long)subdevice);
139 EXPORT_ALIAS_DEFAULT(_comedi_poll,comedi_poll,0.7.18);
140 int _comedi_poll(comedi_t *it,unsigned int subdevice)
142 if(!valid_dev(it)) return -1;
143 return comedi_ioctl(it->fd, COMEDI_POLL, (void*)(unsigned long)subdevice);
146 EXPORT_ALIAS_DEFAULT(_comedi_fileno,comedi_fileno,0.7.18);
147 int _comedi_fileno(comedi_t *it)
149 if(!valid_dev(it)) return -1;
153 EXPORT_ALIAS_DEFAULT(_comedi_trigger,comedi_trigger,0.7.18);
154 int _comedi_trigger(comedi_t *it,comedi_trig *t)
156 if(!valid_dev(it) || !t)
159 return comedi_ioctl(it->fd, COMEDI_TRIG, t);
162 EXPORT_ALIAS_DEFAULT(_comedi_command,comedi_command,0.7.18);
163 int _comedi_command(comedi_t *it,comedi_cmd *t)
166 if(!valid_dev(it)) return -1;
167 ret = comedi_ioctl(it->fd, COMEDI_CMD, t);
168 __comedi_errno = errno;
169 switch(__comedi_errno){
171 __comedi_errno = ECMDNOTSUPP;
177 EXPORT_ALIAS_DEFAULT(_comedi_command_test,comedi_command_test,0.7.18);
178 int _comedi_command_test(comedi_t *it,comedi_cmd *t)
181 if(!valid_dev(it)) return -1;
182 ret = comedi_ioctl(it->fd, COMEDI_CMDTEST, t);
183 __comedi_errno = errno;
184 switch(__comedi_errno){
186 __comedi_errno = ECMDNOTSUPP;
192 EXPORT_ALIAS_DEFAULT(_comedi_do_insnlist,comedi_do_insnlist,0.7.18);
193 int _comedi_do_insnlist(comedi_t *it,comedi_insnlist *il)
196 if(!valid_dev(it)) return -1;
197 ret = comedi_ioctl(it->fd, COMEDI_INSNLIST, il);
198 __comedi_errno = errno;
202 EXPORT_ALIAS_DEFAULT(_comedi_do_insn,comedi_do_insn,0.7.18);
203 int _comedi_do_insn(comedi_t *it,comedi_insn *insn)
205 if(!valid_dev(it)) return -1;
206 if(it->has_insn_ioctl){
207 return comedi_ioctl(it->fd, COMEDI_INSN, insn);
215 ret = comedi_ioctl(it->fd, COMEDI_INSNLIST, &il);
222 EXPORT_ALIAS_DEFAULT(_comedi_lock,comedi_lock,0.7.18);
223 int _comedi_lock(comedi_t *it,unsigned int subdevice)
225 if(!valid_dev(it)) return -1;
226 return comedi_ioctl(it->fd, COMEDI_LOCK, (void*)(unsigned long)subdevice);
229 EXPORT_ALIAS_DEFAULT(_comedi_unlock,comedi_unlock,0.7.18);
230 int _comedi_unlock(comedi_t *it,unsigned int subdevice)
232 if(!valid_dev(it)) return -1;
233 return comedi_ioctl(it->fd, COMEDI_UNLOCK, (void*)(unsigned long)subdevice);