Subversion Repositories f9daq

Rev

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

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