00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <stdlib.h>
00022 #include <stdio.h>
00023 #include <string.h>
00024 #include <sys/ioctl.h>
00025 #include <unistd.h>
00026 #include <sys/types.h>
00027 #include <asm/types.h>
00028 #include <sys/stat.h>
00029 #include <fcntl.h>
00030 #include <signal.h>
00031 #include <sched.h>
00032 #include <sys/resource.h>
00033 #include <sys/io.h>
00034 #include <E12user.h>
00035 #include <packet.h>
00036 #include <coprocessor.h>
00037 #include <counter.h>
00038
00039 #define COUNTERRESPONSE BITMASK(COUNTER)
00040
00041 Cop_Data *Cop;
00042 int fd;
00043
00044 #define OPENDEV(filed,dev){if((filed = open(dev, O_RDWR))<=0){printf("couldn't open %s\n",dev);return -1;}}
00045
00046 static int help(void)
00047 {
00048 const char *help_table = "*********************************************************
00049 *E12count *
00050 *Nathan Z. Gustavson *
00051 *Emac.inc *
00052 *"__DATE__" *
00053 *usage: *
00054 *E12count /dev/37e12 mask flags rise/fall/both threshold *
00055 **********************************************************\n";
00056
00057
00058
00059 printf("%s",help_table);
00060
00061
00062 return 0;
00063 }
00064
00065 #define ARGCHECK(num){if(argc<num){printf("invalid number of arguements\n");help();return -1;}}
00066
00067
00068
00069
00070
00071
00072 static void CounterParser(int signal){
00073
00074 int rxnum =read(fd,buffer,sizeof(buffer));
00075 typemask = E12_Packet_Route(Cop, buffer, rxnum);
00076
00077 }
00078
00079
00080 static __u16 get_trigger(char *string)
00081 {
00082 if(!strcmp(string,"rise"))
00083 return RISEE;
00084 if(!strcmp(string,"fall"))
00085 return FALLE;
00086 if(!strcmp(string,"both"))
00087 return ANYE;
00088
00089 return NOE;
00090
00091 }
00092
00093
00094 static __u16 get_command(char *string)
00095 {
00096 if(!strcmp(string,"start"))
00097 return ICSTART;
00098 if(!strcmp(string,"stop"))
00099 return ICSTOP;
00100 if(!strcmp(string,"signal"))
00101 return ICNOTIFYON;
00102 if(!strcmp(string,"nosig"))
00103 return ICNOTIFYOFF;
00104
00105
00106 return NULLCOMMAND;
00107
00108 }
00109
00110
00111
00112
00113
00114 int main(int argc,char **argv)
00115 {
00116 int counter,trigger,thresh,flags;
00117 char command;
00118 char *device;
00119 __u16 threshold;
00120 long oflags;
00121 __u8 buffer[100];
00122 struct sigaction zero_signal;
00123
00124
00125
00126 ARGCHECK(3);
00127 device = argv[1];
00128 OPENDEV(fd,device);
00129
00130 command = *argv[2];
00131 counter=strtoul(argv[3],NULL,0);
00132
00133 Cop = CopDeviceCreate(0);
00134
00135 if((counter>7)||(counter<0))
00136 {
00137 printf("invalid counter\n");
00138 return -1;
00139 }
00140
00141 switch(command)
00142 {
00143 case 'r':
00144 E12_CounterValueRQ(fd, counter)
00145 break;
00146
00147
00148 case 's':
00149
00150 ARGCHECK(6);
00151
00152 if(!(trigger=get_trigger(argv[4])))
00153 {
00154 printf("invalid trigger %s\n",argv[4]);
00155 return -1;
00156 }
00157
00158 if((threshold=strtoul(argv[5],NULL,0)))
00159 flags = AUTOLOAD;
00160 else
00161 flags = 0;
00162
00163 E12_CountConfig(fd, counter, trigger, thresh,flags);
00164
00165 close(fd);
00166 break;
00167
00168 case 'c':
00169 ARGCHECK(5);
00170
00171
00172 ioctl(fd,get_command(argv[3]),NULL);
00173
00174 close(fd);
00175
00176 break;
00177
00178
00179 case 'l':
00180 ARGCHECK(4);
00181 sprintf(device,"/dev/count%x",counter);
00182
00183 if((fd = open(device, O_RDWR))<=0)
00184 {
00185 printf("couldn't open %s\n",device);
00186 return -1;
00187 }
00188
00189 threshold = (__u16)strtoul(argv[3],NULL,0);
00190
00191 write(fd,&threshold,sizeof(threshold));
00192
00193 close(fd);
00194
00195 break;
00196
00197 case 'z':
00198
00199
00200 ARGCHECK(5);
00201
00202 config.counter = counter;
00203
00204 if(!(config.trigger=get_trigger(argv[3])))
00205 {
00206 printf("invalid trigger %s\n",argv[4]);
00207 return -1;
00208 }
00209
00210 if((config.threshold=strtoul(argv[4],NULL,0)))
00211 config.flags = AUTOLOAD|ANOTE;
00212 else
00213 config.flags = ANOTE;
00214
00215
00216
00217 if((fd = open("/dev/dig1", O_RDWR))<=0)
00218 {
00219 printf("couldn't open /dev/dig1\n");
00220 return -1;
00221 }
00222
00223 ioctl(fd,PCD_COUNT,&config);
00224
00225 close(fd);
00226
00227 sprintf(device,"/dev/count%x",counter);
00228
00229 if((fd = open(device, O_RDWR))<=0)
00230 {
00231 printf("couldn't open %s\n",device);
00232 return -1;
00233 }
00234
00235 printf("Initializing \n");
00236
00237 sleep(2);
00238
00239 zero_signal.sa_handler = zero_counter;
00240
00241 sigaction(SIGIO, &zero_signal,NULL);
00242 fcntl(fd, F_SETOWN,getpid());
00243 oflags = fcntl(fd, F_GETFL);
00244 fcntl(fd,F_SETFL, oflags|FASYNC);
00245
00246
00247 printf("hit Cntrl-C to exit\n");
00248
00249 ioctl(fd,ICSTART,NULL);
00250
00251
00252 while(1);
00253
00254
00255 break;
00256
00257 case 'd':
00258 ARGCHECK(5);
00259
00260 config.counter = counter;
00261
00262 if(!(config.trigger=get_trigger(argv[3])))
00263 {
00264 printf("invalid trigger %s\n",argv[4]);
00265 return -1;
00266 }
00267
00268 if((config.threshold=strtoul(argv[4],NULL,0)))
00269 config.flags = AUTOLOAD|ANOTE|AUTOSTOP;
00270 else
00271 config.flags = ANOTE|AUTOSTOP;
00272
00273
00274
00275 if((fd = open("/dev/dig1", O_RDWR))<=0)
00276 {
00277 printf("couldn't open /dev/dig1\n");
00278 return -1;
00279 }
00280
00281 ioctl(fd,PCD_COUNT,&config);
00282
00283 close(fd);
00284
00285 sprintf(device,"/dev/count%x",counter);
00286
00287 if((fd = open(device, O_RDWR))<=0)
00288 {
00289 printf("couldn't open %s\n",device);
00290 return -1;
00291 }
00292
00293 printf("Initializing \n");
00294
00295 sleep(2);
00296
00297 zero_signal.sa_handler = terminate;
00298
00299 sigaction(SIGIO, &zero_signal,NULL);
00300 fcntl(fd, F_SETOWN,getpid());
00301 oflags = fcntl(fd, F_GETFL);
00302 fcntl(fd,F_SETFL, oflags|FASYNC);
00303
00304
00305
00306
00307
00308 printf("starting counter\n");
00309 ioctl(fd,ICSTART,NULL);
00310
00311
00312 while(waiting);
00313
00314 break;
00315
00316 }
00317
00318
00319
00320 close(fd);
00321
00322 return 0;
00323 }
00324
00325
00326
00327
00328
00329
00330