3 functions to retrieve kernel data
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>
36 #include <libinternal.h>
39 /* these functions download information from the comedi module. */
41 static int do_test_for_cmd(comedi_t *dev,unsigned int subdevice);
42 static int do_test_for_insn(comedi_t *dev);
43 static int do_test_for_insnlist(comedi_t *dev);
44 static int do_test_for_insn_bits(comedi_t *dev,unsigned int subdevice);
47 int get_subdevices(comedi_t *it)
54 s=malloc(sizeof(comedi_subdinfo)*it->n_subdevices);
57 ret=ioctl_subdinfo(it->fd,s);
60 r=it->subdevices=realloc(it->subdevices,
61 sizeof(subdevice)*it->n_subdevices);
63 memset(r,0,sizeof(subdevice)*it->n_subdevices);
65 it->has_insnlist_ioctl = do_test_for_insnlist(it);
66 it->has_insn_ioctl = do_test_for_insn(it);
67 for(i=0;i<it->n_subdevices;i++){
68 r[i].type = s[i].type;
69 if(r[i].type==COMEDI_SUBD_UNUSED)continue;
70 r[i].n_chan = s[i].n_chan;
71 r[i].subd_flags = s[i].subd_flags;
72 r[i].timer_type = s[i].timer_type;
73 r[i].len_chanlist = s[i].len_chanlist;
74 r[i].maxdata = s[i].maxdata;
75 r[i].flags = s[i].flags;
76 r[i].range_type = s[i].range_type;
78 if(r[i].subd_flags&SDF_FLAGS){
79 r[i].flags_list=malloc(sizeof(*r[i].flags_list)*r[i].n_chan);
80 debug_ptr(r[i].flags_list);
82 if(r[i].subd_flags&SDF_MAXDATA){
83 r[i].maxdata_list=malloc(sizeof(*r[i].maxdata_list)*r[i].n_chan);
84 debug_ptr(r[i].maxdata_list);
86 if(r[i].subd_flags&SDF_RANGETYPE){
87 r[i].range_type_list=malloc(sizeof(*r[i].range_type_list)*r[i].n_chan);
88 debug_ptr(r[i].range_type_list);
90 ret=ioctl_chaninfo(it->fd,i,r[i].maxdata_list,r[i].flags_list,r[i].range_type_list);
93 if(r[i].subd_flags&SDF_RANGETYPE){
94 r[i].rangeinfo_list=malloc(sizeof(*r[i].rangeinfo_list)*r[i].n_chan);
95 debug_ptr(r[i].rangeinfo_list);
96 for(j=0;j<r[i].n_chan;j++){
97 r[i].rangeinfo_list[j]=get_rangeinfo(it->fd,r[i].range_type_list[j]);
100 r[i].rangeinfo=get_rangeinfo(it->fd,r[i].range_type);
103 r[i].has_cmd = do_test_for_cmd(it,i);
104 if(it->has_insnlist_ioctl){
105 r[i].has_insn_bits = do_test_for_insn_bits(it,i);
107 r[i].has_insn_bits = 0;
116 comedi_range *get_rangeinfo(int fd,unsigned int range_type)
123 kr=malloc(sizeof(comedi_krange)*RANGE_LENGTH(range_type));
124 r=malloc(sizeof(comedi_range)*RANGE_LENGTH(range_type));
126 ret=ioctl_rangeinfo(fd,range_type,kr);
128 fprintf(stderr,"ioctl_rangeinfo(%d,0x%08x,%p)\n",fd,range_type,kr);
131 for(i=0;i<RANGE_LENGTH(range_type);i++){
132 r[i].min=kr[i].min*1e-6;
133 r[i].max=kr[i].max*1e-6;
134 r[i].unit=kr[i].flags;
142 /* some command testing */
144 static int do_test_for_cmd(comedi_t *dev,unsigned int subdevice)
149 memset(&it,0,sizeof(it));
151 it.subdev = subdevice;
152 it.start_src = TRIG_ANY;
153 it.scan_begin_src = TRIG_ANY;
154 it.convert_src = TRIG_ANY;
155 it.scan_end_src = TRIG_ANY;
156 it.stop_src = TRIG_ANY;
158 ret = ioctl(dev->fd,COMEDI_CMDTEST,&it);
160 if(ret<0 && errno==EIO){
164 fprintf(stderr,"BUG in do_test_for_cmd()\n");
170 static int do_test_for_insnlist(comedi_t *dev)
177 memset(&insn,0,sizeof(insn));
182 insn.insn = INSN_GTOD;
186 ret = ioctl(dev->fd,COMEDI_INSNLIST,&il);
190 fprintf(stderr,"BUG in do_test_for_insn()\n");
197 /* the COMEID_INSN ioctl was introduced in comedi-0.7.60 */
198 static int do_test_for_insn(comedi_t *dev)
205 memset(&insn,0,sizeof(insn));
210 insn.insn = INSN_GTOD;
214 ret = ioctl(dev->fd,COMEDI_INSN,&insn);
218 fprintf(stderr,"BUG in do_test_for_insn()\n");
225 static int do_test_for_insn_bits(comedi_t *dev,unsigned int subdevice)
232 memset(&insn,0,sizeof(insn));
237 insn.insn = INSN_BITS;
240 insn.subdev = subdevice;
245 ret = comedi_do_insnlist(dev,&il);
247 if(ret<0 && (errno==EINVAL || errno==EIO)){
251 perror("BUG in do_test_for_insn_bits()\n");