Subversion Repositories f9daq

Rev

Rev 81 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
52 f9daq 1
 
2
 
3
 
4
#include <cvirte.h>             
5
 
6
#include "PtsModule.h"
7
#include <userint.h>
8
#include "PtsModule_CVI.h"
9
#include <utility.h> 
10
#include <formatio.h>   
11
static int p1;
12
 
13
// ./pts -a 0x1000000 -v 1 -w 2 turn LED ON
14
// ./pts -a 0x1000000 -v 1 -w 1 turn LED OFF
15
#include <stdlib.h>
16
#include <stdio.h>
17
 
18
#include <ctype.h>
19
 
20
#include <string.h>
21
 
22
 
23
#ifndef CAEN_V1718 
24
//typedef unsigned long uint32_t;
25
#endif
26
/*
27
void Delay(double t){
28
usleep(t*1e6);
29
}
30
*/
31
 
32
 
33
 
34
int verbose;
35
uint32_t ptaddr=0;
36
char str[255];  
37
 
38
int Pts_write(uint32_t addr, uint32_t data ){
39
int i;
40
VME_A32D32_W(ptaddr+addr,&data);
41
return 0;
42
}
43
 
44
int Pts_Mwrite(uint32_t addr, uint32_t data ){
45
int i;
46
VME_A32D32_MW(ptaddr+addr,&data);
47
return 0;
48
}
49
 
50
int Pts_read(uint32_t addr, uint32_t *data ){
51
VME_A32D32_R(ptaddr+addr,data);
52
return 0;
53
}
54
 
55
 
56
int Pts_erase( int verbose ) {
57
  uint32_t dum;
58
 
59
  Pts_write( ADR_CSR1, 0 );
60
  Delay(0.1);
61
  Pts_read( ADR_CSR1, &dum);
62
  if( verbose ) {
63
    sprintf(str, "CSR1(0x%02x) = 0x%04x\n", ADR_CSR1,dum & 0xffff );
64
    SetCtrlVal (p1, P1_RESPONSE, str);
65
  }  
66
  Pts_write( ADR_CSR1, CSR1_PROGRAM_ );
67
  Delay(0.1);
68
  Pts_read( ADR_CSR1, &dum);
69
  if( verbose ) {
70
    sprintf( str, "CSR1(0x%02x) = 0x%04x\n", ADR_CSR1, dum & 0xffff );
71
    SetCtrlVal (p1, P1_RESPONSE, str);
72
  }  
73
  return 1;
74
}
75
 
76
int Pts_configure_bit( const char *filename, int mode, int verbose ) {
77
  int c,j;
78
  int dummyword;
79
  FILE *fp;
80
  const long byte_per_dot = BYTE_PER_DOT;
81
  unsigned long nchar = 0;
82
 
83
  if( ( fp = fopen( filename, "rb" ) ) == NULL ) {
84
    if( verbose ) {
85
      sprintf( str, "cannot open \"%s\"\n", filename );
86
    SetCtrlVal (p1, P1_RESPONSE, str);
87
        }
88
    return -1;
89
  }
90
  if(verbose) sprintf( str, "file \"%s\" opened.\n", filename );
91
 
92
  /* ------------------------------------------------------------ *\
93
    The data for the configuration start from 0xffff_ffff_aa99_aa66
94
    ( cf. xapp138; we don't know the definition of the BIT file )
95
  \* ------------------------------------------------------------ */
96
  dummyword = 0;
97
  do{
98
    if( (c = getc( fp )) == EOF ) {
99
      if(verbose) {
100
         sprintf(str, "EOF detected. Exit.\n");
101
 
102
         SetCtrlVal (p1, P1_RESPONSE, str);
103
    }
104
      return -1;
105
    }
106
    (c == 0xff) ? dummyword++ : (dummyword=0);
107
  } while( dummyword < 4 );
108
 
109
//  const long byte_per_dot = BYTE_PER_DOT;
110
//  unsigned long nchar = 0;
111
  if( mode == SLAVESERIAL_MODE ) {
112
    if(verbose)  SetCtrlVal(p1,P1_RESPONSE,"slave serial mode");
113
    Pts_write( ADR_MODE, mode );
114
    Pts_erase( verbose );
115
    for( j=0; j<32; j++ ) Pts_write( ADR_CFG, 0x1 );
116
    while( (c=getc(fp))!=EOF ){
117
      for( j=0; j<8; j++ ) Pts_write( ADR_CFG, (c>>(7-j))&0x1 );
118
      nchar++;
119
      if( verbose && nchar%byte_per_dot==0 ) {
120
        sprintf( str,"#");
121
        SetCtrlVal(p1,P1_RESPONSE,str);
122
      }  
123
    }
124
  } else if( mode == SELECTMAP_MODE ) {
125
    if( verbose )  SetCtrlVal(p1,P1_RESPONSE,"select map mode\n");
126
    Pts_write( ADR_MODE, SELECTMAP_MODE );
127
    Pts_erase( verbose );
128
    for( j=0; j<4; j++ ) Pts_write( ADR_CFG, 0xff );
129
    VME_MWRST();
130
    while( (c=getc(fp))!=EOF ){
131
      int cc = 0;
132
      for(j=0; j<8; j++) cc |= ((c&(1<<j))>>j)<<(7-j);
133
      Pts_Mwrite( ADR_CFG, cc );
134
      nchar++;
135
      if( verbose && nchar%byte_per_dot==0 ){
136
        VME_MWEXEC();
137
        VME_MWRST();
138
        sprintf( str,"#");
139
        SetCtrlVal(p1,P1_RESPONSE,str);
140
      }  
141
    }
142
    VME_MWEXEC();
143
  } else {
144
    if(verbose) {
145
      sprintf(str, "\nIllegal mode\n");
146
      SetCtrlVal(p1,P1_RESPONSE,str);
147
    }  
148
    return -1;
149
  }
150
  if(verbose) {
151
     sprintf(str,"\ntotal %ld bits\n", nchar);
152
 
153
      SetCtrlVal(p1,P1_RESPONSE,str);
154
  }    
155
  fclose(fp);
156
  return Pts_check_configure( verbose );
157
}
158
 
