Subversion Repositories f9daq

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
111 f9daq 1
 
2
// libxxusb.cpp : Defines the entry point for the DLL application.
3
//
4
 
5
 
6
 
7
#include <string.h>
8
#include <malloc.h>
9
#include "usb.h"
10
#include "libxxusb.h"
11
#include <time.h>
12
 
13
 
14
 
15
 
16
// 03/09/06 Release 3.00 changes 
17
// 07/28/06     correction CAMAC write for F to be in range 16...23
18
// 10/09/06     correction CAMAC read for F to be in range <16 OR >23
19
// 10/16/06     CAMAC DGG corrected
20
// 12/28/07     Open corrected for bug when calling register after opening
21
/*
22
******** xxusb_longstack_execute ************************
23
 
24
  Executes stack array passed to the function and returns the data read from the VME bus
25
 
26
  Paramters:
27
    hdev: USB device handle returned from an open function
28
    DataBuffer: pointer to the dual use buffer
29
                when calling , DataBuffer contains (unsigned short) stack data, with first word serving
30
                as a placeholder
31
                upon successful return, DataBuffer contains (unsigned short) VME data
32
    lDataLen: The number of bytes to be fetched from VME bus - not less than the actual number
33
                expected, or the function will return -5 code. For stack consisting only of write operations,
34
                lDataLen may be set to 1.
35
    timeout: The time in ms that should be spent tryimg to write data.
36
 
37
  Returns:
38
    When Successful, the number of bytes read from xxusb.
39
    Upon failure, a negative number
40
 
41
  Note:
42
        The function must pass a pointer to an array of unsigned integer stack data, in which the first word
43
        is left empty to serve as a placeholder.
44
        The function is intended for executing long stacks, up to 4 MBytes long, both "write" and "read"
45
        oriented, such as using multi-block transfer operations.
46
        Structure upon call:
47
                DataBuffer(0) = 0(don't care place holder)
48
                DataBuffer(1) = (unsigned short)StackLength bits 0-15
49
                DataBuffer(2) = (unsigned short)StackLength bits 16-20
50
                DataBuffer(3 - StackLength +2)  (unsigned short) stack data
51
            StackLength represents the number of words following DataBuffer(1) word, thus the total number
52
                of words is StackLength+2
53
        Structure upon return:
54
                DataBuffer(0 - (ReturnValue/2-1)) - (unsigned short)array of returned data when ReturnValue>0
55
*/
56
 
57
int xxusb_longstack_execute(usb_dev_handle *hDev, void *DataBuffer, int lDataLen, int timeout)
58
{
59
    int ret;
60
    char *cbuf;
61
        unsigned short *usbuf;
62
    int bufsize;
63
 
64
        cbuf = (char *)DataBuffer;
65
        usbuf = (unsigned short *)DataBuffer;
66
    cbuf[0]=12;
67
    cbuf[1]=0;
68
        bufsize = 2*(usbuf[1]+0x10000*usbuf[2])+4;
69
    ret=usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, cbuf, bufsize, timeout);
70
    if (ret>0)
71
        ret=usb_bulk_read(hDev, XXUSB_ENDPOINT_IN, cbuf, lDataLen, timeout);
72
 
73
    return ret;
74
}
75
 
76
/*
77
******** xxusb_bulk_read ************************
78
 
79
  Reads the content of the usbfifo whenever "FIFO full" flag is set,
80
    otherwise times out.
81
 
82
  Paramters:
83
    hdev: USB device handle returned from an open function
84
    DataBuffer: pointer to an array to store data that is read from the VME bus;
85
                the array may be declared as byte, unsigned short, or unsigned long
86
    lDatalen: The number of bytes to read from xxusb
87
    timeout: The time in ms that should be spent waiting for data.
88
 
89
  Returns:
90
    When Successful, the number of bytes read from xxusb.
91
    Upon failure, a negative number
92
 
93
  Note:
94
        Depending upon the actual need, the function may be used to return the data in a form
95
        of an array of bytes, unsigned short integers (16 bits), or unsigned long integers (32 bits).
96
        The latter option of passing a pointer to an array of unsigned long integers is meaningful when
97
        xxusb data buffering option is used (bit 7=128 of the global register) that requires data
98
        32-bit data alignment.
99
 
100
*/
101
int   xxusb_bulk_read(usb_dev_handle *hDev, void *DataBuffer, int lDataLen, int timeout)
102
{
103
int ret;
104
char *cbuf;
105
cbuf = (char *)DataBuffer;
106
    ret = usb_bulk_read(hDev, XXUSB_ENDPOINT_IN, cbuf, lDataLen, timeout);
107
    return ret;
108
}
109
 
110
/*
111
******** xxusb_bulk_write ************************
112
 
113
  Writes the content of an array of bytes, unsigned short integers, or unsigned long integers
114
  to the USB port fifo; times out when the USB fifo is full (e.g., when xxusb is busy).
115
 
116
  Paramters:
117
    hdev: USB device handle returned from an open function
118
    DataBuffer: pointer to an array storing the data to be sent;
119
                the array may be declared as byte, unsigned short, or unsigned long
120
    lDatalen: The number of bytes to to send to xxusb
121
    timeout: The time in ms that should be spent waiting for data.
122
 
123
  Returns:
124
    When Successful, the number of bytes passed to xxusb.
125
    Upon failure, a negative number
126
 
127
  Note:
128
        Depending upon the actual need, the function may be used to pass to xxusb the data in a form
129
        of an array of bytes, unsigned short integers (16 bits), or unsigned long integers (32 bits).
130
*/
131
int   xxusb_bulk_write(usb_dev_handle *hDev, void *DataBuffer, int lDataLen, int timeout)
132
{
133
int ret;
134
char *cbuf;
135
cbuf = (char *)DataBuffer;
136
    ret = usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, cbuf, lDataLen, timeout);
137
    return ret;
138
}
139
 
140
/*
141
******** xxusb_usbfifo_read ************************
142
 
143
  Reads data stored in the xxusb fifo and packs them in an array of long integers.
144
 
145
  Paramters:
146
    hdev: USB device handle returned from an open function
147
    DataBuffer: pointer to an array of long to store data that is read
148
                the data occupy only the least significant 16 bits of the 32-bit data words
149
    lDatalen: The number of bytes to read from the xxusb
150
    timeout: The time in ms that should be spent waiting for data.
151
 
152
  Returns:
153
    When Successful, the number of bytes read from xxusb.
154
    Upon failure, a negative number
155
 
156
  Note:
157
        The function is not economical as it wastes half of the space required for storing
158
        the data received. Also, it is relatively slow, as it performs extensive data repacking.
159
        It is recommended to use xxusb_bulk_read with a pointer to an array of unsigned short
160
        integers.
161
*/
162
int   xxusb_usbfifo_read(usb_dev_handle *hDev, int *DataBuffer, int lDataLen, int timeout)
163
{
164
int ret;
165
char *cbuf;
166
unsigned short *usbuf;
167
int i;
168
 
169
cbuf = (char *)DataBuffer;
170
usbuf = (unsigned short *)DataBuffer;
171
 
172
    ret = usb_bulk_read(hDev, XXUSB_ENDPOINT_IN, cbuf, lDataLen, timeout);
173
    if (ret > 0)
174
        for (i=ret/2-1; i >= 0; i=i-1)
175
                {
176
                        usbuf[i*2]=usbuf[i];
177
                        usbuf[i*2+1]=0;
178
                }
179
    return ret;
180
}
181
 
