Subversion Repositories f9daq

Rev

Details | Last modification | View Log | RSS feed

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