159
int Pts_check_configure( int verbose ) {
160
  uint32_t csr1_value;
161
  Pts_read(ADR_CSR1,&csr1_value);
162
  if(verbose) {
163
      sprintf( str,"CSR1(0x%02x)=0x%04x\n",ADR_CSR1,csr1_value&0xffff);
164
 
165
      SetCtrlVal(p1,P1_RESPONSE,str);
166
  }    
167
  if(csr1_value&CSR1_DONE) {
168
    if(verbose) SetCtrlVal(p1,P1_RESPONSE, "configure complete.\n");
169
    return 1;
170
  } else {
171
    if(verbose)  SetCtrlVal(p1,P1_RESPONSE,"configure not complete.");
172
    return -1;
173
  }
174
}
175
 
176
int Pts_reset( int verbose ) {
177
  Pts_write(ADR_CSR0,1);
178
  if( verbose ) {
179
    sprintf( str, "CSR0(0x%02x) = 0x01\n", ADR_CSR0 );
180
     SetCtrlVal(p1,P1_RESPONSE,str);
181
  }  
182
  return 1;
183
}
184
 
185
int Pts_write_csr( int verbose, uint32_t value ) {
186
  Pts_write(ADR_CSR0,value);
187
  if( verbose ) {
188
    sprintf( str,"Pts_write_csr 0x%08x\n", value  );
189
    SetCtrlVal(p1,P1_RESPONSE,str);
190
  }  
191
  return 1;
192
}
193
 
194
 
195
void help(char *argv){
196
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -c  .... Pts_check_configure\n", argv);
197
 SetCtrlVal(p1,P1_RESPONSE,str);
198
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -i filename -b mode (2) ... Pts_configure_bit\n", argv);
199
 SetCtrlVal(p1,P1_RESPONSE,str);
200
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -e  .... Pts_erase\n", argv);
201
 SetCtrlVal(p1,P1_RESPONSE,str);
202
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -x  .... Pts_reset\n", argv);
203
 SetCtrlVal(p1,P1_RESPONSE,str);
204
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -c  .... Pts_check_configure\n", argv);
205
 SetCtrlVal(p1,P1_RESPONSE,str);
206
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -r  .... vme read\n", argv);
207
 SetCtrlVal(p1,P1_RESPONSE,str);
208
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -w value .... vme write\n", argv);
209
 SetCtrlVal(p1,P1_RESPONSE,str);
210
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -s value .... Pts_write_csr\n", argv);
211
 SetCtrlVal(p1,P1_RESPONSE,str);
212
 sprintf(str,"Example: %s  --address  0x1000000 --verbose 1 --erase\n", argv);
213
 SetCtrlVal(p1,P1_RESPONSE,str);
214
 sprintf(str,"Example: %s --address  0x1000000 --verbose 1 --input pts_scaler.bit --load-bit 2\n", argv);
215
 SetCtrlVal(p1,P1_RESPONSE,str);
216
 sprintf(str,"Example: %s --address  0x1000004 --write-csr 0x7600\n", argv);SetCtrlVal(p1,P1_RESPONSE,str);
217
}
218
 