182
 
183
//******************************************************//
184
//******************* GENERAL XX_USB *******************//
185
//******************************************************//
186
// The following are functions used for both VM_USB & CC_USB
187
 
188
 
189
/*
190
******** xxusb_register_write ************************
191
 
192
  Writes Data to the xxusb register selected by RedAddr.  For
193
    acceptable values for RegData and RegAddr see the manual
194
    the module you are using.
195
 
196
  Parameters:
197
    hdev: usb device handle returned from open device
198
    RegAddr: The internal address if the xxusb
199
    RegData: The Data to be written to the register
200
 
201
  Returns:
202
    Number of bytes sent to xxusb if successful
203
 
204
    Negative numbers if the call fails
205
*/
206
short   xxusb_register_write(usb_dev_handle *hDev, short RegAddr, long RegData)
207
{
208
    long RegD;
209
    char buf[8]={5,0,0,0,0,0,0,0};
210
    int ret;
211
    int lDataLen;
212
    int timeout;
213
    if ((RegAddr==0) || (RegAddr==12) || (RegAddr==15))
214
        return 0;
215
    buf[2]=(char)(RegAddr & 15);
216
    buf[4]=(char)(RegData & 255);
217
 
218
    RegD = RegData >> 8;
219
    buf[5]=(char)(RegD & 255);
220
        RegD = RegD >>8;
221
        if (RegAddr==8)
222
        {
223
                buf[6]=(char)(RegD & 255);
224
                lDataLen=8;
225
        }
226
        else
227
                lDataLen=6;
228
        timeout=10;
229
        ret=xxusb_bulk_write(hDev, buf, lDataLen, timeout);
230
        return ret;
231
}
232
 
233
/*
234
******** xxusb_stack_write ************************
235
 
236
  Writes a stack of VME/CAMAC calls to the VM_USB/CC_USB
237
    to be executed upon trigger.
238
 
239
  Parameters:
240
    hdev: usb device handle returned from an open function
241
    StackAddr: internal register to which the stack should be written
242
    lpStackData: Pointer to an array holding the stack
243
 
244
  Returns:
245
    The number of Bytes written to the xxusb when successful
246
    A negative number upon failure
247
*/
248
short   xxusb_stack_write(usb_dev_handle *hDev, short StackAddr, long *intbuf)
249
{
250
  int timeout;
251
    short ret;
252
    short lDataLen;
253
    char buf[2000];
254
    short i;
255
    int bufsize;
256
 
257
    buf[0]=(char)((StackAddr & 51) + 4);
258
    buf[1]=0;
259
    lDataLen=(short)(intbuf[0] & 0xFFF);
260
    buf[2]=(char)(lDataLen & 255);
261
    lDataLen = lDataLen >> 8;
262
    buf[3] = (char)(lDataLen & 255);
263
    bufsize=intbuf[0]*2+4;
264
    if (intbuf[0]==0)
265
      return 0;
266
    for (i=1; i <= intbuf[0]; i++)
267
      {
268
        buf[2+2*i] = (char)(intbuf[i] & 255);
269
        buf[3+2*i] = (char)((intbuf[i] >>8) & 255);
270
      }
271
    timeout=50;
272
    ret=usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, buf, bufsize, timeout);
273
    return ret;
274
}
275
 
276
/*
277
******** xxusb_stack_execute **********************
278
 
279
  Writes, executes and returns the value of a DAQ stack.
280
 
281
  Parameters:
282
    hdev: USB device handle returned from an open function
283
    intbuf: Pointer to an array holding the values stack.  Upon return
284
            Pointer value is the Data returned from the stack.
285
 
286
  Returns:
287
    When successful, the number of Bytes read from xxusb
288
    Upon Failure, a negative number.
289
*/
290
short   xxusb_stack_execute(usb_dev_handle *hDev, long *intbuf)
291
{
292
  int timeout;
293
    short ret;
294
    short lDataLen;
295
    char buf[26700];
296
    short i;
297
    int bufsize;
298
    int ii = 0;
299
 
300
    buf[0]=12;
301
    buf[1]=0;
302
    lDataLen=(short)(intbuf[0] & 0xFFF);
303
    buf[2]=(char)(lDataLen & 255);
304
    lDataLen = lDataLen >> 8;
305
    buf[3] = (char)(lDataLen & 15);
306
    bufsize=intbuf[0]*2+4;
307
    if (intbuf[0]==0)
308
      return 0;
309
    for (i=1; i <= intbuf[0]; i++)
310
      {
311
        buf[2+2*i] = (char)(intbuf[i] & 255);
312
        buf[3+2*i] = (char)((intbuf[i] >>8) & 255);
313
      }
314
    timeout=2000;
315
    ret=usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, buf, bufsize, timeout);
316
    if (ret>0)
317
        {
318
        lDataLen=26700;
319
        timeout=6000;
320
        ret=usb_bulk_read(hDev, XXUSB_ENDPOINT_IN, buf, lDataLen, timeout);
321
        if (ret>0)
322
        for (i=0; i < ret; i=i+2)
323
          intbuf[ii++]=(UCHAR)(buf[i]) +(UCHAR)( buf[i+1])*256;
324
        }
325
    return ret;
326
}
327
 
328
/*
329
******** xxusb_stack_read ************************
330
 
331
  Reads the current DAQ stack stored by xxusb
332
 
333
  Parameters:
334
    hdev: USB device handle returned by an open function
335
    StackAddr: Indicates which stack to read, primary or secondary
336
    intbuf: Pointer to a array where the stack can be stored
337
 
338
  Returns:
339
    Number of bytes read from xxusb when successful
340
    Upon failure, a negative number
341
*/
342
short   xxusb_stack_read(usb_dev_handle *hDev, short StackAddr, long *intbuf)
343
{
344
  int timeout;
345
    short ret;
346
    short lDataLen;
347
    short bufsize;
348
    char buf[1600];
349
    int i;
350
 
351
    buf[0]=(char)(StackAddr & 51);
352
    buf[1]=0;
353
    lDataLen = 2;
354
    timeout=100;
355
    ret=usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, buf, lDataLen, timeout);
356
    if (ret < 0)
357
        return ret;
358
    else
359
      bufsize=1600;
360
    int ii=0;
361
      {
362
        ret=usb_bulk_read(hDev, XXUSB_ENDPOINT_IN, buf, bufsize, timeout);
363
        if (ret>0)
364
        for (i=0; i < ret; i=i+2)
365
          intbuf[ii++]=(UCHAR)(buf[i]) + (UCHAR)(buf[i+1])*256;
366
        return ret;
367
 
368
      }    
369
}
370
 
371
/*
372
******** xxusb_register_read ************************
373
 
374
  Reads the current contents of an internal xxusb register
375
 
376
  Parameters:
377
    hdev: USB device handle returned from an open function
378
    RegAddr: The internal address of the register from which to read
379
    RegData: Pointer to a long to hold the data.
380
 
381
  Returns:
382
    When Successful, the number of bytes read from xxusb.
383
    Upon failure, a negative number
384
*/
385
short   xxusb_register_read(usb_dev_handle *hDev, short RegAddr, long *RegData)
386
{
387
//long RegD;
388
int timeout;
389
        char buf[4]={1,0,0,0};
390
        int ret;
391
        int lDataLen;
392
 
393
        buf[2]=(char)(RegAddr & 15);   
394
        timeout=10;
395
        lDataLen=4;
396
        ret=xxusb_bulk_write(hDev, buf, lDataLen, timeout);
397
        if (ret < 0)
398
                return (short)ret;
399
        else
400
        {
401
            lDataLen=8;
402
            timeout=100;
403
            ret=xxusb_bulk_read(hDev, buf, lDataLen, timeout);
404
            if (ret<0)
405
              return (short)ret;
406
            else
407
              {
408
                *RegData=(UCHAR)(buf[0])+256*(UCHAR)(buf[1]);
409
                if (ret==4)
410
                 *RegData=*RegData+0x10000*(UCHAR)(buf[2]);
411
                return (short)ret;
412
                }
413
        }
414
}
415
 
