00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <stdio.h>
00010 #include <string.h>
00011 #include <stdlib.h>
00012 #include <iostream>
00013 #include <time.h>
00014 #include <unistd.h>
00015
00016 #include "ABBdaemon.h"
00017
00018 #include "sp605/Iterator.h"
00019
00020 #define NUMBUFFERS 100
00021 #define BUFFERSIZE 65536
00022 #define MAXNUMROCS 10
00023
00029 void printMessage(const char* prefix, uint8_t* buffer, const char* suffix = "")
00030 {
00031 printf("%s: Msg: %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x%s\n",
00032 prefix, buffer[0], buffer[1], buffer[2], buffer[3],
00033 buffer[4], buffer[5], buffer[6], buffer[7], suffix);
00034 }
00035
00036 void usage()
00037 {
00038 printf("abbtest program v 1.2\n");
00039 printf("Arguments:\n");
00040 printf(" -sfp0 | -sfp1 - run test via first or second port\n");
00041 printf(" -brdid addr - specify board address (in decimal or 0x hexadecimal form) \n");
00042 printf(" -retid addr - specify return (ABB) address, default 0x10 \n");
00043 printf(" -both - run test with both connectors\n");
00044 printf(" -get addr - get register from board(s)\n");
00045 printf(" -put addr val - set register on board(s)\n");
00046 printf(" -test N - run specified test number (from 0 to 7, default 0)\n");
00047 printf(" -dlmN - issue only DLM(N) and exit\n");
00048 printf(" -all - run all tests from 0 to 7\n");
00049 printf(" -o | -v - more output in tests 2, 3, 4, 7, 11\n");
00050 printf(" -reset - only reset ROC board\n");
00051 printf(" -resetabb - try to reset ABB from FFs state\n");
00052 printf(" -long - make test 4 much longer\n");
00053 printf(" -nostop - do not stop data taking in tests 4 & 7\n");
00054 printf(" -dlm - use DLM 8/9 to start/stop DAQ in tests 4 and 7\n");
00055 printf(" -sleep - do sleep(1) after each DLM\n");
00056 printf(" -fifo - show only fifo and exit\n");
00057 printf(" -rocver - show roc firmware version\n");
00058 printf(" -help | ? - show this help\n");
00059 }
00060
00061
00062 int convert_to_int(const char* str)
00063 {
00064 if ((str==0) || (*str==0)) return 0;
00065
00066 int base = 10;
00067 if ((strlen(str)>2) && (str[0]=='0') && ((str[1]=='x') || (str[1]=='X'))) {
00068 str+=2;
00069 base = 16;
00070 }
00071 char* endptr(0);
00072
00073 return strtol(str, &endptr, base);
00074 }
00075
00076 int main(int argc, char** argv)
00077 {
00078 uint32_t RETID = 0x010;
00079 uint32_t ROCID[MAXNUMROCS];
00080
00081 uint32_t oper_addr(0), oper_arg(0), repeat_cnt(0);
00082
00083
00084 unsigned numrocs(0);
00085
00086 if (argc==1) { usage(); return 0; }
00087
00088 int testkind = 0;
00089
00090 bool dooutput = false;
00091 bool doreset = false;
00092 bool doresetabb = false;
00093 int dodlm = -1;
00094 bool passed = false;
00095 bool usedlm = false;
00096 bool usesleep = false;
00097 bool dolong = false;
00098 bool nostop = false;
00099 bool onlyfifo = false;
00100 bool doget(false), doput(false);
00101
00102 for (int n=1;n<argc;n++) {
00103 if (((strcmp(argv[n],"-rocid")==0) || (strcmp(argv[n],"-brdid")==0)) && (n<argc-1)) {
00104 ROCID[numrocs++] = convert_to_int(argv[++n]);
00105 } else
00106
00107 if ((strcmp(argv[n],"-retid")==0) && (n<argc-1)) {
00108 RETID = convert_to_int(argv[++n]);
00109 } else
00110
00111 if ((strcmp(argv[n],"-get")==0) && (n<argc-1)) {
00112 doget = true;
00113 oper_addr = convert_to_int(argv[++n]);
00114 } else
00115
00116 if ((strcmp(argv[n],"-put")==0) && (n<argc-2)) {
00117 doput = true;
00118 oper_addr = convert_to_int(argv[++n]);
00119 oper_arg = convert_to_int(argv[++n]);
00120 } else
00121
00122 if ((strcmp(argv[n],"-test")==0) && (n<argc-1)) {
00123 testkind = convert_to_int(argv[++n]);
00124 } else
00125
00126 if ((strcmp(argv[n],"-num")==0) && (n<argc-1)) {
00127 repeat_cnt = convert_to_int(argv[++n]);
00128 } else
00129
00130 if (strcmp(argv[n],"-all")==0) testkind = -1; else
00131
00132 if (strcmp(argv[n],"-sfp0")==0) ROCID[numrocs++] = 0; else
00133
00134 if (strcmp(argv[n],"-sfp1")==0) ROCID[numrocs++] = 0x20; else
00135
00136 if (strcmp(argv[n],"-both")==0) {
00137 ROCID[numrocs++] = 0x00;
00138 ROCID[numrocs++] = 0x20;
00139 } else
00140
00141 if (strcmp(argv[n],"-o")==0) dooutput = true; else
00142
00143 if (strcmp(argv[n],"-v")==0) dooutput = true; else
00144
00145 if (strcmp(argv[n],"-reset")==0) doreset = true; else
00146
00147 if (strcmp(argv[n],"-resetabb")==0) doresetabb = true; else
00148
00149 if (strcmp(argv[n],"-long")==0) dolong = true; else
00150
00151 if (strcmp(argv[n],"-dlm")==0) usedlm = true; else
00152
00153 if (strncmp(argv[n],"-dlm", 4)==0) dodlm = atoi(argv[n]+4); else
00154
00155 if (strcmp(argv[n],"-nostop")==0) nostop = true; else
00156
00157 if (strcmp(argv[n],"-sleep")==0) usesleep = true; else
00158
00159 if (strcmp(argv[n],"-fifo")==0) onlyfifo = true; else
00160
00161 if ((strcmp(argv[n],"-usage")==0) || (strcmp(argv[n],"-help")==0) || (strcmp(argv[n],"?")==0) || (strcmp(argv[n],"/?")==0)) usage();
00162
00163 }
00164
00165 abbdaemon::ABBdaemonClient daemon("mprace-0");
00166
00167 if (doresetabb) {
00168 #ifdef ABB_ETRA_FUNC
00169 printf("\nTrying to reset abb FFs problem!\n");
00170 daemon.setReg(0x1E, 0x0A);
00171 return 0;
00172 #else
00173 printf("\nERROR - standard daemon does not allow to access ABB registers!\n");
00174 return 1;
00175 #endif
00176 }
00177
00178 uint32_t fifo0 = daemon.getFIFOStatus();
00179 if (onlyfifo) {
00180 printf("FIFO: 0x%x Ctl: 0x%x\n", fifo0, daemon.getCTLStatus());
00181 return 0;
00182 }
00183
00184
00185 uint32_t value, res;
00186
00187 if (dodlm>=0) {
00188 printf("Do DLM%d only\n", dodlm);
00189 res = daemon.submitPutDLM(dodlm);
00190 return res==0 ? 0 : 1;
00191 }
00192
00193 if (numrocs==0) {
00194 printf("\nNo ROCs specified !!!\n");
00195 return 1;
00196 }
00197
00198 if (dooutput) {
00199 uint32_t _ver(0), _major(0), _author(0), _minor(0);
00200 daemon.getDesignID(&_ver, &_major, &_author, &_minor);
00201 printf("ABB version: %u.%u.%u.%u (version, major, author, minor)\n", _ver, _major, _author, _minor);
00202 }
00203
00204 printf("\nTest kind = %d RETID = 0x%03x", testkind, RETID);
00205 for (unsigned nr=0;nr<numrocs;nr++) printf(" BRDID[%u] = 0x%03x", nr, ROCID[nr]);
00206 printf("\n");
00207
00208 if (doget) {
00209 for (unsigned nr=0;nr<numrocs;nr++) {
00210 oper_arg = 0;
00211 res = daemon.submitGet(ROCID[nr], RETID, oper_addr, &oper_arg);
00212 printf("BRD:0x%03x GET addr:0x%06x value:0x%08x res:%u\n", (unsigned)ROCID[nr], (unsigned) oper_addr, (unsigned) oper_arg, (unsigned) res);
00213 }
00214 return res==0 ? 0 : 1;
00215 }
00216
00217 if (doput) {
00218 for (unsigned nr=0;nr<numrocs;nr++) {
00219 res = daemon.submitPut(ROCID[nr], RETID, oper_addr, oper_arg);
00220 printf("BRD:0x%03x PUT addr:0x%06x value:0x%08x res:%u\n", (unsigned)ROCID[nr], (unsigned) oper_addr, (unsigned) oper_arg, (unsigned) res);
00221 }
00222 return res==0 ? 0 : 1;
00223 }
00224
00225
00226 if (testkind!=8) daemon.submitReset();
00227
00228 printf("FIFO before:0x%x and after 0x%x reset, Ctl: 0x%x\n", fifo0, daemon.getFIFOStatus(), daemon.getCTLStatus());
00229
00230 if (doreset) {
00231 printf("Do board reset \n");
00232 for (unsigned nr=0;nr<numrocs;nr++)
00233 res = daemon.submitPut(ROCID[nr], RETID, 0x100, 1);
00234 return res==0 ? 0 : 1;
00235 }
00236
00237 if ((testkind==0) || (testkind<0)) {
00238 printf("\nTEST0: Simple communication test, read main ROC hardware version\n");
00239
00240 bool passed = true;
00241
00242 for (unsigned nr=0;nr<numrocs;nr++) {
00243 value = 0;
00244 res = daemon.submitGet(ROCID[nr], RETID, 0x4, &value);
00245 printf("TEST0: ROCID 0x%03x HWV = 0x%08x res = %u\n", ROCID[nr], value, res);
00246 if ((value < 0x02000000) || (res != 0)) passed = false;
00247 }
00248
00249 printf("TEST0: %s\n", (passed ? "PASS" : "FAIL"));
00250 if (testkind>=0) return passed ? 0 : 1;
00251 }
00252
00253 if ((testkind==1) || (testkind<0)) {
00254 printf("\nTEST1: Simple communication test, read several registers with NOper\n");
00255
00256 passed = true;
00257
00258 for (unsigned nr=0;nr<numrocs;nr++) {
00259
00260 uint32_t addrs[8], values[8], retvals[8];
00261 addrs[0] = 0x00; values[0] = 0; retvals[0] = 0;
00262 addrs[1] = 0x04; values[1] = 0; retvals[1] = 0;
00263 addrs[2] = 0x10; values[2] = 0; retvals[2] = 0;
00264
00265 res = daemon.submitNOper(ROCID[nr], RETID, 3, addrs, values, retvals);
00266
00267 printf("TEST1: ROCID 0x%03x Noper with 3 Gets res = %u\n", ROCID[nr], res);
00268
00269 if ((res != 0) || (values[0]==0) || (values[1]==0)) passed = false;
00270
00271 for (int n=0; n<3; n++) {
00272 if (dooutput) printf("TEST1: Get 0x%02x = 0x%08x, ret = %u\n", addrs[n], values[n], retvals[n]);
00273 if (retvals[n] != 0) passed = false;
00274 }
00275 }
00276
00277 printf("TEST1: %s\n", (passed ? "PASS" : "FAIL"));
00278 if (testkind>=0) return passed ? 0 : 1;
00279 }
00280
00281
00282 if ((testkind==2) || (testkind<0)) {
00283 printf("\nTEST2: Short NOper list with PUTs and GETs of ROC ID\n");
00284
00285 passed = true;
00286
00287 for (unsigned nr=0;nr<numrocs;nr++) {
00288
00289 uint32_t addrs[7], values[7], retvals[7];
00290 int n = 0;
00291 for (int loop=0;loop<3;loop++) {
00292 addrs[n] = 0x10 | 0x80000000; values[n] = loop; retvals[n] = 0; n++;
00293 addrs[n] = 0x10; values[n] = 0; retvals[n] = 0; n++;
00294 }
00295 addrs[n] = 0x10 | 0x80000000; values[n] = 0; retvals[n] = 0; n++;
00296
00297 res = daemon.submitNOper(ROCID[nr], RETID, n, addrs, values, retvals);
00298
00299 printf("TEST2: ROCID 0x%03x Noper with %d operations res = %u\n", ROCID[nr], n, res);
00300
00301 if (res!=0) passed = false;
00302 n = 0;
00303
00304 for (int loop=0;loop<3;loop++) {
00305 if (dooutput)
00306 printf("TEST2: Put 0x%02x = 0x%02x, ret = %u\n", addrs[n] & 0xFF, values[n], retvals[n]);
00307 if (retvals[n] != 0) passed = false;
00308 n++;
00309
00310 if (dooutput)
00311 printf("TEST2: Get 0x%02x = 0x%02x, ret = %u\n", addrs[n], values[n], retvals[n]);
00312 if ((retvals[n] != 0) || (values[n]!=(uint32_t)loop)) passed = false;
00313 n++;
00314 }
00315
00316 if (dooutput)
00317 printf("TEST2: Put 0x%02x = 0x%02x, ret = %u\n", addrs[n] & 0xFF, values[n], retvals[n]);
00318 if (retvals[n] != 0) passed = false;
00319 }
00320
00321 printf("TEST2: %s\n", (passed ? "PASS" : "FAIL"));
00322 if (testkind>=0) return passed ? 0 : 1;
00323 }
00324
00325 if ((testkind==3) || (testkind<0)) {
00326 printf("\nTEST3: Long NOper list with PUTs and GETs of ROC ID\n");
00327
00328 passed = true;
00329
00330 for (unsigned nr=0;nr<numrocs;nr++) {
00331
00332 uint32_t addrs[129], values[129], retvals[129];
00333 int n = 0;
00334 for (int loop=0;loop<64;loop++) {
00335 addrs[n] = 0x10 | 0x80000000; values[n] = loop; retvals[n] = 0; n++;
00336 addrs[n] = 0x10; values[n] = 0; retvals[n] = 0; n++;
00337 }
00338 addrs[n] = 0x10 | 0x80000000; values[n] = 0; retvals[n] = 0; n++;
00339
00340 res = daemon.submitNOper(ROCID[nr], RETID, n, addrs, values, retvals);
00341
00342 printf("TEST3: ROCID 0x%03x Noper with %d operations res = %u\n", ROCID[nr], n, res);
00343
00344 if (res!=0) passed = false;
00345 n = 0;
00346
00347 for (int loop=0;loop<64;loop++) {
00348 if (dooutput)
00349 printf("TEST3: Put 0x%02x = 0x%02x, ret = %u\n", addrs[n] & 0xFF, values[n], retvals[n]);
00350 if (retvals[n] != 0) passed = false;
00351 n++;
00352
00353 if (dooutput)
00354 printf("TEST3: Get 0x%02x = 0x%02x, ret = %u\n", addrs[n], values[n], retvals[n]);
00355 if ((retvals[n] != 0) || (values[n]!=(uint32_t)loop)) passed = false;
00356 n++;
00357 }
00358
00359 if (dooutput)
00360 printf("TEST3: Put 0x%02x = 0x%02x, ret = %u\n", addrs[n] & 0xFF, values[n], retvals[n]);
00361 if (retvals[n] != 0) passed = false;
00362 }
00363
00364 printf("TEST3: %s\n", (passed ? "PASS" : "FAIL"));
00365 if (testkind>=0) return passed ? 0 : 1;
00366 }
00367
00368
00369 if ((testkind==4) || (testkind<0)) {
00370 printf("\nTEST4: Simple DAQ application with GPIO set (need NXYTER firmware) %s\n", (usedlm ? "with DML" : ""));
00371
00372 passed = true;
00373
00374 for (unsigned nr=0;nr<numrocs;nr++) {
00375
00376 value = 0;
00377 res = daemon.submitGet(ROCID[nr], RETID, 0x0, &value);
00378 unsigned fetyp = (value >> 16);
00379 if ((res!=0) || ((fetyp != 1) && (fetyp != 4))) {
00380 printf("\nTEST4: Only nXYTER firmware can be used\n");
00381 passed = false;
00382 return 1;
00383 }
00384 }
00385
00386 daemon.submitReset();
00387
00388 void* bhandles[NUMBUFFERS];
00389 uint8_t* buffers[NUMBUFFERS];
00390 uint8_t* theBuffer = (uint8_t*) malloc(BUFFERSIZE*NUMBUFFERS);
00391 for (int n=0;n<NUMBUFFERS;n++) {
00392 buffers[n] = theBuffer+ n*BUFFERSIZE;
00393 if (buffers[n]==0) { printf("TEST4: Memory allocation failed - ABORT\n"); passed = false; return 1; }
00394 bhandles[n] = daemon.registerBuffer(BUFFERSIZE, buffers[n]);
00395 if (bhandles[n]==0) { printf("TEST4: Memory registering failed - ABORT\n"); passed = false; return 1; }
00396 }
00397
00398 for (unsigned nr=0;nr<numrocs;nr++) {
00399
00400 if (res!=0) { printf("TEST4: ROCID 0x%03x configure\n", ROCID[nr]); passed = false; }
00401
00402 res = daemon.submitPut(ROCID[nr], RETID, 0x200104, 0);
00403 if (res!=0) { printf("TEST4: Initial stop daq failed res = %u\n", res); passed = false; }
00404
00405 res = daemon.submitPut(ROCID[nr], RETID, 0x010000, 0x9900);
00406 if (res!=0) { printf("TEST4: Configure GPIO failed res = %u\n", res); passed = false; }
00407
00408 res = daemon.submitPut(ROCID[nr], RETID, 0x10, (0x5 << nr));
00409 if (res!=0) { printf("TEST4: Cannot configure ROC number %u = %u\n", (0x5 << nr), res); passed = false; }
00410
00411 res = daemon.submitPut(ROCID[nr], RETID, 0x01010C, 0);
00412 if (res!=0) { printf("TEST4: Configure scale down failed res = %u\n", res); passed = false; }
00413
00414 res = daemon.submitPut(ROCID[nr], RETID, 0x402500, 0);
00415 if (res!=0) { printf("TEST4: Cannot disable nxyters = %u\n", res); passed = false; }
00416
00417 res = daemon.submitPut(ROCID[nr], RETID, 0x400014, 1);
00418 if (res!=0) { printf("TEST4: Reset FIFO failed res = %u\n", res); passed = false; }
00419
00420 res = daemon.submitPut(ROCID[nr], RETID, 0x400014, 0);
00421 if (res!=0) { printf("TEST4: Reset FIFO failed res = %u\n", res); passed = false; }
00422 }
00423
00424 daemon.submitReset();
00425
00426 if (usedlm) {
00427 res = daemon.submitPutDLM(8);
00428 if (res!=0) { printf("TEST4: DLM 8 failed res = %u\n", res); passed = false; }
00429 if (usesleep) sleep(1);
00430 } else {
00431 for (unsigned nr=0;nr<numrocs;nr++) {
00432 res = daemon.submitPut(ROCID[nr], RETID, 0x200100, 0);
00433 if (res!=0) { printf("TEST4: Start daq failed res = %u\n", res); passed = false; }
00434 }
00435 }
00436
00437 int maxloop = dolong ? 1000 : 20;
00438
00439 printf("TEST4: starting DAQ\n");
00440
00441 int msgkind[MAXNUMROCS];
00442 unsigned lastevnum0[MAXNUMROCS], lastevnum1[MAXNUMROCS], lastepoch[MAXNUMROCS];
00443 bool find_start[MAXNUMROCS], find_reset[MAXNUMROCS], find_stop[MAXNUMROCS];
00444
00445 unsigned evnum(0);
00446
00447 for (unsigned nr=0;nr<numrocs;nr++) {
00448 msgkind[nr] = 0x2;
00449 lastevnum0[nr] = 0;
00450 lastevnum1[nr] = 0;
00451 lastepoch[nr] = 0;
00452 find_start[nr] = false;
00453 find_reset[nr] = false;
00454 find_stop[nr] = false;
00455 }
00456
00457 char suffix[128];
00458
00459 unsigned format_error(0);
00460
00461 for (int loop = 0; loop<maxloop; loop++) {
00462 int waitcnt = 50000;
00463
00464 int bufid = loop % NUMBUFFERS;
00465
00466 unsigned read_size = BUFFERSIZE / 4;
00467
00468 while (daemon.getFIFOStatus() / 4 < read_size) {
00469 if (--waitcnt == 0) {
00470 read_size = daemon.getFIFOStatus() / 4;
00471 break;
00472 }
00473 }
00474
00475 if (read_size==0) {
00476 if (loop==0) {
00477 printf("TEST4: No data to read, stop DAQ\n");
00478 passed = false;
00479 }
00480 break;
00481 }
00482
00483 daemon.readDMAserialized(0x0, bhandles[bufid], read_size, 0, false, true, 0.);
00484
00485
00486 if (!nostop) {
00487 if ((loop == (maxloop - 18))) {
00488 if (usedlm) {
00489 res = daemon.submitPutDLM(9);
00490 if (res!=0) { printf("TEST4: Suspend daq DLM 9 failed res = %u\n", res); passed = false; }
00491 } else
00492 for (unsigned nr=0;nr<numrocs;nr++) {
00493 res = daemon.submitPut(ROCID[nr], RETID, 0x200104, 0);
00494 if (res!=0) { printf("TEST4: Stop daq failed res = %u\n", res); passed = false; }
00495 }
00496 }
00497 }
00498
00499 if (!dolong || ((loop % 100) == 0))
00500 printf("TEST4: DMA operation %d read_size %d fifo %u\n", loop, read_size*4, daemon.getFIFOStatus());
00501
00502 uint8_t* buffer = buffers[bufid];
00503
00504 int pos(0), len(read_size*4);
00505
00506
00507 while (pos<len) {
00508 unsigned rocid = buffer[pos] + buffer[pos+1]*256;
00509 unsigned nr=0;
00510 while ((rocid!=5) && (rocid!=0)) { nr++; rocid = rocid >> 1; }
00511 if (rocid!=5) {
00512 format_error |= 0x1;
00513 if (dooutput) printMessage("TEST4", buffer+pos, " <- wrong ROCID!");
00514 pos+=8;
00515 continue;
00516 }
00517
00518 if ((buffer[pos+2]==0x7) && (buffer[pos+3]==0x1) && (buffer[pos+4]==0) &&
00519 (buffer[pos+5]==0) && (buffer[pos+6]==0) && (buffer[pos+7]==0)) {
00520 if (dooutput) printMessage("TEST4", buffer+pos, " <- start DAQ!");
00521 find_start[nr] = true;
00522 pos+=8;
00523 continue;
00524 }
00525
00526 if ((buffer[pos+2]==0x7) && (buffer[pos+3]==0x6) && (buffer[pos+4]==0) &&
00527 (buffer[pos+5]==0) && (buffer[pos+6]==0) && (buffer[pos+7]==0)) {
00528 find_reset[nr] = true;
00529 if (dooutput) printMessage("TEST4", buffer+pos, " <- reset FIFO!");
00530 pos+=8;
00531 continue;
00532 }
00533
00534 if ((buffer[pos+2]!=0x7) && (buffer[pos+2] != msgkind[nr])) format_error |= 0x2;
00535 strcpy(suffix, "");
00536
00537 switch (buffer[pos+2]) {
00538 case 0x02:
00539 evnum = ((*((uint64_t*) (buffer+pos))) >> 24) & 0xffffffff;
00540 if ((lastepoch[nr]!=0) && ((evnum - lastepoch[nr]) != 1)) {
00541 format_error |= 0x20;
00542 sprintf(suffix, " <- EPOCH 0x%08X error prev:0x%08X", evnum, lastepoch[nr]);
00543 lastepoch[nr]++;
00544 } else {
00545 sprintf(suffix, " <- EPOCH 0x%08X", evnum);
00546 lastepoch[nr] = evnum;
00547 }
00548 msgkind[nr] = 0x03;
00549 break;
00550 case 0x03:
00551 evnum = (*((uint32_t*) (buffer+pos+4)) >> 6) & 0xffffff;
00552 if ((lastevnum0[nr]!=0) && (((evnum - lastevnum0[nr]) & 0xffffff) != 1)) {
00553 format_error |= 0x8;
00554 sprintf(suffix, " <- SYNC0 0x%06X error prev:0x%06X", evnum, lastevnum0[nr]);
00555 lastevnum0[nr]++;
00556 } else {
00557 sprintf(suffix, " <- SYNC0 0x%06X", evnum);
00558 lastevnum0[nr] = evnum;
00559 }
00560 msgkind[nr] = 0x43;
00561 break;
00562 case 0x43:
00563 evnum = (*((uint32_t*) (buffer+pos+4)) >> 6) & 0xffffff;
00564 if ((lastevnum1[nr]!=0) && (((evnum - lastevnum1[nr]) & 0xffffff) != 1)) {
00565 format_error |= 0x10;
00566 sprintf(suffix, " <- SYNC1 0x%06X error prev:0x%06X", evnum, lastevnum1[nr]);
00567 lastevnum1[nr]++;
00568 } else {
00569 sprintf(suffix, " <- SYNC1 0x%06X", evnum);
00570 lastevnum1[nr] = evnum;
00571 }
00572 msgkind[nr] = 0x02;
00573 break;
00574 case 0x07:
00575 if ((buffer[pos+3]==0x2) && (buffer[pos+4]==0) && (buffer[pos+5]==0) && (buffer[pos+6]==0) && (buffer[pos+7]==0)) {
00576 loop = maxloop-1;
00577 find_stop[nr] = true;
00578 msgkind[nr] = 0x0;
00579 if ((pos != len-8) && (numrocs==1)) {
00580 format_error |= 0x40;
00581 strcpy(suffix, " <- stopdaq not at the end");
00582 } else
00583 strcpy(suffix, " <- stop DAQ!");
00584 } else {
00585 format_error |= 0x2;
00586 strcpy(suffix, " <- unexpected");
00587 }
00588
00589 break;
00590
00591 default:
00592 format_error |= 0x4;
00593 strcpy(suffix, " <- unexpected");
00594 break;
00595
00596 }
00597
00598 if (dooutput) printMessage("TEST4", buffer+pos, suffix);
00599
00600 pos+=8;
00601 }
00602 }
00603
00604
00605 for (unsigned nr=0;nr<numrocs;nr++) {
00606 printf("TEST4: Results for ROCID 0x%03x\n", ROCID[nr]);
00607
00608 if (!find_start[nr]) {
00609 printf("TEST4: Start DAQ message not found\n"); passed = false;
00610 } else
00611 printf("TEST4: Start DAQ message found in the beginning\n");
00612
00613 if (find_reset[nr]) {
00614 printf("TEST4: Reset FIFO message found\n");
00615 } else {
00616 printf("TEST4: Reset FIFO message not found\n"); passed = false;
00617 }
00618
00619 if (!nostop) {
00620 if (!find_stop[nr]) {
00621 printf("TEST4: Stop DAQ message not found\n");
00622 passed = false;
00623 } else {
00624 printf("TEST4: Stop DAQ message found\n");
00625 }
00626 }
00627 }
00628
00629 if (format_error!=0) {
00630 if (format_error & 0x1) printf("TEST4: ROC ID coded incorrectly into the messages\n");
00631 if (format_error & 0x2) printf("TEST4: Messages sequence are wrong\n");
00632 if (format_error & 0x4) printf("TEST4: Messages type are wrong\n");
00633 if (format_error & 0x8) printf("TEST4: SYNC0 sequence is wrong\n");
00634 if (format_error & 0x10) printf("TEST4: SYNC1 sequence is wrong\n");
00635 if (format_error & 0x20) printf("TEST4: EPOCH sequence is wrong\n");
00636 if (format_error & 0x40) printf("TEST4: Stop DAQ message not in the end\n");
00637 passed = false;
00638 }
00639
00640 if (!nostop) {
00641 if (usedlm) {
00642 res = daemon.submitPutDLM(9);
00643 if (res!=0) { printf("TEST4: Stop daq DLM 9 failed res = %u\n", res); passed = false; }
00644 if (usesleep) sleep(1);
00645 } else
00646 for (unsigned nr=0;nr<numrocs;nr++) {
00647 res = daemon.submitPut(ROCID[nr], RETID, 0x200104, 0);
00648 if (res!=0) { printf("TEST4: Stop daq failed res = %u\n", res); passed = false; }
00649 }
00650 }
00651
00652 if (!nostop)
00653 for (unsigned nr=0;nr<numrocs;nr++) {
00654 res = daemon.submitPut(ROCID[nr], RETID, 0x010000, 0x0);
00655 if (res!=0) { printf("TEST4: Reset GPIO failed res = %u\n", res); passed = false; }
00656 }
00657
00658 for (int n=0;n<NUMBUFFERS;n++) {
00659 daemon.unregisterBuffer(bhandles[n]);
00660
00661 }
00662 free(theBuffer);
00663 printf("TEST4: %s\n", (passed ? "PASS" : "FAIL"));
00664 if (testkind>=0) return passed ? 0 : 1;
00665 }
00666
00667
00668 if ((testkind==5) || (testkind<0)) {
00669 printf("\nTEST5: Check access to wrong address with short NOper\n");
00670
00671 passed = true;
00672
00673 for (unsigned nr=0;nr<numrocs;nr++) {
00674
00675 uint32_t addrs[7], values[7], retvals[7];
00676 for (int n=0;n<7;n++) {
00677 addrs[n] = 0x04; values[n] = 0; retvals[n] = 0;
00678 }
00679
00680 addrs[5] = 0x05;
00681
00682 res = daemon.submitNOper(ROCID[nr], RETID, 7, addrs, values, retvals);
00683
00684 printf("TEST5: ROCID 0x%03x Noper with 15 Gets res = %u\n", ROCID[nr], res);
00685
00686 if (res==0) {
00687 printf("TEST5: res==0 when Noper failed to complete\n");
00688 passed = false;
00689 }
00690
00691 for (int n=0; n<7; n++) {
00692 if (dooutput) printf("TEST5: Get 0x%02x = 0x%08x, ret = %8x\n", addrs[n], values[n], retvals[n]);
00693 if ((n<5) && (retvals[n] != 0)) passed = false;
00694 if ((n==5) && (retvals[n] == 0)) passed = false;
00695 }
00696 }
00697
00698 printf("TEST5: %s\n", (passed ? "PASS" : "FAIL"));
00699 if (testkind>=0) return passed ? 0 : 1;
00700 }
00701
00702
00703 if ((testkind==6) || (testkind<0)) {
00704 printf("\nTEST6: Check access to wrong address with long NOper\n");
00705
00706 passed = true;
00707
00708 for (unsigned nr=0;nr<numrocs;nr++) {
00709
00710 uint32_t addrs[15], values[15], retvals[15];
00711 for (int n=0;n<15;n++) {
00712 addrs[n] = 0x04; values[n] = 0; retvals[n] = 0;
00713 }
00714
00715 addrs[13] = 0x05;
00716
00717 res = daemon.submitNOper(ROCID[nr], RETID, 15, addrs, values, retvals);
00718
00719 printf("TEST6: Noper ROCID 0x%03x with 15 Gets res = %u\n", ROCID[nr], res);
00720
00721 if (res==0) {
00722 printf("TEST6: res==0 when Noper failed to complete\n");
00723 passed = false;
00724 }
00725
00726
00727 for (int n=0; n<15; n++) {
00728 if (dooutput) printf("TEST6: Get 0x%02x = 0x%08x, ret = %8x\n", addrs[n], values[n], retvals[n]);
00729 if ((n<13) && (retvals[n] != 0)) passed = false;
00730 if ((n==13) && (retvals[n] == 0)) passed = false;
00731 }
00732 }
00733
00734 printf("TEST6: %s\n", (passed ? "PASS" : "FAIL"));
00735 if (testkind>=0) return passed ? 0 : 1;
00736 }
00737
00738
00739 if ((testkind==7) || (testkind<0)) {
00740 printf("\nTEST7: Simple DAQ application with optics-datagen %s\n", (usedlm ? "with DML" : ""));
00741
00742 passed = true;
00743
00744 int frontend[MAXNUMROCS], backend[MAXNUMROCS];
00745
00746 for (unsigned nr=0;nr<numrocs;nr++) {
00747 value = 0;
00748 res = daemon.submitGet(ROCID[nr], RETID, 0x0, &value);
00749
00750 frontend[nr] = (value >> 16) & 0xFFFF;
00751 backend[nr] = value & 0xFFFF;
00752
00753 if ((res!=0) || (backend[nr] != 1)) {
00754 printf("\nTEST7: Only Optics firmware can be used\n");
00755 passed = false;
00756 return 1;
00757 }
00758 }
00759
00760 void* bhandles[NUMBUFFERS];
00761 uint8_t* buffers[NUMBUFFERS];
00762
00763 for (int n=0;n<NUMBUFFERS;n++) {
00764 buffers[n] = new uint8_t[BUFFERSIZE];
00765 if (buffers[n]==0) { printf("TEST7: Memory allocation failed - ABORT\n"); passed = false; return 1; }
00766 bhandles[n] = daemon.registerBuffer(BUFFERSIZE, buffers[n]);
00767 if (bhandles[n]==0) { printf("TEST7: Memory registering failed - ABORT\n"); passed = false; return 1; }
00768 }
00769
00770
00771 for (unsigned nr=0;nr<numrocs;nr++) {
00772 res = daemon.submitPut(ROCID[nr], RETID, 0x200300, 0);
00773 if (res!=0) { printf("TEST7: Datagen failed res = %u\n", res); passed = false; }
00774
00775 res = daemon.submitPut(ROCID[nr], RETID, 0x200104, 0);
00776 if (res!=0) { printf("TEST7: Initial stop daq failed res = %u\n", res); passed = false; }
00777 }
00778
00779 daemon.submitReset();
00780
00781
00782 for (unsigned nr=0;nr<numrocs;nr++) {
00783
00784 res = daemon.submitPut(ROCID[nr], RETID, 0x10, 0x5);
00785 if (res!=0) { printf("TEST7: Cannot configure ROC number 5 = %u\n", res); passed = false; }
00786
00787 res = daemon.submitPut(ROCID[nr], RETID, 0x200300, 1);
00788 if (res!=0) { printf("TEST7: Datagen failed res = %u\n", res); passed = false; }
00789
00790 if ((frontend[nr]==1) || (frontend[nr]==4)) {
00791 res = daemon.submitPut(ROCID[nr], RETID, 0x400014, 1);
00792 if (res!=0) { printf("TEST7: Reset FIFO failed res = %u\n", res); passed = false; }
00793 res = daemon.submitPut(ROCID[nr], RETID, 0x400014, 0);
00794 if (res!=0) { printf("TEST7: Reset FIFO failed res = %u\n", res); passed = false; }
00795 } else
00796 if (frontend[nr]==2){
00797 res = daemon.submitPut(ROCID[nr], RETID, 0x500014, 1);
00798 if (res!=0) { printf("TEST7: Reset FIFO failed res = %u\n", res); passed = false; }
00799 res = daemon.submitPut(ROCID[nr], RETID, 0x500014, 0);
00800 if (res!=0) { printf("TEST7: Reset FIFO failed res = %u\n", res); passed = false; }
00801 }
00802 }
00803
00804 daemon.submitReset();
00805
00806 if (usedlm)
00807 { res = daemon.submitPutDLM(8); if (usesleep) sleep(1); }
00808 else
00809 for (unsigned nr=0;nr<numrocs;nr++)
00810 res = daemon.submitPut(ROCID[nr], RETID, 0x200100, 0);
00811 if (res!=0) { printf("TEST7: Start daq failed res = %u\n", res); passed = false; }
00812
00813
00814
00815 int maxloop = 100;
00816
00817 printf("TEST7: starting DAQ\n");
00818
00819 int msgkind = 0x2;
00820
00821 bool find_start(false), find_stop(false);
00822 unsigned format_error(0);
00823
00824 for (int loop = 0; loop<maxloop; loop++) {
00825 int waitcnt = 10000;
00826
00827 int bufid = loop % NUMBUFFERS;
00828
00829 unsigned read_size = BUFFERSIZE / 4;
00830
00831 while (daemon.getFIFOStatus() / 4 < read_size) {
00832 if (--waitcnt == 0) {
00833 read_size = daemon.getFIFOStatus() / 4;
00834 break;
00835 }
00836 }
00837
00838 if (read_size==0) {
00839 if (loop==0) {
00840 printf("TEST7: No data to read, stop DAQ\n");
00841 passed = false;
00842 }
00843 break;
00844 }
00845
00846 daemon.readDMAserialized(0x0, bhandles[bufid], read_size, 0, false, true, 0.);
00847
00848
00849 if ((loop == 10) && !nostop) {
00850 if (!usedlm) {
00851 for (unsigned nr=0;nr<numrocs;nr++)
00852 res = daemon.submitPut(ROCID[nr], RETID, 0x200104, 0);
00853 } else {
00854 res = daemon.submitPutDLM(9); if (usesleep) sleep(1);
00855 }
00856 if (res!=0) { printf("TEST7: Stop daq failed res = %u\n", res); passed = false; }
00857 }
00858
00859 printf("TEST7: DMA operation %d read_size %d fifo %u\n", loop, read_size*4, daemon.getFIFOStatus());
00860
00861 int pos(0), len(read_size*4);
00862
00863 uint8_t* buffer = buffers[bufid];
00864
00865 if (loop==0) {
00866 if ((buffer[pos+2]==0x7) && (buffer[pos+3]==0x1) && (buffer[pos+4]==0) &&
00867 (buffer[pos+5]==0) && (buffer[pos+6]==0) && (buffer[pos+7]==0)) {
00868 printf("TEST7: Start DAQ message found in the beginning\n");
00869 find_start = true;
00870 pos+=8;
00871 }
00872
00873 if ((buffer[pos+2]==0x7) && (buffer[pos+3]==0x6) && (buffer[pos+4]==0) &&
00874 (buffer[pos+5]==0) && (buffer[pos+6]==0) && (buffer[pos+7]==0)) {
00875 printf("TEST7: Reset FIFO message found\n");
00876 pos+=8;
00877 }
00878 }
00879
00880
00881 if (dooutput)
00882 for (unsigned n=0;n<read_size*4;n+=8)
00883 printf("TEST7: Msg: %02x%02x-%02x%02x-%02x%02x-%02x%02x\n",
00884 buffer[n+0], buffer[n+1], buffer[n+2], buffer[n+3],
00885 buffer[n+4], buffer[n+5], buffer[n+6], buffer[n+7]);
00886
00887
00888 if ((buffer[len-6]==0x7) && (buffer[len-5]==0x2) && (buffer[len-4]==0) &&
00889 (buffer[len-3]==0) && (buffer[len-2]==0) && (buffer[len-1]==0)) {
00890 printf("TEST7: Stop DAQ message found at the end\n");
00891 loop = maxloop-1;
00892 len -= 8;
00893 find_stop = true;
00894 break;
00895
00896 }
00897
00898
00899
00900 msgkind=(buffer[pos+6]<<8)+buffer[pos+7];
00901 while (pos<len) {
00902 if ((buffer[pos]!=5) || (buffer[pos+1]!=0)) format_error |= 0x1;
00903 if ( (buffer[pos+6]<<8)+buffer[pos+7] != ((msgkind )&0xFFFF)) {
00904 format_error |= 0x2;
00905
00906 }
00907 if ( (buffer[pos+4]<<8)+buffer[pos+5] != ((msgkind+1)&0xFFFF)) {
00908 format_error |= 0x2;
00909
00910 }
00911 if ( (buffer[pos+2]<<8)+buffer[pos+3] != ((msgkind+2)&0xFFFF)) {
00912 format_error |= 0x2;
00913
00914 }
00915 msgkind=(msgkind+3)&0xFFFF;
00916 pos+=8;
00917 }
00918 }
00919
00920 if (!find_start) {
00921 printf("TEST7: Start DAQ message not found\n"); passed = false;
00922 }
00923
00924 if (!find_stop && !nostop) {
00925 printf("TEST7: Stop DAQ message not found\n"); passed = false;
00926 }
00927
00928 if (format_error!=0) {
00929 if (format_error & 0x1) printf("TEST7: ROC ID coded incorrectly into the messages\n");
00930 if (format_error & 0x2) printf("TEST7: Messages sequence are wrong\n");
00931 if (format_error & 0x4) printf("TEST7: Messages type are wrong\n");
00932 passed = false;
00933 }
00934
00935
00936 if (!nostop) {
00937 if (usedlm) {
00938 res = daemon.submitPutDLM(9); if (usesleep) sleep(1);
00939 } else {
00940 for (unsigned nr=0;nr<numrocs;nr++)
00941 res = daemon.submitPut(ROCID[nr], RETID, 0x200104, 0);
00942 }
00943 if (res!=0) { printf("TEST7: Stop daq failed res = %u\n", res); passed = false; }
00944 }
00945
00946 if (!nostop) {
00947 for (unsigned nr=0;nr<numrocs;nr++)
00948 res = daemon.submitPut(ROCID[nr], RETID, 0x200300, 0);
00949 if (res!=0) { printf("TEST7: Disable Datagen failed res = %u\n", res); passed = false; }
00950 }
00951
00952 for (int n=0;n<NUMBUFFERS;n++) {
00953 daemon.unregisterBuffer(bhandles[n]);
00954 delete [] buffers[n];
00955 }
00956
00957 printf("TEST7: %s\n", (passed ? "PASS" : "FAIL"));
00958 if (testkind>=0) return passed ? 0 : 1;
00959 }
00960
00961
00962 if (testkind==8) {
00963 printf("\nTEST8: read data from FIFO on maximum speed\n");
00964
00965 void* bhandle;
00966 uint8_t* buffer;
00967
00968 buffer = new uint8_t[BUFFERSIZE];
00969 bhandle = daemon.registerBuffer(BUFFERSIZE, buffer);
00970 if (bhandle==0) { printf("TEST8: Memory registering failed - ABORT\n"); passed = false; return 1; }
00971
00972 int maxloop = 10000;
00973 unsigned long total = 0;
00974
00975 printf("TEST8: start reading fifo = 0x%x\n", daemon.getFIFOStatus());
00976
00977 clock_t t1 = clock();
00978
00979 for (int loop = 0; loop<maxloop; loop++) {
00980 unsigned read_size = BUFFERSIZE / 4;
00981 uint32_t fifo_size = daemon.getFIFOStatus() / 4;
00982 if (fifo_size < read_size) read_size = fifo_size;
00983 if (read_size==0) break;
00984 daemon.readDMAserialized(0x0, bhandle, read_size, 0, false, true, 0.);
00985 total += read_size;
00986 }
00987
00988 clock_t t2 = clock();
00989
00990 double tm = (t2-t1)*1./CLOCKS_PER_SEC;
00991
00992 double sz_mb = total/1024./256.;
00993
00994 daemon.unregisterBuffer(bhandle);
00995 delete [] buffer;
00996
00997 printf("TEST8: stop reading fifo = 0x%x total read = %3.1f MB\n", daemon.getFIFOStatus(), sz_mb);
00998 printf("TEST8: time = %3.1f s rate = %3.1f MB/s clocks_pre_sec %ld\n", tm, (tm>0. ? sz_mb/tm : 0.), CLOCKS_PER_SEC);
00999
01000 if (testkind>=0) return passed ? 0 : 1;
01001 }
01002
01003
01004 if (testkind==9) {
01005 printf("\nTEST9: Test DLMs\n");
01006
01007 passed = true;
01008
01009 int frontend, backend;
01010
01011 value = 0;
01012 res = daemon.submitGet(ROCID[0], RETID, 0x0, &value);
01013
01014 frontend = (value >> 16) & 0xFFFF;
01015 backend = value & 0xFFFF;
01016
01017 if ((res!=0) || (backend != 1)) {
01018 printf("\nTEST9: Only Optics firmware can be used\n");
01019 passed = false;
01020 return 1;
01021 }
01022
01023 res = daemon.submitGet(ROCID[0], RETID, 0x200000, &value);
01024 if ((res!=0) || value < 0x2000104 ) {
01025 printf("\nTEST9: Only Optics firmware version 2.0.1.4 or higher can be used\n");
01026 passed = false;
01027 return 1;
01028 }
01029
01030 int maxloop = 10000;
01031 unsigned int dlm_rec, last_dlm_rec, dlm_send;
01032
01033 printf("TEST9: start testing ...\n");
01034
01035 res = daemon.submitPutDLM(0); if (usesleep) sleep(1);
01036 res = daemon.submitPutDLM(0); if (usesleep) sleep(1);
01037 res = daemon.submitPutDLM(0); if (usesleep) sleep(1);
01038
01039 for (int loop = 1; loop<maxloop; loop++) {
01040 dlm_send = loop & 0xF;
01041
01042 res = daemon.submitPutDLM(dlm_send); if (usesleep) sleep(1);
01043
01044 res = daemon.submitGet(ROCID[0], RETID, 0x201004, &value);
01045 last_dlm_rec = (value >> 4) & 0xF;
01046 dlm_rec = value & 0xF;
01047
01048 if (dlm_send != dlm_rec) {
01049 printf("TEST9: Wrong DLM received in loop %d. Received: 0x%x , Send: 0x%x\n", loop, dlm_rec, dlm_send);
01050 passed = false;
01051 break;
01052 }
01053 if ( ((dlm_rec-last_dlm_rec)&0xF) != 1 ) {
01054 printf("TEST9: Wrong history in loop %d. Most recent DLM: 0x%x , Second most recent DLM: 0x%x\n", loop, dlm_rec, last_dlm_rec);
01055 passed = false;
01056 break;
01057 }
01058 }
01059
01060
01061 printf("TEST9: DLM history: 0x%08x\n", value);
01062 printf("TEST9: %s\n", (passed ? "PASS" : "FAIL"));
01063 if (testkind>=0) return passed ? 0 : 1;
01064 }
01065
01066 if ((testkind==10) || (testkind<0)) {
01067 printf("\nTEST10: Check ROC firmware versions\n");
01068
01069 bool passed = true;
01070
01071 for (unsigned nr=0;nr<numrocs;nr++) {
01072 value = 0;
01073 res = daemon.submitGet(ROCID[nr], RETID, 0x4, &value);
01074 printf("TEST10: ROCID 0x%03x HWV = %u.%u.%u.%u 0x%08x res = %u\n", ROCID[nr], value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff, value, res);
01075 if ((value < 0x02000000) || (res != 0)) passed = false;
01076 value = 0;
01077 res = daemon.submitGet(ROCID[nr], RETID, 0x200000, &value);
01078 printf("TEST10: ROCID 0x%03x OPTIC = %u.%u.%u.%u 0x%08x res = %u\n", ROCID[nr], value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff, value, res);
01079 if ((value < 0x02000000) || (res != 0)) passed = false;
01080 value = 0;
01081 res = daemon.submitGet(ROCID[nr], RETID, 0x400000, &value);
01082 if (res==0)
01083 printf("TEST10: ROCID 0x%03x nXYTER = %u.%u.%u.%u 0x%08x res = %u\n", ROCID[nr], value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff, value, res);
01084 value = 0;
01085 res = daemon.submitGet(ROCID[nr], RETID, 0x500000, &value);
01086 if (res==0)
01087 printf("TEST10: ROCID 0x%03x FEET = %u.%u.%u.%u 0x%08x res = %u\n", ROCID[nr], value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff, value, res);
01088 }
01089
01090 printf("TEST10: %s\n", (passed ? "PASS" : "FAIL"));
01091 if (testkind>=0) return passed ? 0 : 1;
01092 }
01093
01094 if (testkind==11) {
01095
01096 printf("TEST11: simple DAQ test for SP605/SPADIC\n");
01097
01098
01099
01100
01101
01102
01103 for (unsigned nr=0;nr<numrocs;nr++) {
01104 res = daemon.submitPut(ROCID[nr], RETID, 0x010000, 0x900);
01105 res = daemon.submitPut(ROCID[nr], RETID, 0x01010C, 1);
01106 res = daemon.submitPut(ROCID[nr], RETID, 0x200100, 1);
01107
01108
01109 }
01110
01111
01112 printf("TEST11: issue DLM8\n");
01113 res = daemon.submitPutDLM(8);
01114
01115 void* bhandle;
01116 uint8_t* buffer;
01117
01118 buffer = new uint8_t[BUFFERSIZE];
01119 bhandle = daemon.registerBuffer(BUFFERSIZE, buffer);
01120 if (bhandle==0) { printf("TEST11: Memory registering failed - ABORT\n"); passed = false; return 1; }
01121
01122 int maxloop = repeat_cnt > 0 ? repeat_cnt : 1000;
01123 unsigned long total = 0;
01124
01125 printf("TEST11: start reading fifo = 0x%x maxloop = %d\n", daemon.getFIFOStatus(), maxloop);
01126
01127 clock_t t1 = clock();
01128
01129 int outcnt(0);
01130
01131 for (int loop = 0; loop<maxloop; loop++) {
01132
01133 res = daemon.submitPutDLM(11);
01134
01135
01136
01137
01138
01139 unsigned read_size = BUFFERSIZE / 4;
01140 uint32_t fifo_size = daemon.getFIFOStatus() / 4;
01141 if (fifo_size < read_size) read_size = fifo_size;
01142
01143
01144 read_size = (read_size / 2) * 2;
01145 if (read_size==0) {
01146 usleep(10000);
01147 continue;
01148 }
01149 daemon.readDMAserialized(0x0, bhandle, read_size, 0, false, true, 0.);
01150 total += read_size;
01151
01152 if (dooutput) {
01153 uint64_t* p = (uint64_t*) buffer;
01154 for (unsigned n=0;n<read_size/2;n++) {
01155 printf(" %16lx", (long unsigned) p[n]);
01156 if (n % 4 == 3) printf("\n");
01157 }
01158 if (read_size % 8 != 0) printf("\n");
01159
01160 sp605::Iterator iter;
01161 iter.assign(buffer, read_size*4);
01162
01163 while (iter.next())
01164 iter.printMessage();
01165
01166 }
01167
01168
01169
01170
01171
01172
01173
01174
01175
01176
01177
01178
01179
01180
01181
01182
01183
01184
01185
01186
01187 }
01188
01189 if (outcnt % 16 != 0) printf("\n");
01190
01191 clock_t t2 = clock();
01192
01193 double tm = (t2-t1)*1./CLOCKS_PER_SEC;
01194
01195 double sz_mb = total/1024./256.;
01196
01197 daemon.unregisterBuffer(bhandle);
01198 delete [] buffer;
01199
01200 printf("TEST11: issue DLM9\n");
01201 res = daemon.submitPutDLM(9);
01202
01203 for (unsigned nr=0;nr<numrocs;nr++) {
01204 res = daemon.submitPut(ROCID[nr], RETID, 0x200104, 1);
01205 }
01206
01207
01208 printf("TEST11: stop reading fifo = 0x%x total read = %3.1f MB\n", daemon.getFIFOStatus(), sz_mb);
01209 printf("TEST11: time = %3.1f s rate = %3.1f MB/s\n", tm, (tm>0. ? sz_mb/tm : 0.));
01210
01211 return 0;
01212 }
01213
01214
01215
01216 return 0;
01217 }