219
 
220
 
221
int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
222
                       LPSTR lpszCmdLine, int nCmdShow)
223
{
224
    char saddr[255];
225
        if (InitCVIRTE (hInstance, 0, 0) == 0)
226
                return -1;      /* out of memory */
227
        if ((p1 = LoadPanel (0, "PtsModule_CVI.uir", P1)) < 0)
228
                return -1;
229
        DisplayPanel (p1);
230
        VME_START(NULL);
231
        GetCtrlVal(p1,P1_VERBOSE,&verbose);  
232
        GetCtrlVal(p1,P1_ADDRESS,saddr);
233
     ptaddr  =  strtoul (saddr,NULL,0);  
234
        RunUserInterface ();
235
        DiscardPanel (p1);
236
        VME_STOP();
237
        return 0;
238
}
239
 
240
int CVICALLBACK Reset (int panel, int control, int event,
241
                void *callbackData, int eventData1, int eventData2)
242
{
243
        switch (event)
244
                {
245
                case EVENT_COMMIT:
246
                        Pts_reset(verbose);
247
                        break;
248
                }
249
        return 0;
250
}
251
 
252
int CVICALLBACK Erase (int panel, int control, int event,
253
                void *callbackData, int eventData1, int eventData2)
254
{
255
        switch (event)
256
                {
257
                case EVENT_COMMIT:
258
                         Pts_erase(verbose);  
259
                        break;
260
                }
261
        return 0;
262
}
263
 
264
int CVICALLBACK Download (int panel, int control, int event,
265
                void *callbackData, int eventData1, int eventData2)
266
{
267
    char filename[254];
268
    int mode=0;
269
        switch (event)
270
                {
271
                case EVENT_COMMIT:
272
                         GetCtrlVal(p1,P1_FIRMWARE,filename);
273
                         GetCtrlVal(p1,P1_MODE,&mode);
274
 
275
             Pts_configure_bit( filename, mode,  verbose );
276
                        break;
277
                }
278
        return 0;
279
}
280
 
281
int CVICALLBACK Check (int panel, int control, int event,
282
                void *callbackData, int eventData1, int eventData2)
283
{
284
        switch (event)
285
                {
286
                case EVENT_COMMIT:
287
                         Pts_check_configure( verbose );  
288
                        break;
289
                }
290
        return 0;
291
}
292
 
293
int CVICALLBACK Read (int panel, int control, int event,
294
                void *callbackData, int eventData1, int eventData2)
295
{
296
    uint32_t value=0;
297
    char str[0xFF];
298
        char saddr[256];
299
        int offset;
300
        switch (event)
301
                {
302
                case EVENT_COMMIT:
303
                        GetCtrlVal(p1,P1_OFFSET,saddr);
304
                        offset = strtoul (saddr,NULL,0);
305
                        Pts_read( offset , &value );
306
                        if( verbose ) {
307
               sprintf(str, "VME Read addr 0x%0x+0x%0x  response 0x%0x\n", ptaddr, offset, value );
308
               SetCtrlVal (p1, P1_RESPONSE, str);
309
            }
310
                        break;
311
                }
312
        return 0;
313
}
314
 
315
int CVICALLBACK Write (int panel, int control, int event,
316
                void *callbackData, int eventData1, int eventData2)
317
{
318
    int value;
319
        int offset;
320
    char svalue[256];
321
    char saddr[256];
322
        switch (event)
323
                {
324
                case EVENT_COMMIT:
325
                      GetCtrlVal(p1,P1_DATA,svalue);
326
                          GetCtrlVal(p1,P1_OFFSET,saddr);  
327
                         value  = strtoul (svalue,NULL,0);
328
                         offset = strtoul (saddr,NULL,0);
329
            Pts_write( offset , value );
330
                        if( verbose ) {
331
               sprintf(str, "VME Write addr 0x%0x+0x%0x  data 0x%0x\n", ptaddr, offset, value );
332
               SetCtrlVal (p1, P1_RESPONSE, str);
333
            }
334
                        break;
335
                }
336
        return 0;
337
}
338
 
339
int CVICALLBACK WriteCSR (int panel, int control, int event,
340
                void *callbackData, int eventData1, int eventData2)