416
/*
417
******** xxusb_reset_toggle ************************
418
 
419
  Toggles the reset state of the FPGA while the xxusb in programming mode
420
 
421
  Parameters
422
    hdev: US B device handle returned from an open function
423
 
424
  Returns:
425
    Upon failure, a negative number  
426
*/
427
short   xxusb_reset_toggle(usb_dev_handle *hDev)
428
{
429
  short ret;
430
  char buf[2] = {(char)255,(char)255};
431
  int lDataLen=2;
432
  int timeout=1000;
433
  ret = usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, buf,lDataLen, timeout);
434
  return (short)ret;
435
}
436
 
437
/*
438
******** xxusb_devices_find ************************
439
 
440
  Determines the number and parameters of all xxusb devices attched to
441
    the computer.
442
 
443
  Parameters:
444
    xxdev: pointer to an array on which the device parameters are stored
445
 
446
  Returns:
447
    Upon success, returns the number of devices found
448
    Upon Failure returns a negative number
449
*/
450
short   xxusb_devices_find(xxusb_device_type *xxdev)
451
{
452
  short DevFound = 0;
453
  usb_dev_handle *udev;
454
  struct usb_bus *bus;
455
  struct usb_device *dev;  
456
struct usb_bus *usb_busses;
457
  char string[256];
458
  short ret;
459
   usb_init();
460
   usb_find_busses();
461
   usb_busses=usb_get_busses();
462
  usb_find_devices();
463
   for (bus=usb_busses; bus; bus = bus->next)
464
   {
465
       for (dev = bus->devices; dev; dev= dev->next)
466
       {
467
           if (dev->descriptor.idVendor==XXUSB_WIENER_VENDOR_ID)
468
           {
469
               udev = usb_open(dev);
470
               if (udev)
471
               {
472
                   ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string));
473
                   if (ret >0 )  
474
                     {
475
                       xxdev[DevFound].usbdev=dev;
476
                       strcpy(xxdev[DevFound].SerialString, string);
477
                       DevFound++;
478
                     }
479
                   usb_close(udev);
480
                }
481
                   else return -1;
482
           }
483
       }
484
    }
485
  return DevFound;
486
}
487
 
488
/*
489
******** xxusb_device_close ************************
490
 
491
  Closes an xxusb device
492
 
493
  Parameters:
494
    hdev: USB device handle returned from an open function
495
 
496
  Returns:  1
497
*/
498
short   xxusb_device_close(usb_dev_handle *hDev)
499
{
500
    short ret;
501
    ret=usb_release_interface(hDev,0);
502
    usb_close(hDev);
503
    return 1;
504
}
505
 
506
/*
507
******** xxusb_device_open ************************
508
 
509
  Opens an xxusb device found by xxusb_device_find
510
 
511
  Parameters:
512
    dev: a usb device
513
 
514
  Returns:
515
    A USB device handle
516
*/
517
usb_dev_handle*   xxusb_device_open(struct usb_device *dev)
518
{
519
    short ret;
520
    long val;
521
    int count =0;
522
    usb_dev_handle *udev;
523
    udev = usb_open(dev);
524
    ret = usb_set_configuration(udev,1);
525
    ret = usb_claim_interface(udev,0);
526
// RESET USB (added 10/16/06 Andreas Ruben)
527
        ret=xxusb_register_write(udev, 10, 0x04);
528
// Loop to find known state (added 12/28/07 TH / AR)
529
        ret =-1;
530
        while ((ret <0) && (count <10))
531
        {
532
            xxusb_register_read(udev, 0, &val);
533
            count++;
534
        }
535
 
536
    return udev;
537
}
538
 
539
/*
540
******** xxusb_flash_program ************************
541
 
542
    --Untested and therefore uncommented--
543
*/
544
short   xxusb_flash_program(usb_dev_handle *hDev, char *config, short nsect)
545
{
546
        int i=0;
547
        int k=0;
548
        short ret=0;
549
        time_t t1,t2;
550
 
551
        char *pconfig;
552
        char *pbuf;
553
        pconfig=config;
554
        char buf[518] ={(char)0xAA,(char)0xAA,(char)0x55,(char)0x55,(char)0xA0,(char)0xA0};
555
        while (*pconfig++ != -1);
556
        for (i=0; i<nsect; i++)
557
        {
558
                pbuf=buf+6;
559
                for (k=0; k<256; k++)
560
                {
561
                        *(pbuf++)=*(pconfig);
562
                        *(pbuf++)=*(pconfig++);
563
                }
564
                ret = usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, buf, 518, 2000);
565
                if (ret<0)
566
                        return ret;
567
                t1=clock()+(time_t)(0.03*CLOCKS_PER_SEC);
568
                while (t1>clock());
569
                t2=clock();
570
        }
571
        return ret;
572
}
573
 
574
/*
575
******** xxusb_flashblock_program ************************
576
 
577
      --Untested and therefore uncommented--  
578
*/
579
short   xxusb_flashblock_program(usb_dev_handle *hDev, UCHAR *config)
580
{
581
        int k=0;
582
        short ret=0;
583
 
584
        UCHAR *pconfig;
585
        char *pbuf;
586
        pconfig=config;
587
        char buf[518] ={(char)0xAA,(char)0xAA,(char)0x55,(char)0x55,(char)0xA0,(char)0xA0};
588
        pbuf=buf+6;
589
        for (k=0; k<256; k++)
590
        {
591
                *(pbuf++)=(UCHAR)(*(pconfig));
592
                *(pbuf++)=(UCHAR)(*(pconfig++));
593
        }
594
        ret = usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, buf, 518, 2000);
595
        return ret;
596
}
597
 
598
/*
599
******** xxusb_serial_open ************************
600
 
601
  Opens a xxusb device whose serial number is given
602
 
603
  Parameters:
604
    SerialString: a char string that gives the serial number of
605
                  the device you wish to open.  It takes the form:
606
                  VM0009 - for a vm_usb with serial number 9 or
607
                  CC0009 - for a cc_usb with serial number 9
608
 
609
  Returns:
610
    A USB device handle
611
*/
612
usb_dev_handle*   xxusb_serial_open(char *SerialString)
613
{
614
  short DevFound = 0;
615
  usb_dev_handle *udev = NULL;
616
  struct usb_bus *bus;
617
  struct usb_device *dev;  
618
struct usb_bus *usb_busses;
619
char string[7];
620
  short ret;
621
// usb_set_debug(4);
622
  usb_init();
623
   usb_find_busses();
624
  usb_busses=usb_get_busses();
625
   usb_find_devices();
626
   for (bus=usb_busses; bus; bus = bus->next)
627
   {
628
       for (dev = bus->devices; dev; dev= dev->next)
629
       {
630
           if (dev->descriptor.idVendor==XXUSB_WIENER_VENDOR_ID)
631
           {
632
               udev = xxusb_device_open(dev);
633
               if (udev)
634
               {
635
                   ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string));
636
                                        if (ret >0 )  
637
                                                {
638
                                                if (strcmp(string,SerialString)==0)
639
                                                                return udev;
640
                                                }
641
                                                usb_close(udev);
642
                                }
643
           }
644
       }
