![]() |
RTXI 1.3
|
00001 /* 00002 lib/comedi.c 00003 generic functions 00004 00005 COMEDILIB - Linux Control and Measurement Device Interface Library 00006 Copyright (C) 1997-2001 David A. Schleef <ds@schleef.org> 00007 00008 This library is free software; you can redistribute it and/or 00009 modify it under the terms of the GNU Lesser General Public 00010 License as published by the Free Software Foundation, version 2.1 00011 of the License. 00012 00013 This library is distributed in the hope that it will be useful, 00014 but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00016 Lesser General Public License for more details. 00017 00018 You should have received a copy of the GNU Lesser General Public 00019 License along with this library; if not, write to the Free Software 00020 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 00021 USA. 00022 */ 00023 00024 #include <stdio.h> 00025 #include <math.h> 00026 #include <stdlib.h> 00027 #include <sys/types.h> 00028 #include <sys/stat.h> 00029 #include <fcntl.h> 00030 #include <unistd.h> 00031 #include <sys/ioctl.h> 00032 #include <errno.h> 00033 #include <string.h> 00034 00035 #include "libinternal.h" 00036 00037 INTERNAL int __comedi_init=0; 00038 00039 INTERNAL void initialize(void) 00040 { 00041 char *s; 00042 00043 __comedi_init=1; 00044 00045 if( (s=getenv("COMEDILIB_LOGLEVEL")) ){ 00046 __comedi_loglevel=strtol(s,NULL,0); 00047 COMEDILIB_DEBUG(3,"setting loglevel to %d\n",__comedi_loglevel); 00048 } 00049 } 00050 00051 EXPORT_ALIAS_DEFAULT(_comedi_open,comedi_open,0.7.18); 00052 comedi_t* _comedi_open(const char *fn) 00053 { 00054 comedi_t *it; 00055 00056 if(!__comedi_init) 00057 initialize(); 00058 00059 if(!(it=malloc(sizeof(comedi_t)))) 00060 goto cleanup; 00061 memset(it,0,sizeof(comedi_t)); 00062 00063 if((it->fd=open(fn,O_RDWR))<0){ 00064 libc_error(); 00065 goto cleanup; 00066 } 00067 00068 if(comedi_ioctl(it->fd, COMEDI_DEVINFO, &it->devinfo) < 0) 00069 goto cleanup; 00070 00071 it->n_subdevices=it->devinfo.n_subdevs; 00072 00073 if(get_subdevices(it) < 0) 00074 goto cleanup; 00075 00076 it->magic=COMEDILIB_MAGIC; 00077 00078 return it; 00079 cleanup: 00080 if(it) 00081 free(it); 00082 00083 return NULL; 00084 } 00085 00086 EXPORT_ALIAS_DEFAULT(_comedi_close,comedi_close,0.7.18); 00087 int _comedi_close(comedi_t *it) 00088 { 00089 subdevice *s; 00090 int i,j; 00091 00092 if(!valid_dev(it)) 00093 return -1; 00094 it->magic=0; 00095 00096 for(i=0;i<it->n_subdevices;i++){ 00097 s=it->subdevices+i; 00098 if(s->type==COMEDI_SUBD_UNUSED) 00099 continue; 00100 00101 if(s->subd_flags&SDF_FLAGS){ 00102 free(s->flags_list); 00103 } 00104 if(s->subd_flags&SDF_MAXDATA){ 00105 free(s->maxdata_list); 00106 } 00107 if(s->subd_flags&SDF_RANGETYPE){ 00108 free(s->range_type_list); 00109 for(j=0;j<s->n_chan;j++) 00110 free(s->rangeinfo_list[j]); 00111 free(s->rangeinfo_list); 00112 }else{ 00113 free(s->rangeinfo); 00114 } 00115 if(s->cmd_mask)free(s->cmd_mask); 00116 if(s->cmd_timed)free(s->cmd_timed); 00117 } 00118 if(it->subdevices){ 00119 free(it->subdevices); 00120 } 00121 close(it->fd); 00122 free(it); 00123 return 0; 00124 } 00125 00126 EXPORT_ALIAS_DEFAULT(_comedi_cancel,comedi_cancel,0.7.18); 00127 int _comedi_cancel(comedi_t *it,unsigned int subdevice) 00128 { 00129 if(!valid_dev(it)) return -1; 00130 return comedi_ioctl(it->fd, COMEDI_CANCEL, (void*)(unsigned long)subdevice); 00131 } 00132 00133 EXPORT_ALIAS_DEFAULT(_comedi_poll,comedi_poll,0.7.18); 00134 int _comedi_poll(comedi_t *it,unsigned int subdevice) 00135 { 00136 if(!valid_dev(it)) return -1; 00137 return comedi_ioctl(it->fd, COMEDI_POLL, (void*)(unsigned long)subdevice); 00138 } 00139 00140 EXPORT_ALIAS_DEFAULT(_comedi_fileno,comedi_fileno,0.7.18); 00141 int _comedi_fileno(comedi_t *it) 00142 { 00143 if(!valid_dev(it)) return -1; 00144 return it->fd; 00145 } 00146 00147 EXPORT_ALIAS_DEFAULT(_comedi_trigger,comedi_trigger,0.7.18); 00148 int _comedi_trigger(comedi_t *it,comedi_trig *t) 00149 { 00150 if(!valid_dev(it) || !t) 00151 return -1; 00152 00153 return comedi_ioctl(it->fd, COMEDI_TRIG, t); 00154 } 00155 00156 EXPORT_ALIAS_DEFAULT(_comedi_command,comedi_command,0.7.18); 00157 int _comedi_command(comedi_t *it,comedi_cmd *t) 00158 { 00159 int ret; 00160 if(!valid_dev(it)) return -1; 00161 ret = comedi_ioctl(it->fd, COMEDI_CMD, t); 00162 __comedi_errno = errno; 00163 switch(__comedi_errno){ 00164 case EIO: 00165 __comedi_errno = ECMDNOTSUPP; 00166 break; 00167 } 00168 return ret; 00169 } 00170 00171 EXPORT_ALIAS_DEFAULT(_comedi_command_test,comedi_command_test,0.7.18); 00172 int _comedi_command_test(comedi_t *it,comedi_cmd *t) 00173 { 00174 int ret; 00175 if(!valid_dev(it)) return -1; 00176 ret = comedi_ioctl(it->fd, COMEDI_CMDTEST, t); 00177 __comedi_errno = errno; 00178 switch(__comedi_errno){ 00179 case EIO: 00180 __comedi_errno = ECMDNOTSUPP; 00181 break; 00182 } 00183 return ret; 00184 } 00185 00186 EXPORT_ALIAS_DEFAULT(_comedi_do_insnlist,comedi_do_insnlist,0.7.18); 00187 int _comedi_do_insnlist(comedi_t *it,comedi_insnlist *il) 00188 { 00189 int ret; 00190 if(!valid_dev(it)) return -1; 00191 ret = comedi_ioctl(it->fd, COMEDI_INSNLIST, il); 00192 __comedi_errno = errno; 00193 return ret; 00194 } 00195 00196 EXPORT_ALIAS_DEFAULT(_comedi_do_insn,comedi_do_insn,0.7.18); 00197 int _comedi_do_insn(comedi_t *it,comedi_insn *insn) 00198 { 00199 if(!valid_dev(it)) return -1; 00200 if(it->has_insn_ioctl){ 00201 return comedi_ioctl(it->fd, COMEDI_INSN, insn); 00202 }else{ 00203 comedi_insnlist il; 00204 int ret; 00205 00206 il.n_insns = 1; 00207 il.insns = insn; 00208 00209 ret = comedi_ioctl(it->fd, COMEDI_INSNLIST, &il); 00210 00211 if(ret<0)return ret; 00212 return insn->n; 00213 } 00214 } 00215 00216 EXPORT_ALIAS_DEFAULT(_comedi_lock,comedi_lock,0.7.18); 00217 int _comedi_lock(comedi_t *it,unsigned int subdevice) 00218 { 00219 if(!valid_dev(it)) return -1; 00220 return comedi_ioctl(it->fd, COMEDI_LOCK, (void*)(unsigned long)subdevice); 00221 } 00222 00223 EXPORT_ALIAS_DEFAULT(_comedi_unlock,comedi_unlock,0.7.18); 00224 int _comedi_unlock(comedi_t *it,unsigned int subdevice) 00225 { 00226 if(!valid_dev(it)) return -1; 00227 return comedi_ioctl(it->fd, COMEDI_UNLOCK, (void*)(unsigned long)subdevice); 00228 } 00229