341
{
342
      int value;
343
    char svalue[256];
344
        switch (event)
345
                {
346
                case EVENT_COMMIT:
347
                     GetCtrlVal(p1,P1_DATA,svalue);
348
                         value = strtoul (svalue,NULL,0);
349
                         Pts_write_csr( verbose, value );
350
                        break;
351
                }
352
        return 0;
353
}
354
 
355
int CVICALLBACK Verbose (int panel, int control, int event,
356
                void *callbackData, int eventData1, int eventData2)
357
{
358
    int * data;
359
        switch (event)
360
                {
361
                case EVENT_COMMIT:
362
                    GetCtrlVal(panel,control,&verbose);
363
 
364
                        break;
365
                }
366
        return 0;
367
}
368
 
369
int CVICALLBACK Help (int panel, int control, int event,
370
                void *callbackData, int eventData1, int eventData2)
371
{
372
        switch (event)
373
                {
374
                case EVENT_COMMIT:
375
                        help("PtsModule");
376
                        break;
377
                }
378
        return 0;
379
}
380
 
381
int CVICALLBACK Address (int panel, int control, int event,
382
                void *callbackData, int eventData1, int eventData2)
383
{
384
   char saddr[100];
385
        switch (event)
386
                {
387
                case EVENT_COMMIT:
388
                    GetCtrlVal(p1,P1_ADDRESS,saddr);
389
                        ptaddr  =  strtoul (saddr,NULL,0);  
390
                        break;
391
                }
392
        return 0;
393
}
394
 
395
int CVICALLBACK Exit (int panel, int control, int event,
396
                void *callbackData, int eventData1, int eventData2)
397
{
398
        switch (event)
399
                {
400
                case EVENT_COMMIT:
401
                        QuitUserInterface(0);
402
                        break;
403
                }
404
        return 0;
405
}
406
 
407
int CVICALLBACK FSelect (int panel, int control, int event,
408
                void *callbackData, int eventData1, int eventData2)
409
{
410
   int status;
411
   char pathName[MAX_PATHNAME_LEN];
412
        switch (event)
413
                {
414
                case EVENT_COMMIT:
415
                        status = FileSelectPopup ("", "*.bit", "*.bit", "Select Firmware file",
416
                                                                          VAL_SELECT_BUTTON, 0, 0, 1, 0, pathName);
417
                        if (status>0) SetCtrlVal(p1,P1_FIRMWARE,pathName);                                               
418
                        break;
419
                }
420
        return 0;
421
}
422
 
423
int CVICALLBACK LedCB (int panel, int control, int event,
424
                void *callbackData, int eventData1, int eventData2)
425
{
426
        switch (event)
427
                {
428
                int value=0;
429
                case EVENT_COMMIT:
430
                        GetCtrlVal(p1,P1_LED,&value);
431
 
432
            Pts_write( 0 , value+1 );
433
 
434
                        break;
435
                }
436
        return 0;
437
}
438
 
439
int CVICALLBACK Execute (int panel, int control, int event,
440
                void *callbackData, int eventData1, int eventData2)
441
{
442
        switch (event)
443
        {
444
                case EVENT_COMMIT:{
445
                    int n,i,nb;
446
                        char buf[400];
447
                        unsigned int data, addr;
448
                        char sdata[255], saddr[255], rw[255];
449
                        GetNumTextBoxLines(panel, P1_COMMANDS,&n);
450
                        for (i=0;i<n;i++){
451
                      GetTextBoxLine(panel, P1_COMMANDS, i, buf);
452
                      nb = sscanf(buf,"%s%s%s",rw, saddr,sdata);
453
                      addr  =   strtoul (saddr,NULL,0);
454
                          data  =   strtoul (sdata,NULL,0);    
455
              if (strstr(rw,"W")!=NULL){
456
                             Pts_write( addr , data );
457
                                 if( verbose ) {
458
                   sprintf(str, "VME Write addr 0x%0x+0x%0x  data 0x%0x\n", ptaddr, addr, data );
459
                   SetCtrlVal (p1, P1_RESPONSE, str);
460
                 }
461
                          } else {
462
                            Pts_read( addr , &data );
463
                            if( verbose ) {
464
                  sprintf(str, "VME Read addr 0x%0x+0x%0x  response 0x%0x\n", ptaddr,  addr, data);
465
                  SetCtrlVal (p1, P1_RESPONSE, str);
466
                }
467
                          }
468
                        }  
469
                        break;
470
                                                  }
471
        }
472
        return 0;
473
}