645
    }
646
   udev = NULL;
647
   return udev;
648
}
649
 
650
 
651
//******************************************************//
652
//****************** EZ_VME Functions ******************//
653
//******************************************************//
654
// The following are functions used to perform simple
655
// VME Functions with the VM_USB
656
 
657
/*
658
******** VME_write_32 ************************
659
 
660
  Writes a 32 bit data word to the VME bus
661
 
662
  Parameters:
663
    hdev: USB devcie handle returned from an open function
664
    Address_Modifier: VME address modifier for the VME call
665
    VME_Address: Address to write the data to
666
    Data: 32 bit data word to be written to VME_Address
667
 
668
  Returns:
669
    Number of bytes read from xxusb when successful
670
    Upon failure, a negative number
671
*/
672
short   VME_write_32(usb_dev_handle *hdev, short Address_Modifier, long VME_Address, long Data)
673
{
674
    long intbuf[1000];
675
    short ret;
676
    intbuf[0]=7;
677
    intbuf[1]=0;
678
    intbuf[2]=Address_Modifier;
679
    intbuf[3]=0;
680
    intbuf[4]=(VME_Address & 0xffff);
681
    intbuf[5]=((VME_Address >>16) & 0xffff);
682
    intbuf[6]=(Data & 0xffff);
683
    intbuf[7]=((Data >> 16) & 0xffff);
684
    ret = xxusb_stack_execute(hdev, intbuf);
685
    return ret;
686
}
687
 
688
/*
689
******** VME_read_32 ************************
690
 
691
 
692
  Reads a 32 bit data word from a VME address
693
 
694
  Parameters:
695
    hdev: USB devcie handle returned from an open function
696
    Address_Modifier: VME address modifier for the VME call
697
    VME_Address: Address to read the data from
698
    Data: 32 bit data word read from VME_Address
699
 
700
  Returns:
701
    Number of bytes read from xxusb when successful
702
    Upon failure, a negative number
703
*/
704
short   VME_read_32(usb_dev_handle *hdev, short Address_Modifier, long VME_Address, long *Data)
705
{
706
    long intbuf[1000];
707
    short ret;
708
    intbuf[0]=5;
709
    intbuf[1]=0;
710
    intbuf[2]=Address_Modifier +0x100;
711
    intbuf[3]=0;
712
    intbuf[4]=(VME_Address & 0xffff);
713
    intbuf[5]=((VME_Address >>16) & 0xffff);
714
    ret = xxusb_stack_execute(hdev, intbuf);
715
    *Data=intbuf[0] + (intbuf[1] * 0x10000);
716
    return ret;
717
}
718
 
719
/*
720
******** VME_write_16 ************************
721
 
722
  Writes a 16 bit data word to the VME bus
723
 
724
  Parameters:
725
    hdev: USB devcie handle returned from an open function
726
    Address_Modifier: VME address modifier for the VME call
727
    VME_Address: Address to write the data to
728
    Data: word to be written to VME_Address
729
 
730
  Returns:
731
    Number of bytes read from xxusb when successful
732
    Upon failure, a negative number
733
*/
734
short   VME_write_16(usb_dev_handle *hdev, short Address_Modifier, long VME_Address, long Data)
735
{
736
    long intbuf[1000];
737
    short ret;
738
    intbuf[0]=7;
739
    intbuf[1]=0;
740
    intbuf[2]=Address_Modifier;
741
    intbuf[3]=0;
742
    intbuf[4]=(VME_Address & 0xffff)+ 0x01;
743
    intbuf[5]=((VME_Address >>16) & 0xffff);
744
    intbuf[6]=(Data & 0xffff);
745
    intbuf[7]=0;
746
    ret = xxusb_stack_execute(hdev, intbuf);
747
    return ret;
748
}
749
 
750
/*
751
******** VME_read_16 ************************
752
 
753
  Reads a 16 bit data word from a VME address
754
 
755
  Parameters:
756
    hdev: USB devcie handle returned from an open function
757
    Address_Modifier: VME address modifier for the VME call
758
    VME_Address: Address to read the data from
759
    Data: word read from VME_Address
760
 
761
  Returns:
762
    Number of bytes read from xxusb when successful
763
    Upon failure, a negative number
764
*/
765
short   VME_read_16(usb_dev_handle *hdev,short Address_Modifier, long VME_Address, long *Data)
766
{
767
    long intbuf[1000];
768
    short ret;
769
    intbuf[0]=5;
770
    intbuf[1]=0;
771
    intbuf[2]=Address_Modifier +0x100;
772
    intbuf[3]=0;
773
    intbuf[4]=(VME_Address & 0xffff)+ 0x01;
774
    intbuf[5]=((VME_Address >>16) & 0xffff);
775
    ret = xxusb_stack_execute(hdev, intbuf);
776
    *Data=intbuf[0];
777
    return ret;
778
}
779
 
780
/*
781
******** VME_BLT_read_32 ************************
782
 
783
  Performs block transfer of 32 bit words from a VME address
784
 
785
  Parameters:
786
    hdev: USB devcie handle returned from an open function
787
    Address_Modifier: VME address modifier for the VME call
788
    count: number of data words to read
789
    VME_Address: Address to read the data from
790
    Data: pointer to an array to hold the data words
791
 
792
  Returns:
793
    Number of bytes read from xxusb when successful
794
    Upon failure, a negative number
795
*/
796
short   VME_BLT_read_32(usb_dev_handle *hdev, short Adress_Modifier, int count, long VME_Address, long Data[])
797
{
798
    long intbuf[1000];
799
    short ret;
800
    int i=0;
801
    if (count > 255) return -1;
802
    intbuf[0]=5;
803
    intbuf[1]=0;
804
    intbuf[2]=Adress_Modifier +0x100;
805
    intbuf[3]=(count << 8);
806
    intbuf[4]=(VME_Address & 0xffff);
807
    intbuf[5]=((VME_Address >>16) & 0xffff);
808
    ret = xxusb_stack_execute(hdev, intbuf);
809
    int j=0;
810
    for (i=0;i<(2*count);i=i+2)
811
    {
812
        Data[j]=intbuf[i] + (intbuf[i+1] * 0x10000);
813
        j++;
814
    }
815
    return ret;
816
}
817
 
818
//******************************************************//
819
//****************** VM_USB Registers ******************//
820
//******************************************************//
821
// The following are functions used to set the registers
822
// in the VM_USB
823
 
824
/*
825
******** VME_register_write ************************
826
 
827
  Writes to the vmusb registers that are accessible through
828
  VME style calls
829
 
830
  Parameters:
831
    hdev: USB devcie handle returned from an open function
832
    VME_Address: The VME Address of the internal register
833
    Data: Data to be written to VME_Address
834
 
835
  Returns:
836
    Number of bytes read from xxusb when successful
837
    Upon failure, a negative number  
838
*/
839
short   VME_register_write(usb_dev_handle *hdev, long VME_Address, long Data)
840
{
841
    long intbuf[1000];
842
    short ret;
843
 
844
    intbuf[0]=7;
845
    intbuf[1]=0;
846
    intbuf[2]=0x1000;
847
    intbuf[3]=0;
848
    intbuf[4]=(VME_Address & 0xffff);
849
    intbuf[5]=((VME_Address >>16) & 0xffff);
850
    intbuf[6]=(Data & 0xffff);
851
    intbuf[7]=((Data >> 16) & 0xffff);
852
    ret = xxusb_stack_execute(hdev, intbuf);
853
    return ret;
854
}
855
 
