00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <stdio.h>
00011 #include <string.h>
00012 #include "v1190B.h"
00013
00014
00015 WORD v1190_Read16(MVME_INTERFACE *mvme, DWORD base, int offset)
00016 {
00017 mvme_set_am(mvme, MVME_AM_A24);
00018 mvme_set_dmode(mvme, MVME_DMODE_D16);
00019 return mvme_read_value(mvme, base+offset);
00020 }
00021
00022 DWORD v1190_Read32(MVME_INTERFACE *mvme, DWORD base, int offset)
00023 {
00024 mvme_set_am(mvme, MVME_AM_A24);
00025 mvme_set_dmode(mvme, MVME_DMODE_D32);
00026 return mvme_read_value(mvme, base+offset);
00027 }
00028
00029 void v1190_Write16(MVME_INTERFACE *mvme, DWORD base, int offset, WORD value)
00030 {
00031 mvme_set_am(mvme, MVME_AM_A24);
00032 mvme_set_dmode(mvme, MVME_DMODE_D16);
00033 mvme_write_value(mvme, base+offset, value);
00034 }
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 int v1190_EventRead(MVME_INTERFACE *mvme, DWORD base, DWORD *pdest, int *nentry)
00046 {
00047 int cmode;
00048 DWORD hdata;
00049
00050 *nentry = 0;
00051 mvme_get_dmode(mvme, &cmode);
00052 mvme_set_dmode(mvme, MVME_DMODE_D32);
00053 if (v1190_DataReady(mvme, base)) {
00054 do {
00055 hdata = mvme_read_value(mvme, base);
00056 } while (!(hdata & 0x40000000));
00057 pdest[*nentry] = hdata;
00058 *nentry += 1;
00059
00060 do {
00061 pdest[*nentry] = mvme_read_value(mvme, base);
00062 *nentry += 1;
00063 } while (!(pdest[*nentry-1] & 0xc0000000));
00064 }
00065 mvme_set_dmode(mvme, cmode);
00066 return *nentry;
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 int v1190_DataRead(MVME_INTERFACE *mvme, DWORD base, DWORD *pdest, int nentry)
00100 {
00101 int cmode, status;
00102
00103 mvme_get_dmode(mvme, &cmode);
00104 mvme_set_dmode(mvme, MVME_DMODE_D32);
00105 mvme_set_blt(mvme, MVME_BLT_BLT32);
00106
00107 status = mvme_read(mvme, pdest, base, sizeof(DWORD) * nentry);
00108
00109 mvme_set_dmode(mvme, cmode);
00110 return nentry;
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121 }
00122
00123
00124 int v1190_GeoWrite(MVME_INTERFACE *mvme, DWORD base, int geo)
00125 {
00126 int cmode, data;
00127
00128 mvme_get_dmode(mvme, &cmode);
00129 mvme_set_dmode(mvme, MVME_DMODE_D16);
00130 mvme_write_value(mvme, base+V1190_GEO_REG_RW, (geo & 0x1F));
00131 data = mvme_read_value(mvme, base+V1190_GEO_REG_RW);
00132 mvme_set_dmode(mvme, cmode);
00133
00134 return (int) (data & 0x1F);
00135 }
00136
00137
00138 void v1190_SoftReset(MVME_INTERFACE *mvme, DWORD base)
00139 {
00140 int cmode;
00141
00142 mvme_get_dmode(mvme, &cmode);
00143 mvme_set_dmode(mvme, MVME_DMODE_D16);
00144 mvme_write_value(mvme, base+V1190_MODULE_RESET_WO, 0);
00145 mvme_set_dmode(mvme, cmode);
00146 }
00147
00148
00149 void v1190_SoftClear(MVME_INTERFACE *mvme, DWORD base)
00150 {
00151 int cmode;
00152
00153 mvme_get_dmode(mvme, &cmode);
00154 mvme_set_dmode(mvme, MVME_DMODE_D16);
00155 mvme_write_value(mvme, base+V1190_SOFT_CLEAR_WO, 0);
00156 mvme_set_dmode(mvme, cmode);
00157 }
00158
00159
00160 void v1190_SoftTrigger(MVME_INTERFACE *mvme, DWORD base)
00161 {
00162 int cmode;
00163
00164 mvme_get_dmode(mvme, &cmode);
00165 mvme_set_dmode(mvme, MVME_DMODE_D16);
00166 mvme_write_value(mvme, base+V1190_SOFT_TRIGGER_WO, 0);
00167 mvme_set_dmode(mvme, cmode);
00168 }
00169
00170
00171 int v1190_DataReady(MVME_INTERFACE *mvme, DWORD base)
00172 {
00173 int cmode, data;
00174
00175 mvme_get_dmode(mvme, &cmode);
00176 mvme_set_dmode(mvme, MVME_DMODE_D16);
00177 data = mvme_read_value(mvme, base+V1190_SR_RO);
00178 mvme_set_dmode(mvme, cmode);
00179 return (data & V1190_DATA_READY);
00180 }
00181
00182
00183 int v1190_EvtStored(MVME_INTERFACE *mvme, DWORD base)
00184 {
00185 int cmode, data;
00186
00187 mvme_get_dmode(mvme, &cmode);
00188 mvme_set_dmode(mvme, MVME_DMODE_D16);
00189 data = mvme_read_value(mvme, base+V1190_EVT_STORED_RO);
00190 mvme_set_dmode(mvme, cmode);
00191 return (data);
00192 }
00193
00194
00195 int v1190_EvtCounter(MVME_INTERFACE *mvme, DWORD base)
00196 {
00197 int cmode, data;
00198
00199 mvme_get_dmode(mvme, &cmode);
00200 mvme_set_dmode(mvme, MVME_DMODE_D32);
00201 data = mvme_read_value(mvme, base+V1190_EVT_CNT_RO);
00202 mvme_set_dmode(mvme, cmode);
00203 return (data);
00204 }
00205
00206
00207 void v1190_TdcIdList(MVME_INTERFACE *mvme, DWORD base)
00208 {
00209 int cmode, i, code;
00210 DWORD value;
00211
00212 mvme_get_dmode(mvme, &cmode);
00213 mvme_set_dmode(mvme, MVME_DMODE_D16);
00214
00215 for (i=0; i<2 ; i++) {
00216 code = V1190_MICRO_TDCID | (i & 0x0F);
00217 value = v1190_MicroWrite(mvme, base, code);
00218 value = v1190_MicroRead(mvme, base);
00219 value = (v1190_MicroRead(mvme, base) << 16) | value;
00220
00221 }
00222 mvme_set_dmode(mvme, cmode);
00223 }
00224
00225
00226 int v1190_ResolutionRead(MVME_INTERFACE *mvme, DWORD base)
00227 {
00228 WORD i, code;
00229 int cmode, value;
00230
00231 mvme_get_dmode(mvme, &cmode);
00232 mvme_set_dmode(mvme, MVME_DMODE_D16);
00233
00234 for (i=0; i<2 ; i++) {
00235 code = V1190_RESOLUTION_RO | (i & 0x0F);
00236 value = v1190_MicroWrite(mvme, base, code);
00237 value = v1190_MicroRead(mvme, base);
00238
00239 }
00240 mvme_set_dmode(mvme, cmode);
00241 return value;
00242 }
00243
00244
00245 void v1190_LEResolutionSet(MVME_INTERFACE *mvme, DWORD base, WORD le)
00246 {
00247 int cmode, value;
00248
00249 mvme_get_dmode(mvme, &cmode);
00250 mvme_set_dmode(mvme, MVME_DMODE_D16);
00251
00252 if ((le == LE_RESOLUTION_100) ||
00253 (le == LE_RESOLUTION_200) ||
00254 (le == LE_RESOLUTION_800)) {
00255 printf("le:%x\n", le);
00256 value = v1190_MicroWrite(mvme, base, V1190_LE_RESOLUTION_WO);
00257 value = v1190_MicroWrite(mvme, base, le);
00258 } else {
00259 printf("Wrong Leading Edge Resolution -> Disabled\n");
00260 value = v1190_MicroWrite(mvme, base, V1190_LE_RESOLUTION_WO);
00261 value = v1190_MicroWrite(mvme, base, 3);
00262 }
00263 mvme_set_dmode(mvme, cmode);
00264 }
00265
00266
00267 void v1190_LEWResolutionSet(MVME_INTERFACE *mvme, DWORD base, WORD le, WORD width)
00268 {
00269 printf("Not yet implemented\n");
00270 }
00271
00272
00273 void v1190_AcqModeRead(MVME_INTERFACE *mvme, DWORD base)
00274 {
00275 int cmode, value;
00276
00277 mvme_get_dmode(mvme, &cmode);
00278 mvme_set_dmode(mvme, MVME_DMODE_D16);
00279
00280 value = v1190_MicroWrite(mvme, base, V1190_ACQ_MODE_RO);
00281 value = v1190_MicroRead(mvme, base);
00282
00283 mvme_set_dmode(mvme, cmode);
00284 }
00285
00286
00287 void v1190_TriggerMatchingSet(MVME_INTERFACE *mvme, DWORD base)
00288 {
00289 int cmode, value;
00290
00291 mvme_get_dmode(mvme, &cmode);
00292 mvme_set_dmode(mvme, MVME_DMODE_D16);
00293
00294 value = v1190_MicroWrite(mvme, base, V1190_TRIGGER_MATCH_WO);
00295
00296
00297 mvme_set_dmode(mvme, cmode);
00298 }
00299
00300
00301 void v1190_ContinuousSet(MVME_INTERFACE *mvme, DWORD base)
00302 {
00303 int cmode, value;
00304
00305 mvme_get_dmode(mvme, &cmode);
00306 mvme_set_dmode(mvme, MVME_DMODE_D16);
00307
00308 value = v1190_MicroWrite(mvme, base, V1190_CONTINUOUS_WO);
00309
00310
00311 mvme_set_dmode(mvme, cmode);
00312 }
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323 void v1190_WidthSet(MVME_INTERFACE *mvme, DWORD base, WORD width)
00324 {
00325 int cmode, value;
00326
00327 mvme_get_dmode(mvme, &cmode);
00328 mvme_set_dmode(mvme, MVME_DMODE_D16);
00329
00330
00331 value = v1190_MicroWrite(mvme, base, V1190_WINDOW_WIDTH_WO);
00332 value = v1190_MicroWrite(mvme, base, width);
00333
00334
00335 mvme_set_dmode(mvme, cmode);
00336 }
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347 void v1190_OffsetSet(MVME_INTERFACE *mvme, DWORD base, WORD offset)
00348 {
00349 int cmode, value;
00350
00351 mvme_get_dmode(mvme, &cmode);
00352 mvme_set_dmode(mvme, MVME_DMODE_D16);
00353
00354
00355 value = v1190_MicroWrite(mvme, base, V1190_WINDOW_OFFSET_WO);
00356 value = v1190_MicroWrite(mvme, base, offset);
00357
00358
00359 mvme_set_dmode(mvme, cmode);
00360 }
00361
00362
00363 void v1190_SetEdgeDetection(MVME_INTERFACE *mvme, DWORD base, int eLeading, int eTrailing)
00364 {
00365 int cmode, value = 0;
00366
00367 mvme_get_dmode(mvme, &cmode);
00368 mvme_set_dmode(mvme, MVME_DMODE_D16);
00369
00370 if (eLeading)
00371 value |= 2;
00372
00373 if (eTrailing)
00374 value |= 1;
00375
00376
00377 v1190_MicroWrite(mvme, base, V1190_EDGE_DETECTION_WO);
00378 v1190_MicroWrite(mvme, base, value);
00379 mvme_set_dmode(mvme, cmode);
00380 }
00381
00382
00383
00384 int v1190_MicroWrite(MVME_INTERFACE *mvme, DWORD base, WORD data)
00385 {
00386 int cmode, i;
00387
00388 mvme_get_dmode(mvme, &cmode);
00389 mvme_set_dmode(mvme, MVME_DMODE_D16);
00390
00391 for (i=0; i<1000; i++)
00392 {
00393 WORD microHS = mvme_read_value(mvme, base+V1190_MICRO_HAND_RO);
00394 if (microHS & V1190_MICRO_WR_OK) {
00395 mvme_write_value(mvme, base+V1190_MICRO_RW, data);
00396 mvme_set_dmode(mvme, cmode);
00397 return 1;
00398 }
00399 udelay(500);
00400 }
00401
00402 printf("v1190_MicroWrite: Micro not ready for writing!\n");
00403 mvme_set_dmode(mvme, cmode);
00404 return -1;
00405 }
00406
00407
00408 int v1190_MicroRead(MVME_INTERFACE *mvme, const DWORD base)
00409 {
00410 int cmode, i;
00411 int reg=-1;
00412
00413 mvme_get_dmode(mvme, &cmode);
00414 mvme_set_dmode(mvme, MVME_DMODE_D16);
00415 for (i=100; i>0; i--) {
00416 WORD microHS = mvme_read_value(mvme, base+V1190_MICRO_HAND_RO);
00417 if (microHS & V1190_MICRO_RD_OK) {
00418 reg = mvme_read_value(mvme, base+V1190_MICRO_RW);
00419
00420 mvme_set_dmode(mvme, cmode);
00421 return (reg);
00422 }
00423 udelay(500);
00424 };
00425 mvme_set_dmode(mvme, cmode);
00426 return -1;
00427 }
00428
00429
00430 int v1190_MicroFlush(MVME_INTERFACE *mvme, const DWORD base)
00431 {
00432 int cmode, count = 0;
00433
00434 mvme_get_dmode(mvme, &cmode);
00435 mvme_set_dmode(mvme, MVME_DMODE_D16);
00436
00437 while (1)
00438 {
00439 int data = v1190_MicroRead(mvme, base);
00440 printf("microData[%d]: 0x%04x\n",count,data);
00441 if (data < 0)
00442 break;
00443 count++;
00444 }
00445 mvme_set_dmode(mvme, cmode);
00446 return count;
00447 }
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461 int v1190_Setup(MVME_INTERFACE *mvme, DWORD base, int mode)
00462 {
00463 WORD code, value;
00464 int cmode, status = -1;
00465
00466 mvme_get_dmode(mvme, &cmode);
00467 mvme_set_dmode(mvme, MVME_DMODE_D16);
00468
00469
00470 switch (mode) {
00471 case 0x1:
00472 printf("Trigger Matching Setup (mode:%d)\n", mode);
00473 printf("Default setting + Width : 800ns, Offset : -400ns\n");
00474 printf("Time subtract, Leading Edge only\n");
00475 code = 0x0000;
00476 if ((status = v1190_MicroWrite(mvme, base, code)) < 0)
00477 return status;
00478 code = 0x1000;
00479 value = v1190_MicroWrite(mvme, base, code);
00480 value = v1190_MicroWrite(mvme, base, 0x20);
00481 code = 0x1100;
00482 value = v1190_MicroWrite(mvme, base, code);
00483 value = v1190_MicroWrite(mvme, base, 0xfe8);
00484 code = 0x1500;
00485 value = v1190_MicroWrite(mvme, base, code);
00486 code = 0x2100;
00487 value = v1190_MicroWrite(mvme, base, code);
00488 break;
00489 case 0x2:
00490 code = 0x0500;
00491 value = v1190_MicroWrite(mvme, base, code);
00492 break;
00493 default:
00494 printf("Unknown setup mode\n");
00495 mvme_set_dmode(mvme, cmode);
00496 return -1;
00497 }
00498 v1190_Status(mvme, base);
00499 mvme_set_dmode(mvme, cmode);
00500 return 0;
00501 }
00502
00503
00504
00505
00506
00507
00508
00509
00510 int v1190_Status(MVME_INTERFACE *mvme, DWORD base)
00511 {
00512 WORD i, code, pair=0;
00513 int cmode, value;
00514 int ns = 25;
00515
00516 mvme_get_dmode(mvme, &cmode);
00517 mvme_set_dmode(mvme, MVME_DMODE_D16);
00518
00519
00520 printf("\n");
00521 printf("V1190 TDC at VME A24 0x%06x:\n", base);
00522 printf("\n--- Trigger Section [0x1600]:\n");
00523 code = 0x1600;
00524 if ((value = v1190_MicroWrite(mvme, base, code)) < 0)
00525 return -value;
00526 value = v1190_MicroRead(mvme, base);
00527 printf(" Match Window width : 0x%04x, %d ns\n", value, value*ns);
00528 value = v1190_MicroRead(mvme, base);
00529 printf(" Window offset : 0x%04x, %d ns\n", value, ((WORD)value)*ns);
00530 value = v1190_MicroRead(mvme, base);
00531 printf(" Extra Search Window Width: 0x%04x, %d ns\n", value, value*ns);
00532 value = v1190_MicroRead(mvme, base);
00533 printf(" Reject Margin : 0x%04x, %d ns\n", value, value*ns);
00534 value = v1190_MicroRead(mvme, base);
00535 printf(" Trigger Time subtraction : %s\n",(value & 0x1) ? "y" : "n");
00536
00537
00538 printf("\n--- Edge Detection & Resolution Section[0x2300/26/29]:\n");
00539 code = 0x2300;
00540 value = v1190_MicroWrite(mvme, base, code);
00541 pair = value = v1190_MicroRead(mvme, base);
00542 printf(" Edge Detection (1:T/2:L/3:TL) : 0x%02x\n", (value&0x3));
00543 code = 0x2600;
00544 value = v1190_MicroWrite(mvme, base, code);
00545 value = v1190_MicroRead(mvme, base);
00546 if (pair==0x3) {
00547 value = v1190_MicroRead(mvme, base);
00548 printf(" Leading Edge Resolution (see table) : 0x%02x\n", (value&0x3));
00549 printf(" Pulse Width Resolution (see table) : 0x%02x\n", ((value>>8)&0xF));
00550 } else {
00551 printf(" Resolution [ps] (0:800/1:200/2:100) : 0x%02x\n", (value&0x3));
00552 }
00553 code = 0x2900;
00554 value = v1190_MicroWrite(mvme, base, code);
00555 value = v1190_MicroRead(mvme, base);
00556 printf(" Dead Time between hit [~ns](5/10/30/100): 0x%02x\n", (value&0x3));
00557
00558
00559 printf("\n--- Readout Section[0x3200/34/3a/3c]:\n");
00560 code = 0x3200;
00561 value = v1190_MicroWrite(mvme, base, code);
00562 value = v1190_MicroRead(mvme, base);
00563 printf(" Header/Trailer : %s\n",(value & 0x1) ? "y" : "n");
00564 code = 0x3400;
00565 value = v1190_MicroWrite(mvme, base, code);
00566 value = v1190_MicroRead(mvme, base);
00567 printf(" Max #hits per event 2^n-1 (>128:no limit) : %d\n", value&0xF);
00568 code = 0x3a00;
00569 value = v1190_MicroWrite(mvme, base, code);
00570 value = v1190_MicroRead(mvme, base);
00571 printf(" Internal TDC error type (see doc) : 0x%04x\n", (value&0x7FF));
00572 code = 0x3c00;
00573 value = v1190_MicroWrite(mvme, base, code);
00574 value = v1190_MicroRead(mvme, base);
00575 printf(" Effective size of readout Fifo 2^n-1 : 0x%04x\n", (value&0xF));
00576
00577
00578 printf("\n--- Channel Enable Section[0x4500/47/49]:\n");
00579 code = 0x4500;
00580 value = v1190_MicroWrite(mvme, base, code);
00581 value = v1190_MicroRead(mvme, base);
00582 printf(" Read Enable Pattern [ 0..15 ] : 0x%04x\n", value);
00583 value = v1190_MicroRead(mvme, base);
00584 printf(" Read Enable Pattern [ 16..31 ] : 0x%04x\n", value);
00585 value = v1190_MicroRead(mvme, base);
00586 printf(" Read Enable Pattern [ 32..47 ] : 0x%04x\n", value);
00587 value = v1190_MicroRead(mvme, base);
00588 printf(" Read Enable Pattern [ 48..63 ] : 0x%04x\n", value);
00589 code = 0x4700;
00590 value = v1190_MicroWrite(mvme, base, code);
00591 value = v1190_MicroRead(mvme, base);
00592 value = (v1190_MicroRead(mvme, base)<<16) | value;
00593 printf(" Read Enable Pattern 32 (0) : 0x%08x\n", value);
00594 code = 0x4701;
00595 value = v1190_MicroWrite(mvme, base, code);
00596 value = v1190_MicroRead(mvme, base);
00597 value = (v1190_MicroRead(mvme, base)<<16) | value;
00598 printf(" Read Enable Pattern 32 (1) : 0x%08x\n", value);
00599
00600
00601 printf("\n--- Adjust Section[0x5100/60]:\n");
00602 code = 0x5100;
00603 value = v1190_MicroWrite(mvme, base, code);
00604 value = v1190_MicroRead(mvme, base);
00605 printf(" Coarse Counter Offset: 0x%04x\n", (value&0x7FF));
00606 value = v1190_MicroRead(mvme, base);
00607 printf(" Fine Counter Offset: 0x%04x\n", (value&0x1F));
00608 printf("\nMiscellaneous Section:\n");
00609 for (i=0; i<2 ; i++) {
00610 code = 0x6000 | (i & 0x0F);
00611 value = v1190_MicroWrite(mvme, base, code);
00612 value = v1190_MicroRead(mvme, base);
00613 value = (v1190_MicroRead(mvme, base) << 16) | value;
00614 printf(" TDC ID(%i) 0x%08x [code:0x%04x]\n", i, value, code);
00615 }
00616 mvme_set_dmode(mvme, cmode);
00617 return 0;
00618 }
00619
00620
00621 #ifndef HAVE_UDELAY
00622
00623 int udelay(int usec)
00624 {
00625 int i, j, k = 0;
00626 for (i=0; i<133; i++)
00627 for (j=0; j<usec; j++)
00628 k += (k+1)*j*k*(j+1);
00629 return k;
00630 }
00631 #endif
00632
00633
00634
00635 #ifdef MAIN_ENABLE
00636 int main () {
00637
00638 MVME_INTERFACE *myvme;
00639
00640 DWORD VMEIO_BASE = 0x780000;
00641 DWORD V1190_BASE = 0xF10000;
00642 int status, csr, i;
00643 DWORD cnt, array[10000];
00644
00645
00646
00647 status = mvme_open(&myvme, 0);
00648
00649
00650 mvme_set_am(myvme, MVME_AM_A24_ND);
00651
00652
00653 mvme_set_dmode(myvme, MVME_DMODE_D16);
00654
00655
00656 csr = mvme_read_value(myvme, V1190_BASE+V1190_FIRM_REV_RO);
00657 printf("Firmware revision: 0x%x\n", csr);
00658
00659
00660 v1190_Status(myvme, V1190_BASE);
00661
00662
00663
00664
00665 csr = v1190_DataReady(myvme, V1190_BASE);
00666 printf("Data Ready: 0x%x\n", csr);
00667
00668
00669 cnt = v1190_EvtCounter(myvme, V1190_BASE);
00670 printf("Event counter: 0x%lx\n", cnt);
00671
00672 memset(array, 0, sizeof(array));
00673
00674
00675 mvme_set_dmode(myvme, MVME_DMODE_D32);
00676
00677
00678 mvme_write_value(myvme, VMEIO_BASE+0x8, 0xF);
00679
00680
00681 mvme_write_value(myvme, VMEIO_BASE+0xc, 0x2);
00682
00683 mvme_set_blt(myvme, MVME_BLT_BLT32);
00684
00685
00686 v1190_DataRead(myvme, V1190_BASE, array, 500);
00687
00688
00689 mvme_write_value(myvme, VMEIO_BASE+0xc, 0x8);
00690
00691 for (i=0;i<12;i++)
00692 printf("Data[%i]=0x%lx\n", i, array[i]);
00693
00694 memset(array, 0, sizeof(array));
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705 status = mvme_close(myvme);
00706 return 0;
00707 }
00708 #endif
00709