Rev 5 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5 | 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 | #include "stdio.h" |
||
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 Uint32_t stacks, up to 4 MBytes Uint32_t, 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 Uint32_t |
||
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 Uint32_t integers (32 bits). |
||
96 | The latter option of passing a pointer to an array of unsigned Uint32_t 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 Uint32_t 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 Uint32_t |
||
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 Uint32_t 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 Uint32_t integers. |
||
144 | |||
145 | Paramters: |
||
146 | hdev: USB device handle returned from an open function |
||
147 | DataBuffer: pointer to an array of Uint32_t 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, Uint32_t RegData) |
||
207 | { |
||
208 | Uint32_t 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, Uint32_t *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, Uint32_t *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, Uint32_t *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 Uint32_t 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, Uint32_t *RegData) |
||
386 | { |
||
387 | //Uint32_t 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 | Uint32_t 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[20]; |
||
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 | printf("id %04x\n",dev->descriptor.idVendor); |
||
633 | udev = xxusb_device_open(dev); |
||
634 | if (udev) |
||
635 | { |
||
636 | ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string)); |
||
637 | printf("iSerial %04x string %s\n",dev->descriptor.iSerialNumber,string); |
||
638 | if (ret >0 ) |
||
639 | { |
||
640 | printf(" Device with %s\n",SerialString); |
||
641 | |||
642 | if (strcmp(string,SerialString)==0){ |
||
643 | printf(" Device with %s found\n",SerialString); |
||
644 | return udev; |
||
645 | } |
||
646 | } else { |
||
647 | printf(" Device returned %d\n",ret); |
||
648 | } |
||
649 | usb_close(udev); |
||
650 | } |
||
651 | } |
||
652 | } |
||
653 | } |
||
654 | udev = NULL; |
||
655 | return udev; |
||
656 | } |
||
657 | |||
658 | |||
659 | //******************************************************// |
||
660 | //****************** EZ_VME Functions ******************// |
||
661 | //******************************************************// |
||
662 | // The following are functions used to perform simple |
||
663 | // VME Functions with the VM_USB |
||
664 | |||
665 | /* |
||
666 | ******** VME_write_32 ************************ |
||
667 | |||
668 | Writes a 32 bit data word to the VME bus |
||
669 | |||
670 | Parameters: |
||
671 | hdev: USB devcie handle returned from an open function |
||
672 | Address_Modifier: VME address modifier for the VME call |
||
673 | VME_Address: Address to write the data to |
||
674 | Data: 32 bit data word to be written to VME_Address |
||
675 | |||
676 | Returns: |
||
677 | Number of bytes read from xxusb when successful |
||
678 | Upon failure, a negative number |
||
679 | */ |
||
680 | short VME_write_32(usb_dev_handle *hdev, short Address_Modifier, Uint32_t VME_Address, Uint32_t Data) |
||
681 | { |
||
682 | Uint32_t intbuf[1000]; |
||
683 | short ret; |
||
684 | intbuf[0]=7; |
||
685 | intbuf[1]=0; |
||
686 | intbuf[2]=Address_Modifier; |
||
687 | intbuf[3]=0; |
||
688 | intbuf[4]=(VME_Address & 0xffff); |
||
689 | intbuf[5]=((VME_Address >>16) & 0xffff); |
||
690 | intbuf[6]=(Data & 0xffff); |
||
691 | intbuf[7]=((Data >> 16) & 0xffff); |
||
692 | ret = xxusb_stack_execute(hdev, intbuf); |
||
693 | return ret; |
||
694 | } |
||
695 | |||
696 | /* |
||
697 | ******** VME_read_32 ************************ |
||
698 | |||
699 | |||
700 | Reads a 32 bit data word from a VME address |
||
701 | |||
702 | Parameters: |
||
703 | hdev: USB devcie handle returned from an open function |
||
704 | Address_Modifier: VME address modifier for the VME call |
||
705 | VME_Address: Address to read the data from |
||
706 | Data: 32 bit data word read from VME_Address |
||
707 | |||
708 | Returns: |
||
709 | Number of bytes read from xxusb when successful |
||
710 | Upon failure, a negative number |
||
711 | */ |
||
712 | short VME_read_32(usb_dev_handle *hdev, short Address_Modifier, Uint32_t VME_Address, Uint32_t *Data) |
||
713 | { |
||
714 | Uint32_t intbuf[1000]; |
||
715 | short ret; |
||
716 | intbuf[0]=5; |
||
717 | intbuf[1]=0; |
||
718 | intbuf[2]=Address_Modifier +0x100; |
||
719 | intbuf[3]=0; |
||
720 | intbuf[4]=(VME_Address & 0xffff); |
||
721 | intbuf[5]=((VME_Address >>16) & 0xffff); |
||
722 | ret = xxusb_stack_execute(hdev, intbuf); |
||
723 | *Data=intbuf[0] + (intbuf[1] * 0x10000); |
||
724 | return ret; |
||
725 | } |
||
726 | |||
727 | /* |
||
728 | ******** VME_write_16 ************************ |
||
729 | |||
730 | Writes a 16 bit data word to the VME bus |
||
731 | |||
732 | Parameters: |
||
733 | hdev: USB devcie handle returned from an open function |
||
734 | Address_Modifier: VME address modifier for the VME call |
||
735 | VME_Address: Address to write the data to |
||
736 | Data: word to be written to VME_Address |
||
737 | |||
738 | Returns: |
||
739 | Number of bytes read from xxusb when successful |
||
740 | Upon failure, a negative number |
||
741 | */ |
||
742 | short VME_write_16(usb_dev_handle *hdev, short Address_Modifier, Uint32_t VME_Address, Uint32_t Data) |
||
743 | { |
||
744 | Uint32_t intbuf[1000]; |
||
745 | short ret; |
||
746 | intbuf[0]=7; |
||
747 | intbuf[1]=0; |
||
748 | intbuf[2]=Address_Modifier; |
||
749 | intbuf[3]=0; |
||
750 | intbuf[4]=(VME_Address & 0xffff)+ 0x01; |
||
751 | intbuf[5]=((VME_Address >>16) & 0xffff); |
||
752 | intbuf[6]=(Data & 0xffff); |
||
753 | intbuf[7]=0; |
||
754 | ret = xxusb_stack_execute(hdev, intbuf); |
||
755 | return ret; |
||
756 | } |
||
757 | |||
758 | /* |
||
759 | ******** VME_read_16 ************************ |
||
760 | |||
761 | Reads a 16 bit data word from a VME address |
||
762 | |||
763 | Parameters: |
||
764 | hdev: USB devcie handle returned from an open function |
||
765 | Address_Modifier: VME address modifier for the VME call |
||
766 | VME_Address: Address to read the data from |
||
767 | Data: word read from VME_Address |
||
768 | |||
769 | Returns: |
||
770 | Number of bytes read from xxusb when successful |
||
771 | Upon failure, a negative number |
||
772 | */ |
||
773 | short VME_read_16(usb_dev_handle *hdev,short Address_Modifier, Uint32_t VME_Address, Uint32_t *Data) |
||
774 | { |
||
775 | Uint32_t intbuf[1000]; |
||
776 | short ret; |
||
777 | intbuf[0]=5; |
||
778 | intbuf[1]=0; |
||
779 | intbuf[2]=Address_Modifier +0x100; |
||
780 | intbuf[3]=0; |
||
781 | intbuf[4]=(VME_Address & 0xffff)+ 0x01; |
||
782 | intbuf[5]=((VME_Address >>16) & 0xffff); |
||
783 | ret = xxusb_stack_execute(hdev, intbuf); |
||
784 | *Data=intbuf[0]; |
||
785 | return ret; |
||
786 | } |
||
787 | |||
788 | /* |
||
789 | ******** VME_BLT_read_32 ************************ |
||
790 | |||
791 | Performs block transfer of 32 bit words from a VME address |
||
792 | |||
793 | Parameters: |
||
794 | hdev: USB devcie handle returned from an open function |
||
795 | Address_Modifier: VME address modifier for the VME call |
||
796 | count: number of data words to read |
||
797 | VME_Address: Address to read the data from |
||
798 | Data: pointer to an array to hold the data words |
||
799 | |||
800 | Returns: |
||
801 | Number of bytes read from xxusb when successful |
||
802 | Upon failure, a negative number |
||
803 | */ |
||
804 | short VME_BLT_read_32(usb_dev_handle *hdev, short Adress_Modifier, int count, Uint32_t VME_Address, Uint32_t Data[]) |
||
805 | { |
||
806 | Uint32_t intbuf[1000]; |
||
807 | short ret; |
||
808 | int i=0; |
||
809 | if (count > 255) return -1; |
||
810 | intbuf[0]=5; |
||
811 | intbuf[1]=0; |
||
812 | intbuf[2]=Adress_Modifier +0x100; |
||
813 | intbuf[3]=(count << 8); |
||
814 | intbuf[4]=(VME_Address & 0xffff); |
||
815 | intbuf[5]=((VME_Address >>16) & 0xffff); |
||
816 | ret = xxusb_stack_execute(hdev, intbuf); |
||
817 | int j=0; |
||
818 | for (i=0;i<(2*count);i=i+2) |
||
819 | { |
||
820 | Data[j]=intbuf[i] + (intbuf[i+1] * 0x10000); |
||
821 | j++; |
||
822 | } |
||
823 | return ret; |
||
824 | } |
||
825 | |||
826 | //******************************************************// |
||
827 | //****************** VM_USB Registers ******************// |
||
828 | //******************************************************// |
||
829 | // The following are functions used to set the registers |
||
830 | // in the VM_USB |
||
831 | |||
832 | /* |
||
833 | ******** VME_register_write ************************ |
||
834 | |||
835 | Writes to the vmusb registers that are accessible through |
||
836 | VME style calls |
||
837 | |||
838 | Parameters: |
||
839 | hdev: USB devcie handle returned from an open function |
||
840 | VME_Address: The VME Address of the internal register |
||
841 | Data: Data to be written to VME_Address |
||
842 | |||
843 | Returns: |
||
844 | Number of bytes read from xxusb when successful |
||
845 | Upon failure, a negative number |
||
846 | */ |
||
847 | short VME_register_write(usb_dev_handle *hdev, Uint32_t VME_Address, Uint32_t Data) |
||
848 | { |
||
849 | Uint32_t intbuf[1000]; |
||
850 | short ret; |
||
851 | |||
852 | intbuf[0]=7; |
||
853 | intbuf[1]=0; |
||
854 | intbuf[2]=0x1000; |
||
855 | intbuf[3]=0; |
||
856 | intbuf[4]=(VME_Address & 0xffff); |
||
857 | intbuf[5]=((VME_Address >>16) & 0xffff); |
||
858 | intbuf[6]=(Data & 0xffff); |
||
859 | intbuf[7]=((Data >> 16) & 0xffff); |
||
860 | ret = xxusb_stack_execute(hdev, intbuf); |
||
861 | return ret; |
||
862 | } |
||
863 | |||
864 | /* |
||
865 | ******** VME_register_read ************************ |
||
866 | |||
867 | Reads from the vmusb registers that are accessible trough VME style calls |
||
868 | |||
869 | Parameters: |
||
870 | hdev: USB devcie handle returned from an open function |
||
871 | VME_Address: The VME Address of the internal register |
||
872 | Data: Data read from VME_Address |
||
873 | |||
874 | Returns: |
||
875 | Number of bytes read from xxusb when successful |
||
876 | Upon failure, a negative number |
||
877 | */ |
||
878 | short VME_register_read(usb_dev_handle *hdev, Uint32_t VME_Address, Uint32_t *Data) |
||
879 | { |
||
880 | Uint32_t intbuf[1000]; |
||
881 | short ret; |
||
882 | |||
883 | intbuf[0]=5; |
||
884 | intbuf[1]=0; |
||
885 | intbuf[2]=0x1100; |
||
886 | intbuf[3]=0; |
||
887 | intbuf[4]=(VME_Address & 0xffff); |
||
888 | intbuf[5]=((VME_Address >>16) & 0xffff); |
||
889 | ret = xxusb_stack_execute(hdev, intbuf); |
||
890 | *Data=intbuf[0] + (intbuf[1] * 0x10000); |
||
891 | return ret; |
||
892 | } |
||
893 | |||
894 | /* |
||
895 | ******** VME_LED_settings ************************ |
||
896 | |||
897 | Sets the vmusb LED's |
||
898 | |||
899 | Parameters: |
||
900 | hdev: USB devcie handle returned from an open function |
||
901 | LED: The number which corresponds to an LED values are: |
||
902 | |||
903 | 1 - for RED LED |
||
904 | 2 - for GREEN LED |
||
905 | 3 - for Bottom YELLOW LED |
||
906 | code: The LED aource selector code, valid values for each LED |
||
907 | are listed in the manual |
||
908 | invert: to invert the LED lighting |
||
909 | latch: sets LED latch bit |
||
910 | |||
911 | Returns: |
||
912 | Number of bytes read from xxusb when successful |
||
913 | Upon failure, a negative number |
||
914 | */ |
||
915 | short VME_LED_settings(usb_dev_handle *hdev, int LED, int code, int invert, int latch) |
||
916 | { |
||
917 | short ret; |
||
918 | // Uint32_t internal; |
||
919 | Uint32_t Data; |
||
920 | |||
921 | if( (LED <0) ||(LED > 3) || (code < 0) || (code > 7)) return -1; |
||
922 | |||
923 | VME_register_read(hdev,0xc,&Data); |
||
924 | if(LED == 0) |
||
925 | { |
||
926 | Data = Data & 0xFFFFFF00; |
||
927 | Data = Data | code; |
||
928 | if (invert == 1 && latch == 1) Data = Data | 0x18; |
||
929 | if (invert == 1 && latch == 0) Data = Data | 0x08; |
||
930 | if (invert == 0 && latch == 1) Data = Data | 0x10; |
||
931 | } |
||
932 | if(LED == 1) |
||
933 | { |
||
934 | Data = Data & 0xFFFF00FF; |
||
935 | Data = Data | (code * 0x0100); |
||
936 | if (invert == 1 && latch == 1) Data = Data | 0x1800; |
||
937 | if (invert == 1 && latch == 0) Data = Data | 0x0800; |
||
938 | if (invert == 0 && latch == 1) Data = Data | 0x1000; |
||
939 | } |
||
940 | if(LED == 2) |
||
941 | { |
||
942 | Data = Data & 0xFF00FFFF; |
||
943 | Data = Data | (code * 0x10000); |
||
944 | if (invert == 1 && latch == 1) Data = Data | 0x180000; |
||
945 | if (invert == 1 && latch == 0) Data = Data | 0x080000; |
||
946 | if (invert == 0 && latch == 1) Data = Data | 0x100000; |
||
947 | } |
||
948 | if(LED == 3) |
||
949 | { |
||
950 | Data = Data & 0x00FFFFFF; |
||
951 | Data = Data | (code * 0x10000); |
||
952 | if (invert == 1 && latch == 1) Data = Data | 0x18000000; |
||
953 | if (invert == 1 && latch == 0) Data = Data | 0x08000000; |
||
954 | if (invert == 0 && latch == 1) Data = Data | 0x10000000; |
||
955 | } |
||
956 | ret = VME_register_write(hdev, 0xc, Data); |
||
957 | return ret; |
||
958 | } |
||
959 | |||
960 | /* |
||
961 | ******** VME_DGG ************************ |
||
962 | |||
963 | Sets the parameters for Gate & Delay channel A of vmusb |
||
964 | |||
965 | Parameters: |
||
966 | hdev: USB devcie handle returned from an open function |
||
967 | channel: Which DGG channel to use Valid Values are: |
||
968 | |||
969 | 1 - For DGG B |
||
970 | trigger: Determines what triggers the start of the DGG Valid values are: |
||
971 | |||
972 | 1 - NIM input 1 |
||
973 | 2 - NIM input 2 |
||
974 | 3 - Event Trigger |
||
975 | 4 - End of Event |
||
976 | 5 - USB Trigger |
||
977 | 6 - Pulser |
||
978 | output: Determines which NIM output to use for the channel, Vaild values are: |
||
979 | |||
980 | 1 - for NIM O2 |
||
981 | delay: 32 bit word consisting of |
||
982 | lower 16 bits: Delay_fine in steps of 12.5ns between trigger and start of gate |
||
983 | upper 16 bits: Delay_coarse in steps of 81.7us between trigger and start of gate |
||
984 | gate: the time the gate should stay open in steps of 12.5ns |
||
985 | invert: is 1 if you wish to invert the DGG channel output |
||
986 | latch: is 1 if you wish to run the DGG channel latched |
||
987 | |||
988 | Returns: |
||
989 | Returns 1 when successful |
||
990 | Upon failure, a negative number |
||
991 | */ |
||
992 | short VME_DGG(usb_dev_handle *hdev, unsigned short channel, unsigned short trigger, unsigned short output, |
||
993 | Uint32_t delay, unsigned short gate, unsigned short invert, unsigned short latch) |
||
994 | { |
||
995 | Uint32_t Data, DGData, Delay_ext; |
||
996 | Uint32_t internal; |
||
997 | short ret; |
||
998 | |||
999 | |||
1000 | ret = VME_register_read(hdev, 0x10, &Data); |
||
1001 | // check and correct values |
||
1002 | if(ret<=0) return -1; |
||
1003 | |||
1004 | if(channel >1) channel =1; |
||
1005 | if(invert >1) invert =1; |
||
1006 | if(latch >1) latch =1; |
||
1007 | if(output >1) output =1; |
||
1008 | if(trigger >6) trigger =0; |
||
1009 | |||
1010 | // define Delay and Gate data |
||
1011 | DGData = gate * 0x10000; |
||
1012 | DGData += (unsigned short) delay; |
||
1013 | |||
1014 | // Set channel, output, invert, latch |
||
1015 | if (output == 0) |
||
1016 | { |
||
1017 | Data = Data & 0xFFFFFF00; |
||
1018 | Data += 0x04 + channel +0x08*invert + 0x10*latch; |
||
1019 | } |
||
1020 | if (output == 1) |
||
1021 | { |
||
1022 | Data = Data & 0xFFFF00FF; |
||
1023 | Data += (0x04 + channel +0x08*invert + 0x10*latch)*0x100; |
||
1024 | } |
||
1025 | |||
1026 | // Set trigger, delay, gate |
||
1027 | |||
1028 | if(channel ==0) // CHANNEL DGG_A |
||
1029 | { |
||
1030 | internal = (trigger * 0x1000000) ; |
||
1031 | Data= Data & 0xF0FFFFFF; |
||
1032 | Data += internal; |
||
1033 | ret = VME_register_write(hdev,0x10,Data); |
||
1034 | if(ret<=0) return -1; |
||
1035 | ret=VME_register_write(hdev,0x14,DGData); |
||
1036 | if(ret<=0) return -1; |
||
1037 | // Set coarse delay in DGG_Extended register |
||
1038 | ret = VME_register_read(hdev,0x38,&Data); |
||
1039 | Delay_ext= (Data & 0xffff0000); |
||
1040 | Delay_ext+= ((delay/0x10000) & 0xffff); |
||
1041 | ret = VME_register_write(hdev,0x38,Delay_ext); |
||
1042 | } |
||
1043 | if( channel ==1) // CHANNEL DGG_B |
||
1044 | { |
||
1045 | internal = (trigger * 0x10000000) ; |
||
1046 | Data= Data & 0x0FFFFFFF; |
||
1047 | Data += internal; |
||
1048 | ret = VME_register_write(hdev,0x10,Data); |
||
1049 | if(ret<=0) return -1; |
||
1050 | ret=VME_register_write(hdev,0x18,DGData); |
||
1051 | if(ret<=0) return -1; |
||
1052 | // Set coarse delay in DGG_Extended register |
||
1053 | ret = VME_register_read(hdev,0x38,&Data); |
||
1054 | Delay_ext= (Data & 0x0000ffff); |
||
1055 | Delay_ext+= (delay & 0xffff0000); |
||
1056 | ret = VME_register_write(hdev,0x38,Delay_ext); |
||
1057 | } |
||
1058 | return 1; |
||
1059 | |||
1060 | } |
||
1061 | |||
1062 | /* |
||
1063 | ******** VME_Output_settings ************************ |
||
1064 | |||
1065 | Sets the vmusb NIM output register |
||
1066 | |||
1067 | Parameters: |
||
1068 | hdev: USB devcie handle returned from an open function |
||
1069 | Channel: The number which corresponds to an output: |
||
1070 | 1 - for Output 1 |
||
1071 | 2 - for Output 2 |
||
1072 | code: The Output selector code, valid values |
||
1073 | are listed in the manual |
||
1074 | invert: to invert the output |
||
1075 | latch: sets latch bit |
||
1076 | |||
1077 | Returns: |
||
1078 | Number of bytes read from xxusb when successful |
||
1079 | Upon failure, a negative number |
||
1080 | */ |
||
1081 | short VME_Output_settings(usb_dev_handle *hdev, int Channel, int code, int invert, int latch) |
||
1082 | { |
||
1083 | |||
1084 | short ret; |
||
1085 | // Uint32_t internal; |
||
1086 | Uint32_t Data; |
||
1087 | |||
1088 | if( (Channel <1) ||(Channel > 2) || (code < 0) || (code > 7)) return -1; |
||
1089 | VME_register_read(hdev,0x10,&Data); |
||
1090 | if(Channel == 1) |
||
1091 | { |
||
1092 | Data = Data & 0xFFFF00; |
||
1093 | Data = Data | code; |
||
1094 | if (invert == 1 && latch == 1) Data = Data | 0x18; |
||
1095 | if (invert == 1 && latch == 0) Data = Data | 0x08; |
||
1096 | if (invert == 0 && latch == 1) Data = Data | 0x10; |
||
1097 | } |
||
1098 | if(Channel == 2) |
||
1099 | { |
||
1100 | Data = Data & 0xFF00FF; |
||
1101 | Data = Data | (code * 0x0100); |
||
1102 | if (invert == 1 && latch == 1) Data = Data | 0x1800; |
||
1103 | if (invert == 1 && latch == 0) Data = Data | 0x0800; |
||
1104 | if (invert == 0 && latch == 1) Data = Data | 0x1000; |
||
1105 | } |
||
1106 | ret = VME_register_write(hdev, 0x10, Data); |
||
1107 | return ret; |
||
1108 | } |
||
1109 | |||
1110 | |||
1111 | //******************************************************// |
||
1112 | //****************** CC_USB Registers ******************// |
||
1113 | //******************************************************// |
||
1114 | // The following are functions used to set the registers |
||
1115 | // in the CAMAC_USB |
||
1116 | |||
1117 | /* |
||
1118 | ******** CAMAC_register_write ***************** |
||
1119 | |||
1120 | Performs a CAMAC write to CC_USB register |
||
1121 | |||
1122 | Parameters: |
||
1123 | hdev: USB device handle returned from an open function |
||
1124 | A: CAMAC Subaddress |
||
1125 | F: CAMAC Function |
||
1126 | Data: data to be written |
||
1127 | |||
1128 | Returns: |
||
1129 | Number of bytes written to xxusb when successful |
||
1130 | Upon failure, a negative number |
||
1131 | */ |
||
1132 | short CAMAC_register_write(usb_dev_handle *hdev, int A, Uint32_t Data) |
||
1133 | { |
||
1134 | int F = 16; |
||
1135 | int N = 25; |
||
1136 | Uint32_t intbuf[4]; |
||
1137 | int ret; |
||
1138 | |||
1139 | intbuf[0]=1; |
||
1140 | intbuf[1]=(Uint32_t)(F+A*32+N*512 + 0x4000); |
||
1141 | intbuf[0]=3; |
||
1142 | intbuf[2]=(Data & 0xffff); |
||
1143 | intbuf[3]=((Data >>16) & 0xffff); |
||
1144 | ret = xxusb_stack_execute(hdev, intbuf); |
||
1145 | |||
1146 | return ret; |
||
1147 | } |
||
1148 | |||
1149 | /* |
||
1150 | ******** CAMAC_register_read ************************ |
||
1151 | |||
1152 | Performs a CAMAC read from CC_USB register |
||
1153 | |||
1154 | Parameters: |
||
1155 | hdev: USB device handle returned from an open function |
||
1156 | N: CAMAC Station Number |
||
1157 | A: CAMAC Subaddress |
||
1158 | F: CAMAC Function |
||
1159 | Q: The Q response from the CAMAC dataway |
||
1160 | X: The comment accepted response from CAMAC dataway |
||
1161 | |||
1162 | Returns: |
||
1163 | Number of bytes read from xxusb when successful |
||
1164 | Upon failure, a negative number |
||
1165 | */ |
||
1166 | short CAMAC_register_read(usb_dev_handle *hdev, int A, Uint32_t *Data) |
||
1167 | { |
||
1168 | int F = 0; |
||
1169 | int N = 25; |
||
1170 | Uint32_t intbuf[4]; |
||
1171 | int ret; |
||
1172 | |||
1173 | intbuf[0]=1; |
||
1174 | intbuf[1]=(Uint32_t)(F+A*32+N*512 + 0x4000); |
||
1175 | ret = xxusb_stack_execute(hdev, intbuf); |
||
1176 | *Data=intbuf[0] + (intbuf[1] * 0x10000); |
||
1177 | |||
1178 | return ret; |
||
1179 | } |
||
1180 | |||
1181 | /* |
||
1182 | ******** CAMAC_DGG ************************ |
||
1183 | |||
1184 | Sets the parameters for Gate & Delay channel A of CC_USB |
||
1185 | |||
1186 | Parameters: |
||
1187 | hdev: USB devcie handle returned from an open function |
||
1188 | channel: Which DGG channel to use Valid Values are: |
||
1189 | |||
1190 | 1 - For DGG B |
||
1191 | trigger: Determines what triggers the start of the DGG Valid values are: |
||
1192 | |||
1193 | 1 - NIM input 1 |
||
1194 | 2 - NIM input 2 |
||
1195 | 3 - NIM input 2 |
||
1196 | 4 - Event Trigger |
||
1197 | 5 - End of Event |
||
1198 | 6 - USB Trigger |
||
1199 | 7 - Pulser |
||
1200 | output: Determines which NIM output to use for the channel, Vaild values are: |
||
1201 | 1 - for NIM O1 |
||
1202 | 2 - for NIM O2 |
||
1203 | 3 - for NIM O3 |
||
1204 | delay: Delay in steps of 12.5ns between trigger and start of gate |
||
1205 | gate: the time the gate should stay open in steps of 12.5ns |
||
1206 | invert: is 1 if you wish to invert the DGG channel output |
||
1207 | latch: is 1 if you wish to run the DGG channel latched |
||
1208 | |||
1209 | Returns: |
||
1210 | Returns 1 when successful |
||
1211 | Upon failure, a negative number |
||
1212 | */ |
||
1213 | short CAMAC_DGG(usb_dev_handle *hdev, short channel, short trigger, short output, |
||
1214 | int delay, int gate, short invert, short latch) |
||
1215 | |||
1216 | |||
1217 | |||
1218 | { |
||
1219 | // short channel_ID; |
||
1220 | Uint32_t Data; |
||
1221 | Uint32_t internal; |
||
1222 | short ret; |
||
1223 | Uint32_t Delay_ext; |
||
1224 | |||
1225 | ret = CAMAC_register_read(hdev,5,&Data); |
||
1226 | //Set trigger |
||
1227 | if((output < 1 ) || (output >3) || (channel < 0 ) || (channel > 1)) |
||
1228 | return -1; |
||
1229 | if(output ==1) |
||
1230 | { |
||
1231 | if(channel ==0) |
||
1232 | { |
||
1233 | internal = 0x03; |
||
1234 | } else { |
||
1235 | internal = 0x04; |
||
1236 | } |
||
1237 | } |
||
1238 | if(output ==2) |
||
1239 | { |
||
1240 | if(channel ==0) |
||
1241 | { |
||
1242 | internal = 0x04; |
||
1243 | } else { |
||
1244 | internal = 0x05; |
||
1245 | } |
||
1246 | } |
||
1247 | if(output ==3) |
||
1248 | { |
||
1249 | if(channel ==0) |
||
1250 | { |
||
1251 | internal = 0x05; |
||
1252 | } else { |
||
1253 | internal = 0x06; |
||
1254 | } |
||
1255 | } |
||
1256 | |||
1257 | |||
1258 | // Set invert bit |
||
1259 | if(invert ==1) |
||
1260 | internal = internal | 0x10; |
||
1261 | else |
||
1262 | internal = internal & 0x0F; |
||
1263 | // Set Latch Bit |
||
1264 | if(latch==1) |
||
1265 | internal = internal | 0x20; |
||
1266 | else |
||
1267 | internal = internal & 0x1F; |
||
1268 | // Add new data to old |
||
1269 | if(output == 1) |
||
1270 | { |
||
1271 | Data = Data & 0xFFFF00; |
||
1272 | Data = Data | internal; |
||
1273 | } |
||
1274 | if(output == 2) |
||
1275 | { |
||
1276 | Data = Data & 0xFF00FF; |
||
1277 | Data = Data |(internal * 0x100); |
||
1278 | } |
||
1279 | if(output == 3) |
||
1280 | { |
||
1281 | Data = Data & 0x00FFFF; |
||
1282 | Data = Data | (internal * 0x10000) ; |
||
1283 | } |
||
1284 | CAMAC_register_write(hdev, 5, Data); |
||
1285 | ret = CAMAC_register_read(hdev,6,&Data); |
||
1286 | //Set Trigger |
||
1287 | if(trigger <0 || trigger > 7) |
||
1288 | return -1; |
||
1289 | if(channel ==0) |
||
1290 | { |
||
1291 | Data = Data & 0xFF00FFFF; |
||
1292 | internal = trigger * 0x10000; |
||
1293 | Data = Data | internal; |
||
1294 | } else { |
||
1295 | Data = Data & 0x00FFFFFF; |
||
1296 | internal = trigger * 0x1000000; |
||
1297 | Data = Data | internal; |
||
1298 | } |
||
1299 | ret = CAMAC_register_write(hdev, 6, Data); |
||
1300 | if(channel == 0) |
||
1301 | { |
||
1302 | // Write Delay and Gate info |
||
1303 | ret = CAMAC_register_read(hdev,13,&Data); |
||
1304 | Delay_ext= (Data & 0xffff0000); |
||
1305 | Delay_ext+= ((delay/0x10000) & 0xffff); |
||
1306 | internal = gate * 0x10000; |
||
1307 | Data = internal + (delay & 0xffff); |
||
1308 | ret=CAMAC_register_write(hdev,7,Data); |
||
1309 | // Set coarse delay in DGG_Extended register |
||
1310 | ret=CAMAC_register_write(hdev,13,Delay_ext); |
||
1311 | } |
||
1312 | else |
||
1313 | { |
||
1314 | ret=CAMAC_register_write(hdev,8,Data); |
||
1315 | ret = CAMAC_register_read(hdev,13,&Data); |
||
1316 | Delay_ext= (Data & 0x0000ffff); |
||
1317 | Delay_ext+= (delay & 0xffff0000); |
||
1318 | internal = gate * 0x10000; |
||
1319 | Data = internal + (delay & 0xffff); |
||
1320 | // Set coarse delay in DGG_Extended register |
||
1321 | ret=CAMAC_register_write(hdev,13,Delay_ext); |
||
1322 | } |
||
1323 | return 1; |
||
1324 | } |
||
1325 | |||
1326 | /* |
||
1327 | ******** CAMAC_LED_settings ************************ |
||
1328 | |||
1329 | Writes a data word to the vmusb LED register |
||
1330 | |||
1331 | Parameters: |
||
1332 | hdev: USB devcie handle returned from an open function |
||
1333 | LED: The number which corresponds to an LED values are: |
||
1334 | 1 - for RED LED |
||
1335 | 2 - for GREEN LED |
||
1336 | 3 - for Yellow LED |
||
1337 | code: The LED aource selector code, valid values for each LED |
||
1338 | are listed in the manual |
||
1339 | invert: to invert the LED lighting |
||
1340 | latch: sets LED latch bit |
||
1341 | |||
1342 | Returns: |
||
1343 | Number of bytes read from xxusb when successful |
||
1344 | Upon failure, a negative number |
||
1345 | */ |
||
1346 | short CAMAC_LED_settings(usb_dev_handle *hdev, int LED, int code, int invert, int latch) |
||
1347 | { |
||
1348 | |||
1349 | short ret; |
||
1350 | // Uint32_t internal; |
||
1351 | Uint32_t Data; |
||
1352 | |||
1353 | if( (LED <1) ||(LED > 3) || (code < 0) || (code > 7)) |
||
1354 | return -1; |
||
1355 | |||
1356 | CAMAC_register_read(hdev,4,&Data); |
||
1357 | |||
1358 | if(LED == 1) |
||
1359 | { |
||
1360 | Data = Data & 0xFFFF00; |
||
1361 | Data = Data | code; |
||
1362 | if (invert == 1 && latch == 1) |
||
1363 | Data = Data | 0x30; |
||
1364 | if (invert == 1 && latch == 0) |
||
1365 | Data = Data | 0x10; |
||
1366 | if (invert == 0 && latch == 1) |
||
1367 | Data = Data | 0x20; |
||
1368 | } |
||
1369 | if(LED == 2) |
||
1370 | { |
||
1371 | Data = Data & 0xFF00FF; |
||
1372 | Data = Data | (code * 0x0100); |
||
1373 | if (invert == 1 && latch == 1) |
||
1374 | Data = Data | 0x3000; |
||
1375 | if (invert == 1 && latch == 0) |
||
1376 | Data = Data | 0x1000; |
||
1377 | if (invert == 0 && latch == 1) |
||
1378 | Data = Data | 0x2000; |
||
1379 | } |
||
1380 | if(LED == 3) |
||
1381 | { |
||
1382 | Data = Data & 0x00FFFF; |
||
1383 | Data = Data | (code * 0x10000); |
||
1384 | if (invert == 1 && latch == 1) |
||
1385 | Data = Data | 0x300000; |
||
1386 | if (invert == 1 && latch == 0) |
||
1387 | Data = Data | 0x100000; |
||
1388 | if (invert == 0 && latch == 1) |
||
1389 | Data = Data | 0x200000; |
||
1390 | } |
||
1391 | ret = CAMAC_register_write(hdev, 4, Data); |
||
1392 | return ret; |
||
1393 | } |
||
1394 | |||
1395 | /* |
||
1396 | ******** CAMAC_Output_settings ************************ |
||
1397 | |||
1398 | Writes a data word to the vmusb LED register |
||
1399 | |||
1400 | Parameters: |
||
1401 | hdev: USB devcie handle returned from an open function |
||
1402 | Channel: The number which corresponds to an output: |
||
1403 | 1 - for Output 1 |
||
1404 | 2 - for Output 2 |
||
1405 | 3 - for Output 3 |
||
1406 | code: The Output selector code, valid values |
||
1407 | are listed in the manual |
||
1408 | invert: to invert the output |
||
1409 | latch: sets latch bit |
||
1410 | |||
1411 | Returns: |
||
1412 | Number of bytes read from xxusb when successful |
||
1413 | Upon failure, a negative number |
||
1414 | */ |
||
1415 | short CAMAC_Output_settings(usb_dev_handle *hdev, int Channel, int code, int invert, int latch) |
||
1416 | { |
||
1417 | short ret; |
||
1418 | // Uint32_t internal; |
||
1419 | Uint32_t Data; |
||
1420 | |||
1421 | if( (Channel <1) ||(Channel > 3) || (code < 0) || (code > 7)) |
||
1422 | return -1; |
||
1423 | |||
1424 | CAMAC_register_read(hdev,5,&Data); |
||
1425 | |||
1426 | if(Channel == 1) |
||
1427 | { |
||
1428 | Data = Data & 0xFFFF00; |
||
1429 | Data = Data | code; |
||
1430 | if (invert == 1 && latch == 1) |
||
1431 | Data = Data | 0x30; |
||
1432 | if (invert == 1 && latch == 0) |
||
1433 | Data = Data | 0x10; |
||
1434 | if (invert == 0 && latch == 1) |
||
1435 | Data = Data | 0x20; |
||
1436 | } |
||
1437 | if(Channel == 2) |
||
1438 | { |
||
1439 | Data = Data & 0xFF00FF; |
||
1440 | Data = Data | (code * 0x0100); |
||
1441 | if (invert == 1 && latch == 1) |
||
1442 | Data = Data | 0x3000; |
||
1443 | if (invert == 1 && latch == 0) |
||
1444 | Data = Data | 0x1000; |
||
1445 | if (invert == 0 && latch == 1) |
||
1446 | Data = Data | 0x2000; |
||
1447 | } |
||
1448 | if(Channel == 3) |
||
1449 | { |
||
1450 | Data = Data & 0x00FFFF; |
||
1451 | Data = Data | (code * 0x10000); |
||
1452 | if (invert == 1 && latch == 1) |
||
1453 | Data = Data | 0x300000; |
||
1454 | if (invert == 1 && latch == 0) |
||
1455 | Data = Data | 0x100000; |
||
1456 | if (invert == 0 && latch == 1) |
||
1457 | Data = Data | 0x200000; |
||
1458 | } |
||
1459 | ret = CAMAC_register_write(hdev, 5, Data); |
||
1460 | return ret; |
||
1461 | } |
||
1462 | |||
1463 | /* |
||
1464 | ******** CAMAC_write_LAM_mask ************************ |
||
1465 | |||
1466 | Writes the data word to the LAM mask register |
||
1467 | |||
1468 | Parameters: |
||
1469 | hdev: USB devcie handle returned from an open function |
||
1470 | Data: LAM mask to write |
||
1471 | |||
1472 | Returns: |
||
1473 | Number of bytes read from xxusb when successful |
||
1474 | Upon failure, a negative number |
||
1475 | */ |
||
1476 | short CAMAC_write_LAM_mask(usb_dev_handle *hdev, Uint32_t Data) |
||
1477 | { |
||
1478 | short ret; |
||
1479 | ret = CAMAC_register_write(hdev, 9, Data); |
||
1480 | |||
1481 | return ret; |
||
1482 | } |
||
1483 | |||
1484 | /* |
||
1485 | ******** CAMAC_read_LAM_mask ************************ |
||
1486 | |||
1487 | Writes the data word to the LAM mask register |
||
1488 | |||
1489 | Parameters: |
||
1490 | hdev: USB devcie handle returned from an open function |
||
1491 | Data: LAM mask to write |
||
1492 | |||
1493 | Returns: |
||
1494 | Number of bytes read from xxusb when successful |
||
1495 | Upon failure, a negative number |
||
1496 | */ |
||
1497 | short CAMAC_read_LAM_mask(usb_dev_handle *hdev, Uint32_t *Data) |
||
1498 | { |
||
1499 | Uint32_t intbuf[4]; |
||
1500 | int ret; |
||
1501 | int N = 25; |
||
1502 | int F = 0; |
||
1503 | int A = 9; |
||
1504 | |||
1505 | // CAMAC direct read function |
||
1506 | intbuf[0]=1; |
||
1507 | intbuf[1]=(Uint32_t)(F+A*32+N*512 + 0x4000); |
||
1508 | ret = xxusb_stack_execute(hdev, intbuf); |
||
1509 | *Data=intbuf[0] + (intbuf[1] & 255) * 0x10000; |
||
1510 | return ret; |
||
1511 | } |
||
1512 | |||
1513 | |||
1514 | //******************************************************// |
||
1515 | //**************** EZ_CAMAC Functions ******************// |
||
1516 | //******************************************************// |
||
1517 | // The following are functions used to perform simple |
||
1518 | // CAMAC Functions with the CC_USB |
||
1519 | |||
1520 | |||
1521 | /* |
||
1522 | ******** CAMAC_write ************************ |
||
1523 | |||
1524 | Performs a CAMAC write using NAF comments |
||
1525 | |||
1526 | Parameters: |
||
1527 | hdev: USB device handle returned from an open function |
||
1528 | N: CAMAC Station Number |
||
1529 | A: CAMAC Subaddress |
||
1530 | F: CAMAC Function (16...23) |
||
1531 | Q: The Q response from the CAMAC dataway |
||
1532 | X: The comment accepted response from CAMAC dataway |
||
1533 | |||
1534 | Returns: |
||
1535 | Number of bytes written to xxusb when successful |
||
1536 | Upon failure, a negative number |
||
1537 | */ |
||
1538 | short CAMAC_write(usb_dev_handle *hdev, int N, int A, int F, Uint32_t Data, int *Q, int *X) |
||
1539 | { |
||
1540 | Uint32_t intbuf[4]; |
||
1541 | int ret; |
||
1542 | // CAMAC direct write function |
||
1543 | intbuf[0]=1; |
||
1544 | intbuf[1]=(Uint32_t)(F+A*32+N*512 + 0x4000); |
||
1545 | if ((F > 15) && (F < 24)) |
||
1546 | { |
||
1547 | intbuf[0]=3; |
||
1548 | intbuf[2]=(Data & 0xffff); |
||
1549 | intbuf[3]=((Data >>16) & 255); |
||
1550 | ret = xxusb_stack_execute(hdev, intbuf); |
||
1551 | *Q = (intbuf[0] & 1); |
||
1552 | *X = ((intbuf[0] >> 1) & 1); |
||
1553 | } |
||
1554 | return ret; |
||
1555 | } |
||
1556 | |||
1557 | /* |
||
1558 | ******** CAMAC_read ************************ |
||
1559 | |||
1560 | Performs a CAMAC read using NAF comments |
||
1561 | |||
1562 | Parameters: |
||
1563 | hdev: USB device handle returned from an open function |
||
1564 | N: CAMAC Station Number |
||
1565 | A: CAMAC Subaddress |
||
1566 | F: CAMAC Function (F<16 or F>23) |
||
1567 | Q: The Q response from the CAMAC dataway |
||
1568 | X: The comment accepted response from CAMAC dataway |
||
1569 | |||
1570 | Returns: |
||
1571 | Number of bytes read from xxusb when successful |
||
1572 | Upon failure, a negative number |
||
1573 | */ |
||
1574 | short CAMAC_read(usb_dev_handle *hdev, int N, int A, int F, Uint32_t *Data, int *Q, int *X) |
||
1575 | { |
||
1576 | Uint32_t intbuf[4]; |
||
1577 | int ret; |
||
1578 | // CAMAC direct read function |
||
1579 | intbuf[0]=1; |
||
1580 | intbuf[1]=(Uint32_t)(F+A*32+N*512 + 0x4000); |
||
1581 | ret = xxusb_stack_execute(hdev, intbuf); |
||
1582 | if ((F < 16) || (F >23)) |
||
1583 | { |
||
1584 | *Data=intbuf[0] + (intbuf[1] & 255) * 0x10000; //24-bit word |
||
1585 | *Q = ((intbuf[1] >> 8) & 1); |
||
1586 | *X = ((intbuf[1] >> 9) & 1); |
||
1587 | } |
||
1588 | return ret; |
||
1589 | } |
||
1590 | |||
1591 | /* |
||
1592 | ******** CAMAC_Z ************************ |
||
1593 | |||
1594 | Performs a CAMAC init |
||
1595 | |||
1596 | Parameters: |
||
1597 | hdev: USB device handle returned from an open function |
||
1598 | |||
1599 | Returns: |
||
1600 | Number of bytes written to xxusb when successful |
||
1601 | Upon failure, a negative number |
||
1602 | */ |
||
1603 | short CAMAC_Z(usb_dev_handle *hdev) |
||
1604 | { |
||
1605 | Uint32_t intbuf[4]; |
||
1606 | int ret; |
||
1607 | // CAMAC Z = N(28) A(8) F(29) |
||
1608 | intbuf[0]=1; |
||
1609 | intbuf[1]=(Uint32_t)(29+8*32+28*512 + 0x4000); |
||
1610 | ret = xxusb_stack_execute(hdev, intbuf); |
||
1611 | return ret; |
||
1612 | } |
||
1613 | |||
1614 | /* |
||
1615 | ******** CAMAC_C ************************ |
||
1616 | |||
1617 | Performs a CAMAC clear |
||
1618 | |||
1619 | Parameters: |
||
1620 | hdev: USB device handle returned from an open function |
||
1621 | |||
1622 | Returns: |
||
1623 | Number of bytes written to xxusb when successful |
||
1624 | Upon failure, a negative number |
||
1625 | */ |
||
1626 | short CAMAC_C(usb_dev_handle *hdev) |
||
1627 | { |
||
1628 | Uint32_t intbuf[4]; |
||
1629 | int ret; |
||
1630 | intbuf[0]=1; |
||
1631 | intbuf[1]=(Uint32_t)(29+9*32+28*512 + 0x4000); |
||
1632 | ret = xxusb_stack_execute(hdev, intbuf); |
||
1633 | return ret; |
||
1634 | } |
||
1635 | |||
1636 | /* |
||
1637 | ******** CAMAC_I ************************ |
||
1638 | |||
1639 | Set CAMAC inhibit |
||
1640 | |||
1641 | Parameters: |
||
1642 | hdev: USB device handle returned from an open function |
||
1643 | |||
1644 | Returns: |
||
1645 | Number of bytes written to xxusb when successful |
||
1646 | Upon failure, a negative number |
||
1647 | */ |
||
1648 | short CAMAC_I(usb_dev_handle *hdev, int inhibit) |
||
1649 | { |
||
1650 | Uint32_t intbuf[4]; |
||
1651 | int ret; |
||
1652 | intbuf[0]=1; |
||
1653 | if (inhibit) intbuf[1]=(Uint32_t)(24+9*32+29*512 + 0x4000); |
||
1654 | else intbuf[1]=(Uint32_t)(26+9*32+29*512 + 0x4000); |
||
1655 | ret = xxusb_stack_execute(hdev, intbuf); |
||
1656 | return ret; |
||
1657 | } |
||
1658 | |||
1659 |