856
/*
857
******** VME_register_read ************************
858
 
859
  Reads from the vmusb registers that are accessible trough VME style calls
860
 
861
  Parameters:
862
    hdev: USB devcie handle returned from an open function
863
    VME_Address: The VME Address of the internal register
864
    Data: Data read from VME_Address
865
 
866
  Returns:
867
    Number of bytes read from xxusb when successful
868
    Upon failure, a negative number
869
*/
870
short   VME_register_read(usb_dev_handle *hdev, long VME_Address, long *Data)
871
{
872
    long intbuf[1000];
873
    short ret;
874
 
875
    intbuf[0]=5;
876
    intbuf[1]=0;
877
    intbuf[2]=0x1100;
878
    intbuf[3]=0;
879
    intbuf[4]=(VME_Address & 0xffff);
880
    intbuf[5]=((VME_Address >>16) & 0xffff);
881
    ret = xxusb_stack_execute(hdev, intbuf);
882
    *Data=intbuf[0] + (intbuf[1] * 0x10000);
883
    return ret;
884
}
885
 
886
/*
887
******** VME_LED_settings ************************
888
 
889
  Sets the vmusb LED's
890
 
891
  Parameters:
892
    hdev: USB devcie handle returned from an open function
893
    LED: The number which corresponds to an LED values are:
894
 
895
                        1 - for RED LED
896
            2 - for GREEN LED
897
            3 - for Bottom YELLOW LED
898
    code: The LED aource selector code, valid values for each LED
899
          are listed in the manual
900
    invert: to invert the LED lighting
901
    latch: sets LED latch bit
902
 
903
  Returns:
904
    Number of bytes read from xxusb when successful
905
    Upon failure, a negative number
906
*/
907
short   VME_LED_settings(usb_dev_handle *hdev, int LED, int code, int invert, int latch)
908
{
909
    short ret;
910
//    long internal;
911
    long Data;
912
 
913
    if( (LED <0) ||(LED > 3) || (code < 0) || (code > 7))  return -1;
914
 
915
    VME_register_read(hdev,0xc,&Data);  
916
    if(LED == 0)  
917
    {
918
        Data = Data & 0xFFFFFF00;
919
        Data = Data | code;
920
        if (invert == 1 && latch == 1)   Data = Data | 0x18;
921
        if (invert == 1 && latch == 0)   Data = Data | 0x08;
922
        if (invert == 0 && latch == 1)   Data = Data | 0x10;
923
    }
924
    if(LED == 1)  
925
    {
926
        Data = Data & 0xFFFF00FF;
927
        Data = Data | (code * 0x0100);
928
        if (invert == 1 && latch == 1)  Data = Data | 0x1800;
929
        if (invert == 1 && latch == 0)  Data = Data | 0x0800;
930
        if (invert == 0 && latch == 1)  Data = Data | 0x1000;
931
    }  
932
    if(LED == 2)
933
    {
934
        Data = Data & 0xFF00FFFF;
935
        Data = Data | (code * 0x10000);
936
        if (invert == 1 && latch == 1) Data = Data | 0x180000;
937
        if (invert == 1 && latch == 0) Data = Data | 0x080000;
938
        if (invert == 0 && latch == 1) Data = Data | 0x100000;
939
    }
940
    if(LED == 3)
941
    {
942
        Data = Data & 0x00FFFFFF;
943
        Data = Data | (code * 0x10000);
944
        if (invert == 1 && latch == 1)  Data = Data | 0x18000000;
945
        if (invert == 1 && latch == 0)  Data = Data | 0x08000000;
946
        if (invert == 0 && latch == 1)  Data = Data | 0x10000000;
947
    }
948
    ret = VME_register_write(hdev, 0xc, Data);
949
    return ret;
950
}
951
 
952
/*
953
******** VME_DGG ************************
954
 
955
  Sets the parameters for Gate & Delay channel A of vmusb
956
 
957
  Parameters:
958
    hdev: USB devcie handle returned from an open function
959
    channel: Which DGG channel to use Valid Values are:
960
 
961
                          1 - For DGG B
962
    trigger:  Determines what triggers the start of the DGG Valid values are:
963
 
964
              1 - NIM input 1
965
              2 - NIM input 2
966
              3 - Event Trigger
967
              4 - End of Event
968
              5 - USB Trigger
969
              6 - Pulser
970
    output: Determines which NIM output to use for the channel, Vaild values are:
971
 
972
              1 - for NIM O2
973
    delay: 32 bit word consisting of
974
                        lower 16 bits: Delay_fine in steps of 12.5ns between trigger and start of gate
975
                        upper 16 bits: Delay_coarse in steps of 81.7us between trigger and start of gate
976
    gate: the time the gate should  stay open in steps of 12.5ns
977
    invert: is 1 if you wish to invert the DGG channel output
978
    latch: is 1 if you wish to run the DGG channel latched
979
 
980
  Returns:
981
    Returns 1 when successful
982
    Upon failure, a negative number
983
*/
984
short   VME_DGG(usb_dev_handle *hdev, unsigned short channel, unsigned short trigger, unsigned short output,
985
                                                long delay, unsigned short gate, unsigned short invert, unsigned short latch)
986
{
987
    long Data, DGData, Delay_ext;
988
    long internal;
989
    short ret;
990
 
991
 
992
    ret = VME_register_read(hdev, 0x10,  &Data);
993
    // check and correct values
994
    if(ret<=0) return -1;
995
 
996
    if(channel >1) channel =1;
997
    if(invert >1) invert =1;
998
    if(latch >1) latch =1;
999
        if(output >1) output =1;
1000
        if(trigger >6) trigger =0;
1001
 
1002
    // define Delay and Gate data
1003
    DGData = gate * 0x10000;
1004
    DGData += (unsigned short) delay;
1005
 
1006
        // Set channel, output, invert, latch
1007
        if (output == 0)
1008
    {
1009
                Data = Data & 0xFFFFFF00;
1010
                Data += 0x04 + channel +0x08*invert + 0x10*latch;
1011
    }
1012
        if (output == 1)
1013
    {
1014
                Data = Data & 0xFFFF00FF;
1015
                Data += (0x04 + channel +0x08*invert + 0x10*latch)*0x100;
1016
    }
1017
 
1018
    // Set trigger, delay, gate
1019
 
1020
    if(channel ==0) // CHANNEL DGG_A
1021
    {
1022
            internal = (trigger * 0x1000000) ;
1023
            Data= Data & 0xF0FFFFFF;
1024
            Data += internal;
1025
            ret = VME_register_write(hdev,0x10,Data);
1026
                if(ret<=0) return -1;
1027
                ret=VME_register_write(hdev,0x14,DGData);
1028
                if(ret<=0) return -1;
1029
    // Set coarse delay in DGG_Extended register
1030
            ret = VME_register_read(hdev,0x38,&Data);
1031
                Delay_ext= (Data & 0xffff0000);
1032
                Delay_ext+= ((delay/0x10000) & 0xffff);
1033
            ret = VME_register_write(hdev,0x38,Delay_ext);
1034
        }
1035
        if( channel ==1)  // CHANNEL DGG_B
1036
        {
1037
                internal = (trigger * 0x10000000) ;
1038
                Data= Data & 0x0FFFFFFF;
1039
                Data += internal;
1040
            ret = VME_register_write(hdev,0x10,Data);
1041
                if(ret<=0) return -1;
1042
                ret=VME_register_write(hdev,0x18,DGData);
1043
                if(ret<=0) return -1;
1044
    // Set coarse delay in DGG_Extended register
1045
            ret = VME_register_read(hdev,0x38,&Data);
1046
                Delay_ext= (Data & 0x0000ffff);
1047
                Delay_ext+= (delay & 0xffff0000);
1048
            ret = VME_register_write(hdev,0x38,Delay_ext);
1049
    }
1050
        return 1;
1051
 
1052
}
1053
 
1054
/*
1055
******** VME_Output_settings ************************
1056
 
1057
  Sets the vmusb NIM output register
1058
 
1059
  Parameters:
1060
    hdev: USB devcie handle returned from an open function
1061
    Channel: The number which corresponds to an output:
1062
            1 - for Output 1
1063
            2 - for Output 2
1064
    code: The Output selector code, valid values
1065
          are listed in the manual
1066
    invert: to invert the output
1067
    latch: sets latch bit
1068
 
1069
  Returns:
1070
    Number of bytes read from xxusb when successful
1071
    Upon failure, a negative number
1072
*/
1073
short   VME_Output_settings(usb_dev_handle *hdev, int Channel, int code, int invert, int latch)
1074
{
1075
 
1076
    short ret;
1077
//    long internal;
1078
    long Data;
1079
 
1080
    if( (Channel <1) ||(Channel > 2) || (code < 0) || (code > 7)) return -1;    
1081
    VME_register_read(hdev,0x10,&Data);  
1082
    if(Channel == 1)  
1083
    {
1084
        Data = Data & 0xFFFF00;
1085
        Data = Data | code;
1086
        if (invert == 1 && latch == 1)   Data = Data | 0x18;
1087
        if (invert == 1 && latch == 0)   Data = Data | 0x08;
1088
        if (invert == 0 && latch == 1)   Data = Data | 0x10;
1089
    }
1090
    if(Channel == 2)  
1091
    {
1092
        Data = Data & 0xFF00FF;
1093
        Data = Data | (code * 0x0100);
1094
        if (invert == 1 && latch == 1)   Data = Data | 0x1800;
1095
        if (invert == 1 && latch == 0)   Data = Data | 0x0800;
1096
        if (invert == 0 && latch == 1)   Data = Data | 0x1000;
1097
    }  
1098
    ret = VME_register_write(hdev, 0x10, Data);
1099
    return ret;
1100
}
1101
 
1102
 
1103
//******************************************************//
1104
//****************** CC_USB Registers ******************//
1105
//******************************************************//
1106
// The following are functions used to set the registers
1107
// in the CAMAC_USB
1108
 
1109
/*
1110
******** CAMAC_register_write *****************
1111
 
1112
  Performs a CAMAC write to CC_USB register
1113
 
1114
  Parameters:
1115
    hdev: USB device handle returned from an open function
1116
    A: CAMAC Subaddress
1117
    F: CAMAC Function
1118
    Data: data to be written
1119
 
1120
  Returns:
1121
    Number of bytes written to xxusb when successful
1122
    Upon failure, a negative number
1123
*/
1124
short   CAMAC_register_write(usb_dev_handle *hdev, int A, long Data)
1125
{
1126
    int F = 16;
1127
    int N = 25;
1128
    long intbuf[4];  
1129
    int ret;
1130
 
1131
    intbuf[0]=1;
1132
    intbuf[1]=(long)(F+A*32+N*512 + 0x4000);   
1133
        intbuf[0]=3;
1134
        intbuf[2]=(Data & 0xffff);
1135
        intbuf[3]=((Data >>16) & 0xffff);
1136
        ret = xxusb_stack_execute(hdev, intbuf);
1137
 
1138
    return ret;
1139
}
1140
 
1141
/*
1142
******** CAMAC_register_read ************************
1143
 
1144
  Performs a CAMAC read from CC_USB register
1145
 
1146
  Parameters:
1147
    hdev: USB device handle returned from an open function
1148
    N: CAMAC Station Number
1149
    A: CAMAC Subaddress
1150
    F: CAMAC Function
1151
    Q: The Q response from the CAMAC dataway
1152
    X: The comment accepted response from CAMAC dataway
1153
 
1154
  Returns:
1155
    Number of bytes read from xxusb when successful
1156
    Upon failure, a negative number
1157
*/
1158
short   CAMAC_register_read(usb_dev_handle *hdev, int A, long *Data)
1159
{
1160
    int F = 0;
1161
    int N = 25;
1162
    long intbuf[4];  
1163
    int ret;
1164
 
1165
    intbuf[0]=1;
1166
    intbuf[1]=(long)(F+A*32+N*512 + 0x4000);
1167
    ret = xxusb_stack_execute(hdev, intbuf);
1168
    *Data=intbuf[0] + (intbuf[1] * 0x10000);
1169
 
1170
    return ret;
1171
}
1172
 
1173
/*
1174
******** CAMAC_DGG ************************
1175
 
1176
  Sets the parameters for Gate & Delay channel A of CC_USB
1177
 
1178
  Parameters:
1179
    hdev: USB devcie handle returned from an open function
1180
    channel: Which DGG channel to use Valid Values are:
1181
 
1182
                                                        1 - For DGG B
1183
    trigger:  Determines what triggers the start of the DGG Valid values are:
1184
 
1185
              1 - NIM input 1
1186
              2 - NIM input 2
1187
              3 - NIM input 2
1188
              4 - Event Trigger
1189
                                                  5 - End of Event
1190
                                      6 - USB Trigger
1191
                                                        7 - Pulser
1192
    output: Determines which NIM output to use for the channel, Vaild values are:
1193
              1 - for NIM O1
1194
              2 - for NIM O2
1195
              3 - for NIM O3
1196
    delay: Delay in steps of 12.5ns between trigger and start of gate
1197
    gate: the time the gate should  stay open in steps of 12.5ns
1198
    invert: is 1 if you wish to invert the DGG channel output
1199
    latch: is 1 if you wish to run the DGG channel latched
1200
 
1201
  Returns:
1202
    Returns 1 when successful
1203
    Upon failure, a negative number
1204
*/
1205
short   CAMAC_DGG(usb_dev_handle *hdev, short channel, short trigger, short output,
1206
                                    int delay, int gate, short invert, short latch)
1207
 
1208
 
1209
 
1210
{
1211
//    short channel_ID;
1212
    long Data;
1213
    long internal;
1214
    short ret;
1215
                long Delay_ext;
1216
 
1217
    ret = CAMAC_register_read(hdev,5,&Data);
1218
    //Set trigger
1219
    if((output < 1 ) || (output >3) || (channel < 0 ) || (channel > 1))
1220
        return -1;
1221
    if(output ==1)
1222
    {
1223
      if(channel ==0)
1224
      {
1225
          internal = 0x03;      
1226
      } else {
1227
          internal = 0x04;
1228
      }
1229
    }
1230
    if(output ==2)
1231
    {
1232
        if(channel ==0)
1233
        {
1234
          internal = 0x04;      
1235
        } else {
1236
          internal = 0x05;
1237
        }
1238
    }
1239
    if(output ==3)
1240
    {
1241
        if(channel ==0)
1242
        {
1243
          internal = 0x05;      
1244
        } else {
1245
          internal = 0x06;
1246
        }
1247
    }
1248
 
1249
 
1250
// Set invert bit
1251
    if(invert ==1)
1252
      internal = internal | 0x10;
1253
    else
1254
      internal = internal & 0x0F;
1255
    // Set Latch Bit
1256
    if(latch==1)
1257
        internal = internal | 0x20;
1258
    else
1259
        internal = internal & 0x1F;
1260
// Add new data to old
1261
    if(output == 1)
1262
    {
1263
        Data = Data & 0xFFFF00;
1264
        Data = Data | internal;
1265
    }
1266
    if(output == 2)
1267
    {
1268
        Data = Data & 0xFF00FF;
1269
        Data = Data |(internal * 0x100);
1270
    }
1271
    if(output == 3)
1272
    {
1273
        Data = Data & 0x00FFFF;
1274
        Data = Data | (internal * 0x10000) ;
1275
    }
1276
    CAMAC_register_write(hdev, 5, Data);
1277
    ret = CAMAC_register_read(hdev,6,&Data);  
1278
//Set Trigger
1279
    if(trigger <0 || trigger > 7)
1280
        return -1;
1281
    if(channel ==0)
1282
    {
1283
        Data = Data & 0xFF00FFFF;
1284
        internal = trigger * 0x10000;
1285
        Data = Data | internal;
1286
    } else {
1287
        Data = Data & 0x00FFFFFF;
1288
        internal = trigger * 0x1000000;
1289
        Data = Data | internal;
1290
    }
1291
    ret = CAMAC_register_write(hdev, 6, Data);
1292
    if(channel == 0)
1293
    {
1294
// Write Delay and Gate info
1295
                ret = CAMAC_register_read(hdev,13,&Data);  
1296
                Delay_ext= (Data & 0xffff0000);
1297
                Delay_ext+= ((delay/0x10000) & 0xffff);
1298
                internal = gate * 0x10000;
1299
                Data = internal + (delay & 0xffff);
1300
                ret=CAMAC_register_write(hdev,7,Data);
1301
// Set coarse delay in DGG_Extended register
1302
                ret=CAMAC_register_write(hdev,13,Delay_ext);
1303
    }
1304
        else
1305
        {
1306
                ret=CAMAC_register_write(hdev,8,Data);
1307
                ret = CAMAC_register_read(hdev,13,&Data);  
1308
                Delay_ext= (Data & 0x0000ffff);
1309
                Delay_ext+= (delay & 0xffff0000);
1310
                internal = gate * 0x10000;
1311
                Data = internal + (delay & 0xffff);
1312
// Set coarse delay in DGG_Extended register
1313
                ret=CAMAC_register_write(hdev,13,Delay_ext);
1314
    }
1315
    return 1;
1316
}
1317
 
1318
/*
1319
******** CAMAC_LED_settings ************************
1320
 
1321
  Writes a data word to the vmusb LED register
1322
 
1323
  Parameters:
1324
    hdev: USB devcie handle returned from an open function
1325
    LED: The number which corresponds to an LED values are:
1326
            1 - for RED LED
1327
            2 - for GREEN LED
1328
            3 - for Yellow LED
1329
    code: The LED aource selector code, valid values for each LED
1330
          are listed in the manual
1331
    invert: to invert the LED lighting
1332
    latch: sets LED latch bit
1333
 
1334
  Returns:
1335
    Number of bytes read from xxusb when successful
1336
    Upon failure, a negative number
1337
*/
1338
short   CAMAC_LED_settings(usb_dev_handle *hdev, int LED, int code, int invert, int latch)
1339
{
1340
 
1341
    short ret;
1342
//    long internal;
1343
    long Data;
1344
 
1345
    if( (LED <1) ||(LED > 3) || (code < 0) || (code > 7))
1346
        return -1;
1347
 
1348
    CAMAC_register_read(hdev,4,&Data);  
1349
 
1350
    if(LED == 1)  
1351
    {
1352
        Data = Data & 0xFFFF00;
1353
        Data = Data | code;
1354
        if (invert == 1 && latch == 1)  
1355
            Data = Data | 0x30;
1356
        if (invert == 1 && latch == 0)
1357
            Data = Data | 0x10;
1358
        if (invert == 0 && latch == 1)
1359
            Data = Data | 0x20;
1360
    }
1361
    if(LED == 2)  
1362
    {
1363
        Data = Data & 0xFF00FF;
1364
        Data = Data | (code * 0x0100);
1365
        if (invert == 1 && latch == 1)  
1366
            Data = Data | 0x3000;
1367
        if (invert == 1 && latch == 0)
1368
            Data = Data | 0x1000;
1369
        if (invert == 0 && latch == 1)
1370
            Data = Data | 0x2000;
1371
    }      
1372
    if(LED == 3)
1373
    {
1374
        Data = Data & 0x00FFFF;
1375
        Data = Data | (code * 0x10000);
1376
        if (invert == 1 && latch == 1)  
1377
            Data = Data | 0x300000;
1378
        if (invert == 1 && latch == 0)
1379
            Data = Data | 0x100000;
1380
        if (invert == 0 && latch == 1)
1381
            Data = Data | 0x200000;
1382
    }  
1383
    ret = CAMAC_register_write(hdev, 4, Data);
1384
    return ret;
1385
}
1386
 
1387
/*
1388
******** CAMAC_Output_settings ************************
1389
 
1390
  Writes a data word to the vmusb LED register
1391
 
1392
  Parameters:
1393
    hdev: USB devcie handle returned from an open function
1394
    Channel: The number which corresponds to an output:
1395
            1 - for Output 1
1396
            2 - for Output 2
1397
            3 - for Output 3
1398
    code: The Output selector code, valid values
1399
          are listed in the manual
1400
    invert: to invert the output
1401
    latch: sets latch bit
1402
 
1403
  Returns:
1404
    Number of bytes read from xxusb when successful
1405
    Upon failure, a negative number
1406
*/
1407
short   CAMAC_Output_settings(usb_dev_handle *hdev, int Channel, int code, int invert, int latch)
1408
{
1409
    short ret;
1410
//    long internal;
1411
    long Data;
1412
 
1413
    if( (Channel <1) ||(Channel > 3) || (code < 0) || (code > 7))
1414
        return -1;
1415
 
1416
    CAMAC_register_read(hdev,5,&Data);  
1417
 
1418
    if(Channel == 1)  
1419
    {
1420
        Data = Data & 0xFFFF00;
1421
        Data = Data | code;
1422
        if (invert == 1 && latch == 1)  
1423
            Data = Data | 0x30;
1424
        if (invert == 1 && latch == 0)
1425
            Data = Data | 0x10;
1426
        if (invert == 0 && latch == 1)
1427
            Data = Data | 0x20;
1428
    }    
1429
    if(Channel == 2)  
1430
    {
1431
        Data = Data & 0xFF00FF;
1432
        Data = Data | (code * 0x0100);
1433
        if (invert == 1 && latch == 1)  
1434
            Data = Data | 0x3000;
1435
        if (invert == 1 && latch == 0)
1436
            Data = Data | 0x1000;
1437
        if (invert == 0 && latch == 1)
1438
            Data = Data | 0x2000;
1439
    }  
1440
    if(Channel == 3)
1441
    {
1442
        Data = Data & 0x00FFFF;
1443
        Data = Data | (code * 0x10000);
1444
        if (invert == 1 && latch == 1)  
1445
            Data = Data | 0x300000;
1446
        if (invert == 1 && latch == 0)
1447
            Data = Data | 0x100000;
1448
        if (invert == 0 && latch == 1)
1449
            Data = Data | 0x200000;
1450
    }
1451
    ret = CAMAC_register_write(hdev, 5, Data);
1452
    return ret;
1453
}
1454
 
1455
/*
1456
******** CAMAC_write_LAM_mask ************************
1457
 
1458
  Writes the data word to the LAM mask register
1459
 
1460
  Parameters:
1461
    hdev: USB devcie handle returned from an open function
1462
    Data: LAM mask to write
1463
 
1464
  Returns:
1465
    Number of bytes read from xxusb when successful
1466
    Upon failure, a negative number
1467
*/
1468
short   CAMAC_write_LAM_mask(usb_dev_handle *hdev, long Data)
1469
{
1470
    short ret;
1471
    ret = CAMAC_register_write(hdev, 9, Data);
1472
 
1473
    return ret;
1474
}
1475
 
1476
/*
1477
******** CAMAC_read_LAM_mask ************************
1478
 
1479
  Writes the data word to the LAM mask register
1480
 
1481
  Parameters:
1482
    hdev: USB devcie handle returned from an open function
1483
    Data: LAM mask to write
1484
 
1485
  Returns:
1486
    Number of bytes read from xxusb when successful
1487
    Upon failure, a negative number
1488
*/
1489
short   CAMAC_read_LAM_mask(usb_dev_handle *hdev, long *Data)
1490
{
1491
    long intbuf[4];  
1492
    int ret;
1493
    int N = 25;
1494
    int F = 0;
1495
    int A = 9;
1496
 
1497
    // CAMAC direct read function
1498
    intbuf[0]=1;
1499
    intbuf[1]=(long)(F+A*32+N*512 + 0x4000);
1500
    ret = xxusb_stack_execute(hdev, intbuf);
1501
    *Data=intbuf[0] + (intbuf[1] & 255) * 0x10000;    
1502
        return ret;
1503
}
1504
 
1505
 
1506
//******************************************************//
1507
//**************** EZ_CAMAC Functions ******************//
1508
//******************************************************//
1509
// The following are functions used to perform simple
1510
// CAMAC Functions with the CC_USB
1511
 
1512
 
1513
/*
1514
******** CAMAC_write ************************
1515
 
1516
  Performs a CAMAC write using NAF comments
1517
 
1518
  Parameters:
1519
    hdev: USB device handle returned from an open function
1520
    N: CAMAC Station Number
1521
    A: CAMAC Subaddress
1522
    F: CAMAC Function (16...23)
1523
    Q: The Q response from the CAMAC dataway
1524
    X: The comment accepted response from CAMAC dataway
1525
 
1526
  Returns:
1527
    Number of bytes written to xxusb when successful
1528
    Upon failure, a negative number    
1529
*/
1530
short   CAMAC_write(usb_dev_handle *hdev, int N, int A, int F, long Data, int *Q, int *X)
1531
{
1532
    long intbuf[4];  
1533
    int ret;
1534
// CAMAC direct write function
1535
    intbuf[0]=1;
1536
    intbuf[1]=(long)(F+A*32+N*512 + 0x4000);
1537
    if ((F > 15) && (F < 24))
1538
    {  
1539
        intbuf[0]=3;
1540
        intbuf[2]=(Data & 0xffff);
1541
        intbuf[3]=((Data >>16) & 255);
1542
        ret = xxusb_stack_execute(hdev, intbuf);
1543
        *Q = (intbuf[0] & 1);
1544
        *X = ((intbuf[0] >> 1) & 1);
1545
    }  
1546
    return ret;
1547
}
1548
 
1549
/*
1550
******** CAMAC_read ************************
1551
 
1552
  Performs a CAMAC read using NAF comments
1553
 
1554
  Parameters:
1555
    hdev: USB device handle returned from an open function
1556
    N: CAMAC Station Number
1557
    A: CAMAC Subaddress
1558
    F: CAMAC Function (F<16 or F>23)
1559
    Q: The Q response from the CAMAC dataway
1560
    X: The comment accepted response from CAMAC dataway
1561
 
1562
  Returns:
1563
    Number of bytes read from xxusb when successful
1564
    Upon failure, a negative number  
1565
*/
1566
short   CAMAC_read(usb_dev_handle *hdev, int N, int A, int F, long *Data, int *Q, int *X)
1567
{
1568
    long intbuf[4];  
1569
    int ret;
1570
    // CAMAC direct read function
1571
    intbuf[0]=1;
1572
    intbuf[1]=(long)(F+A*32+N*512 + 0x4000);
1573
    ret = xxusb_stack_execute(hdev, intbuf);
1574
    if ((F < 16) || (F >23))
1575
    {
1576
        *Data=intbuf[0] + (intbuf[1] & 255) * 0x10000;   //24-bit word 
1577
        *Q = ((intbuf[1] >> 8) & 1);
1578
        *X = ((intbuf[1] >> 9) & 1);
1579
    }  
1580
    return ret;
1581
}
1582
 
1583
/*
1584
******** CAMAC_Z ************************
1585
 
1586
  Performs a CAMAC init
1587
 
1588
  Parameters:
1589
    hdev: USB device handle returned from an open function
1590
 
1591
  Returns:
1592
    Number of bytes written to xxusb when successful
1593
    Upon failure, a negative number    
1594
*/
1595
short   CAMAC_Z(usb_dev_handle *hdev)
1596
{
1597
    long intbuf[4];  
1598
    int  ret;
1599
//  CAMAC Z = N(28) A(8) F(29)
1600
    intbuf[0]=1;
1601
    intbuf[1]=(long)(29+8*32+28*512 + 0x4000);
1602
    ret = xxusb_stack_execute(hdev, intbuf);
1603
    return ret;
1604
}
1605
 
1606
/*
1607
******** CAMAC_C ************************
1608
 
1609
  Performs a CAMAC clear
1610
 
1611
  Parameters:
1612
    hdev: USB device handle returned from an open function
1613
 
1614
  Returns:
1615
    Number of bytes written to xxusb when successful
1616
    Upon failure, a negative number    
1617
*/
1618
short   CAMAC_C(usb_dev_handle *hdev)
1619
{
1620
    long intbuf[4];  
1621
    int ret;
1622
    intbuf[0]=1;
1623
    intbuf[1]=(long)(29+9*32+28*512 + 0x4000);
1624
    ret = xxusb_stack_execute(hdev, intbuf);
1625
    return ret;
1626
}
1627
 
1628
/*
1629
******** CAMAC_I ************************
1630
 
1631
  Set CAMAC inhibit
1632
 
1633
  Parameters:
1634
    hdev: USB device handle returned from an open function
1635
 
1636
  Returns:
1637
    Number of bytes written to xxusb when successful
1638
    Upon failure, a negative number    
1639
*/
1640
short   CAMAC_I(usb_dev_handle *hdev, int inhibit)
1641
{
1642
    long intbuf[4];  
1643
    int  ret;
1644
    intbuf[0]=1;
1645
    if (inhibit) intbuf[1]=(long)(24+9*32+29*512 + 0x4000);
1646
    else intbuf[1]=(long)(26+9*32+29*512 + 0x4000);
1647
    ret = xxusb_stack_execute(hdev, intbuf);
1648
    return ret;
1649
}
1650
 
1651