/****************************************************************/ /* */ /* file: fecscope.c */ /* */ /* This program allows to access the resources of the FEC card */ /* in a user friendly way and includes some test routines */ /* */ /* Author: Luciano Musa, CERN-PH */ /* */ /* 22. May. 08 LM created */ /* 27. May. 08 last modified */ /* */ /****************************************************************/ #include #include #include #include #include #include #include #include "get_input.h" #include "rcc_time_stamp.h" #include "fec2rorc_lib.h" #include "rcu.h" #include "fec.h" #define MAX_MEM 6144 /*************/ /* Globals */ /*************/ extern u_int packageId; extern u_int traceLevel; int rcu_id; rorc_node_t rorc_node; chan_key *rorc; u_int reg_add[17] ={ A_K1, A_K2, A_K3,A_L1,A_L2,A_L3,A_VFPED,A_PMDTA,A_ADEVL, \ A_ZSTHR,A_BCTHR,A_TRCFG,A_DPCFG,A_BFNPT,A_PMADD,A_ERSTR,A_TRCNT}; u_int reg_rmask[17]={ M_K1,M_K2,M_K3,M_L1,M_L2,M_L3,M_VFPED,M_PMDTA,M_ADEVL, \ M_ZSTHR,M_BCTHR,M_TRCFG,M_DPCFG,M_BFNPT,M_PMADD,M_ERSTR,M_TRCNT}; /*************/ /* Prototypes*/ /*************/ int mainhelp(void); int fecfuncmenu(void); int setdebug(void); /****************/ int setdebug(void) /****************/ { printf("\nPackage identifier:\n"); printf("FEC library: %d\n", P_ID_FEC); printf("\n"); printf("Enter the debug package: "); packageId = getdecd(packageId); printf("Enter the debug level: "); traceLevel = getdecd(traceLevel); /* RCU_SetDebug(packageId, traceLevel); */ return(0); } /****************/ int mainhelp(void) /****************/ { printf("Call Luciano Musa, 76261, 163119 if you need help\n"); return(0); } /******************************/ int main(int argc, char *argv[]) /******************************/ { static int ret, fun = 1; ret = ts_open(1, TS_DUMMY); if (ret) rcc_error_print(stdout, ret); printf("\n\n\nThis is FECSCOPE\n"); while(fun != 0) { printf("\n"); printf("Select an option:\n"); printf(" 1 Print help\n"); printf(" 2 FEC menu\n"); printf(" 3 Set debugging parameters\n"); printf(" 0 Quit\n"); printf("Your choice "); fun = getdecd(fun); if (fun == 1) mainhelp(); if (fun == 2) fecfuncmenu(); if (fun == 3) setdebug(); } ts_close(TS_DUMMY); exit(0); } /*******************/ int fecfuncmenu(void) /*******************/ { static u_int fun, choice, ncycles=1, tofile=0, dsource=0, fsize=0, sib_nempty; int ret = 0; static u_int mem_add=0, offset=0, max_nr_words, rcode=0, rdata=0,data_mask; static u_int ccode=0; static u_int fdata[MAX_MEM]={0}; static char fname[200] = {0}; u_long rsize=10, osize, word=0x55555555; u_long memdata[MAX_MEM]={0}, memout[MAX_MEM]={0}; u_int loop, index, cycle, tcount, ii; tstamp ts1, ts2; float delta_t; FILE *file; int i; /* new added */ static u_long data_in, data_out=0; u_int reg_num = 14; /* new new added */ u_int fec_add, chip_add, global_reg, channel_add, ch_add, bc_add; u_long reg_data = 0; u_int reg_id, nwords,max_nwords; u_int ped_add; u_int act_fec, number_fec, fec_status; u_int all_fecs, fec_test_list, rdo_part; u_int nr_samples, zs_enable, zs_thr, readout_mode, trigger_source; fun = 1; while(fun != 0) { printf("\n"); printf("Select an option:\n"); printf(" 1 RCU_Open 2 RCU_Close\n"); printf(" ------------------------------------------\n"); printf(" 3 FECs ON & RESET 4 FEC FPGA CONFIG\n"); printf(" 5 ALTRO REGISTERS 6 ALTRO Commands (na)\n"); printf(" 7 Read ALTRO PMEM 8 Write ALTRO PMEM\n"); printf(" 9 TEST ALL 10 CONFIG \n"); printf(" 11 Read File 12 Write File\n"); printf(" 13 Test TS Functions \n"); printf(" 14 BC REGISTERS 15 BC Commands (na)\n"); printf(" ============================================\n"); printf(" 0 Quit\n"); printf("Your choice "); fun = getdecd(fun); if ((fun < 0) || (fun > 14)) { printf ("\n ERROR: your selection is out of range\n"); return(-1); } /************************************************/ /* RCU OPEN */ /************************************************/ if (fun == 1) { printf("\nWhich RCU you want to work with? "); printf("Values range from 0 (innermost) to 5 (outermost)\n"); printf("Your choice: "); rcu_id = getdecd(rcu_id); printf("\n"); switch(rcu_id) { case 0: rorc_node.revision = RORC_REVISION0; rorc_node.serial = RORC_SERIAL0; rorc_node.channel = RORC_CHANNEL0; break; case 1: rorc_node.revision = RORC_REVISION1; rorc_node.serial = RORC_SERIAL1; rorc_node.channel = RORC_CHANNEL1; break; case 2: rorc_node.revision = RORC_REVISION2; rorc_node.serial = RORC_SERIAL2; rorc_node.channel = RORC_CHANNEL2; break; case 3: rorc_node.revision = RORC_REVISION3; rorc_node.serial = RORC_SERIAL3; rorc_node.channel = RORC_CHANNEL3; break; case 4: rorc_node.revision = RORC_REVISION4; rorc_node.serial = RORC_SERIAL4; rorc_node.channel = RORC_CHANNEL4; break; case 5: rorc_node.revision = RORC_REVISION5; rorc_node.serial = RORC_SERIAL5; rorc_node.channel = RORC_CHANNEL5; break; default: printf("\n ERROR: your selection is out of range\n"); return (-1); break; } ret = RCU_Open(&rorc_node); if(ret) { DEBUG_TEXT(P_ID_RCU, 10,("RCU_Open() fail: %d\n", ret)); return ret; } DEBUG_TEXT(P_ID_RCU, 80 ,("RORC parameters:\nMinor number:\t%d\nChannel number:\t%d\nStatus:\t%d\n", \ rorc->minor, rorc->channel, rorc->status )); } /************************************************************************/ /* RCU CLOSE */ /************************************************************************/ if (fun == 2) { ret = RCU_Close(); if(ret) { DEBUG_TEXT(P_ID_RCU, 10,("RCU_Close() fail: %d\n", ret)); return ret; } } /************************************************************************/ /* FECs ON & RESET */ /************************************************************************/ if (fun == 3) { printf("\nSingle FECs (0) or whole partition (1)? "); all_fecs = getdecd(all_fecs); if (all_fecs) { printf("Wich readout partition? (0->5)"); rdo_part = getdecd(rdo_part); switch (rdo_part) { case 0: act_fec = 0x1ff01ff; break; case 1: act_fec = 0xfff1fff; break; case 2: act_fec = 0x1ff01ff; break; case 3: act_fec = 0x3ff03ff; break; case 4: act_fec = 0x3ff03ff; break; case 5: act_fec = 0x3ff03ff; break; } } else { printf("\nNr of FECs ON "); number_fec = getdecd(number_fec); act_fec = 0; for(loop = 0; loop < number_fec; loop++) { printf("Enter Addres of FEC nr. %d ", loop); fec_add = getdecd(fec_add); act_fec = (act_fec) | (1 << fec_add); } } /* Switch on FECs */ ret = RCU_ACTFECLIST_Write(act_fec); if(ret) { DEBUG_TEXT(P_ID_FEC, 5,("FECSCOPE()>\t RCU_ACTFECLIST_Write() fail: %d\n", ret)); return ret; } /* Reading back the ACTFEC Register */ ret = RCU_ACTFECLIST_Read(&data_out); if(ret) { DEBUG_TEXT(P_ID_FEC, 5,("FECSCOPE()>\t RCU_ACTFECLIST_Read() fail: %d\n", ret)); return ret; } if (data_out != act_fec) { DEBUG_TEXT(P_ID_FEC, 5,("FECSCOPE()>\t Failed to turn-on all FECS")); return ret; } act_fec = data_out; printf("\nThe FECs have the following power status:"); printf("\nBRANCHA:\t"); for(loop = 0; loop < 16; loop++) { fec_status = (data_out >> loop) & 0x1; printf("%d ", fec_status); } printf("\nBRANCHB:\t"); for(loop = 0; loop < 16; loop++) { fec_status = (data_out >> (loop+16)) & 0x1; printf("%d ", fec_status); } printf("\n\n", fec_status); /* delay 500ms */ ts_delay(500000); /* Reset FECs */ ret = RCU_Exec_FECRESET(); if(ret) { DEBUG_TEXT(P_ID_FEC, 5,("FECSCOPE()>\t RCU_Exec_FECREST() fail: %d", ret)); return ret; } /* Reset FECERRORA and FECERRORB registers */ /* delay 1ms */ ts_delay(1000); ret = RCU_Exec_CLRREGS(); if(ret) { DEBUG_TEXT(P_ID_FEC, 5,("FECSCOPE()>\t RCU_Exec_CLRREGS() fail: %d", ret)); return ret; } /* Check FECERRORA and FECERROB registers */ ret = RCU_FECERRA_Read(&data_out); if(ret) { DEBUG_TEXT(P_ID_FEC, 5,("FECSCOPE()>\t RCU_FECERRA_Read() fail: %d", ret)); return ret; } if(data_out &0x1) printf("\nFECSCOPE()>\tWARNING: ALTRO ERROR asserted on Branch A\n"); ret = RCU_FECERRB_Read(&data_out); if(ret) { DEBUG_TEXT(P_ID_FEC, 5,("FECSCOPE()>\t RCU_FECERRB_Read() fail: %d", ret)); return ret; } if(data_out &0x1) printf("\nFECSCOPE()>\tWARNING: ALTRO ERROR asserted on Branch B\n"); } /************************************************************************/ /* ACCESS TO ALTRO REGISTERS */ /************************************************************************/ if (fun == 5) { printf("\nEnter the FEC address (5 bits)"); fec_add = gethexd(fec_add); printf("Enter the address of the ALTRO chip to read (3 bits)"); chip_add = gethexd(chip_add); printf("Do you want to access a Global Register [0=no/1=yes]"); global_reg = gethexd(global_reg); if(!global_reg) { printf("Enter the address of the ALTRO channel to read (4 bits)"); channel_add = gethexd(channel_add); ch_add = (chip_add << 4) | channel_add; choice = 1; while(choice != 0) { printf("\n"); printf("Select an option:\n"); printf("\n ALTRO Channel Individual Registers"); printf("\n ------------------------------------------\n"); printf(" 1 Read K1 2 Write K1\n"); printf(" 3 Read K2 4 Write K2\n"); printf(" 5 Read K3 6 Write K3\n"); printf(" 7 Read L1 8 Write L1\n"); printf(" 9 Read L2 10 Write L2\n"); printf(" 11 Read L3 12 Write L3\n"); printf(" 13 Read VFPED 14 Write VFPED\n"); printf(" 15 Read PMDTA 16 Write PMDTA\n"); printf(" 17 Read ADEVL\n"); printf(" ============================================\n"); printf(" 0 Quit\n"); printf("Your choice "); choice = getdecd(choice); if ((choice < 0) || (choice > 17)){ printf ("\n ERROR: your selection is out of range\n"); return(-1); } switch(choice) { case 1: case 2: reg_id = 0; break; case 3: case 4: reg_id = 1; break; case 5: case 6: reg_id = 2; break; case 7: case 8: reg_id = 3; break; case 9: case 10: reg_id = 4; break; case 11: case 12: reg_id = 5; break; case 13: case 14: reg_id = 6; break; case 15: case 16: reg_id = 7; break; case 17: case 18: reg_id = 8; break; case 19: reg_id = 9; break; } /* Writing */ if((choice == 2) || (choice == 4) || (choice == 6) || (choice == 8) || \ (choice == 10) || (choice == 12) || (choice == 14) || (choice == 16)) { printf("Enter data that you want to write "); reg_data = gethexd(reg_data); ret = FEC_ALTRO_Write(fec_add, ch_add, reg_add[reg_id], reg_data); if(ret) { DEBUG_TEXT(P_ID_FEC, 5, ("FECSCOPE> FEC_ALTRO_Write() fail: return value = %d", ret)); return ret; } } /* Reading */ else { ret = FEC_ALTRO_Read(fec_add, ch_add, reg_add[reg_id], ®_data); if(ret) { DEBUG_TEXT(P_ID_FEC, 5, ("FECSCOPE> FEC_ALTRO_Read() fail: return value = %d", ret)); return ret; } printf("\nFEC_ADD = 0x%x\tCHIP_ADD = 0x%x\tCHANNEL_ADD = 0x%x", fec_add, chip_add, channel_add); printf("\nREG_ADD = 0x%x\tDATA = 0x%x\n", reg_add[reg_id], reg_data ); } } /* end ofwhile() */ } else { choice = 1; while(choice != 0) { printf("\n"); printf("Select an option:\n"); printf("\n ALTRO Global Registers"); printf("\n ------------------------------------------\n"); printf(" 1 Read ZSTHR 2 Write ZSTHR\n"); printf(" 3 Read BCTHR 4 Write BCTHR\n"); printf(" 5 Read TRCFG 6 Write TRCFG\n"); printf(" 7 Read DPCFG 8 Write DPCFG\n"); printf(" 9 Read BFNPT 10 Write BFNPT\n"); printf(" 11 Read PMADD 12 Write PMADD\n"); printf(" 13 Read ERSTR \n"); printf(" 14 Read TRCNT \n"); printf(" ============================================\n"); printf(" 0 Quit\n"); printf("Your choice "); choice = getdecd(choice); if ((choice < 0) || (choice > 14)){ printf ("\n ERROR: your selection is out of range\n"); return(-1); } switch(choice) { case 1: case 2: reg_id = 9; break; case 3: case 4: reg_id = 10; break; case 5: case 6: reg_id = 11; break; case 7: case 8: reg_id = 12; break; case 9: case 10: reg_id = 13; break; case 11: case 12: reg_id = 14; break; case 13: reg_id = 15; break; case 14: reg_id = 16; break;} ch_add = chip_add << 4; /* Writing */ if((choice == 2) || (choice == 4) || (choice == 6) || (choice == 8) || \ (choice == 10) || (choice == 12)) { printf("Enter data that you want to write "); reg_data = gethexd(reg_data); ret = FEC_ALTRO_Write(fec_add, ch_add, reg_add[reg_id], reg_data); if(ret) { DEBUG_TEXT(P_ID_FEC, 5, ("FECSCOPE> FEC_ALTRO_Write() fail: return value = %d", ret)); return ret; } } /* Reading */ else { ret = FEC_ALTRO_Read(fec_add, ch_add, reg_add[reg_id], ®_data); if(ret) { DEBUG_TEXT(P_ID_FEC, 5, ("FECSCOPE> FEC_ALTRO_Read() fail: return value = %d", ret)); return ret; } printf("\nFEC_ADD = 0x%x\tCHIP_ADD = 0x%x\tCHANNEL_ADD = 0x%x", fec_add, chip_add, channel_add); printf("\nREG_ADD = 0x%x\tDATA = 0x%x\n", reg_add[reg_id], reg_data ); } } /* end ofwhile() */ } /* end else */ } /* end of main if() */ /************************************************************************/ /* Read ALTRO PMEM */ /************************************************************************/ if (fun == 7) { printf("\nWrite the Channel Address of the Pedestal Memory you want to read"); printf("\nEnter the FEC address (5 bits) "); fec_add = gethexd(fec_add); printf("Enter the address of the ALTRO chip (3 bits) "); chip_add = gethexd(chip_add); printf("Enter the address of the ALTRO channel to read (4 bits) "); channel_add = gethexd(channel_add); printf("Enter the Pedestal Address (10 bits)"); ped_add = getdecd(ped_add); printf("Enter the numer of words you want to read (max %d)", 1024 - ped_add); nwords = getdecd(nwords); max_nwords = 1024 - ped_add; if(nwords > max_nwords) { printf("\nNr. of words too large! %d words will be used\n", max_nwords); nwords = max_nwords; } printf("\nDo you want to write the pedestal pattern to file (1=yes 0=no): "); tofile = getdecd(tofile); if (tofile) { printf("Enter the path and name of the file to write: "); getstrd(fname, fname); } /* opening the file to write the results */ if (tofile) { file = fopen(fname, "w"); if (file == 0) { printf("Can't open output file\n"); return(-1); } } ch_add = ((chip_add << 4) | channel_add) & 0x7f; ret = FEC_PMEM_Read(fec_add, ch_add, offset, nwords, memdata); if(ret) { DEBUG_TEXT(P_ID_FEC, 5, ("FECSCOPE> FEC_PMEM_Read() fail: return value = %d", ret)); return ret; } if(tofile) { fprintf(file,"Content of the Pedestal Memory of: FEC 0x%x\tChannel %d\n\n", fec_add, ch_add); for(loop=0; loop max_nwords) { printf("\nNr. of words too large! %d words will be used\n", max_nwords); nwords = max_nwords; } printf("Select the data source"); printf("\n 0 = From last RCU_File_Read"); printf("\n 1 = Incremental pattern"); printf("\n 2 = Constant pattern\n"); dsource = getdecd(dsource); if (dsource == 0){ for (loop = 0; loop < MAX_MEM; loop++) memdata[loop] = fdata[loop]; } else if (dsource == 1){ for(loop=0; loop < MAX_MEM; loop++) memdata[loop] = loop; } else{ printf("Enter data word 0x"); word = gethexd(word); data_in = word; for (loop = 0; loop < MAX_MEM; loop++) memdata[loop] = word; } ch_add = ((chip_add << 4) | channel_add) & 0x7f; ret = FEC_PMEM_Write(fec_add, ch_add, offset, nwords, memdata); if(ret) { DEBUG_TEXT(P_ID_FEC, 5, ("FECSCOPE> FEC_PMEM_Write() fail: return value = %d", ret)); return ret; } } /************************************************************************/ /* Test ALL */ /************************************************************************/ if (fun == 9) { printf("\nAll FECs or those already ON (ACTFECLIST)? [ALL=1 / ACTFECLIST=0] "); all_fecs = getdecd(all_fecs); if(all_fecs) { printf("Wich readout partition? (0->5)"); rdo_part = getdecd(rdo_part); } printf("How many test cycle you want to run "); ncycles = getdecd(ncycles); printf("Select the data source"); printf("\n 0 = From last RCU_File_Read"); printf("\n 1 = Incremental pattern"); printf("\n 2 = Constant pattern\n"); dsource = getdecd(dsource); if (dsource == 0){ for (loop = 0; loop < MAX_MEM; loop++) memdata[loop] = fdata[loop]; } else if (dsource == 1){ for(loop=0; loop < MAX_MEM; loop++) memdata[loop] = loop; } else{ printf("Enter data word 0x"); word = gethexd(word); data_in = word; for (loop = 0; loop < MAX_MEM; loop++) memdata[loop] = word; } printf("\nDo you want to write the results of the check to file (1=yes 0=no): "); tofile = getdecd(tofile); if (tofile) { printf("Enter the path and name of the file to write: "); getstrd(fname, fname); } /* opening the file to write the results */ if (tofile) { file = fopen(fname, "w"); if (file == 0) { printf("Can't open output file\n"); return(-1); } } /********************************************/ /* Configure ALTROIF Register */ /********************************************/ /* [9:0] Nr. samples/ event */ /* [13:10] clk_ratio */ /* [15:14] cstb delay */ /********************************************/ /* reg_data = (0x3 <<14) | (0x1 << 10) | 0; ret = RCU_ALTROIF_Write(reg_data); if(ret) { DEBUG_TEXT(P_ID_RCU, 5,("FECSCOPE()> RCU_ALTROIF_Write fail: %d", ret)); return ret; } */ if (all_fecs) { switch (rdo_part) { case 0: fec_test_list = 0x1ff01ff; break; case 1: fec_test_list = 0xfff1fff; break; case 2: fec_test_list = 0x1ff01ff; break; case 3: fec_test_list = 0x3ff03ff; break; case 4: fec_test_list = 0x3ff03ff; break; case 5: fec_test_list = 0x3ff03ff; break; } } /*************** Check whic FECs are ON ***********/ else { ret = RCU_ACTFECLIST_Read(&data_out); if(ret) { DEBUG_TEXT(P_ID_FEC, 5,("FECSCOPE()>\t RCU_ACTFECLIST_Read() fail: %d\n", ret)); return ret; } act_fec = data_out; } /*************** SCAN ACTFECLIST ******************/ for(fec_add=0; fec_add<32; fec_add++) { if(all_fecs) { act_fec = fec_test_list & (0x1 << fec_add); /* Switch on FECs */ ret = RCU_ACTFECLIST_Write(act_fec); if(ret) { DEBUG_TEXT(P_ID_FEC, 5,("FECSCOPE()>\t RCU_ACTFECLIST_Write() fail: %d\n", ret)); return ret; } /*ts_delay(500000); */ usleep(900000); ret = RCU_Exec_FECRESET(); if(ret) { DEBUG_TEXT(P_ID_FEC, 5,("FECSCOPE()>\t RCU_Exec_FECREST() fail: %d", ret)); return ret; } } if ((act_fec >> fec_add) & 0x1) { /*************** TEST CYCLES **********************/ for(cycle=0; cycle FEC_PMEM_Write() fail: return value = %d", ret)); return ret; } ret = FEC_PMEM_Read(fec_add, ch_add, 0, 1000, memout); if(ret) { DEBUG_TEXT(P_ID_FEC, 5, ("FECSCOPE> FEC_PMEM_Read() fail: return value = %d", ret)); return ret; } /* CHECK memout data */ for(loop=0; loop<1000; loop++) { if ( (memout[loop] & 0x3ff) != (memdata[loop] & 0x3ff) ) { if(tofile) { fprintf(file, "Error in test cycle nr. %d\n", cycle); fprintf(file, "at PMEM %d\t and location %d\t: expected %x\t found %x\n", \ ch_add, loop, memdata[loop] & 0x3ff, memout[loop] & 0x3ff); } else { printf("Error in test cycle nr. %d\n", cycle); printf("at PMEM %d\t and location %d\t: expected %x\t found %x\n", \ ch_add, loop, memdata[loop] & 0x3ff, memout[loop] & 0x3ff); } } } } /*************** END PEDESTAL MEMORIES **************/ /*************** TEST CSRS **************************/ for(ch_add=0; ch_add<128; ch_add++) { for(reg_id=0; reg_id<6; reg_id++) { ret = FEC_ALTRO_Write(fec_add, ch_add, reg_add[reg_id], memdata[0]); if(ret) { DEBUG_TEXT(P_ID_FEC, 5, ("FECSCOPE> FEC_ALTRO_Write() fail: return value = %d", ret)); return ret; } ret = FEC_ALTRO_Read(fec_add, ch_add, reg_add[reg_id], ®_data); if(ret) { DEBUG_TEXT(P_ID_FEC, 5, ("FECSCOPE> FEC_ALTRO_Read() fail: return value = %d", ret)); return ret; } /* CHECK the result */ if ( (reg_data & reg_rmask[reg_id]) != (memdata[0] & reg_rmask[reg_id])) { if(tofile) { fprintf(file, "\nError in test cycle nr. %d\n", cycle); fprintf(file, "At Channel %d\tREG 0x%x\t: expected %x\t found %x\n", \ ch_add, reg_add[reg_id], memdata[0] & reg_rmask[reg_id], reg_data & reg_rmask[reg_id]); } else { printf("\nError in test cycle nr. %d\n", cycle); printf("At Channel %d\tREG 0x%x\t: expected %x\t found %x\n", \ ch_add, reg_add[reg_id], memdata[0] & reg_rmask[reg_id], reg_data & reg_rmask[reg_id]); } } } } /*************** END TEST CSRS **********************/ } /*************** END TEST CYCLES ********************/ if(tofile) fprintf(file,"\nFEC (Add = %d) test completed!\n", fec_add); else printf("\nFEC (Add = %d) test completed!\n", fec_add); } else { if(tofile) fprintf(file, "\nFEC (Add = %d) is not active\n", fec_add); else printf("\nFEC (Add = %d) is not active\n", fec_add); } } if(tofile) fclose(file); } /* end of TESTALL */ /************************************************************************/ /* Configuration */ /************************************************************************/ if (fun == 10) { printf("\nThe same configuration will be applied to all channesl\n"); printf("Nr. of Time Samples/ Channel? "); nr_samples = getdecd(nr_samples); printf("Enable Zero Suppression? (0 = no, 1 = yes) "); zs_enable = getdecd(zs_enable); if (zs_enable) { printf("ZS Threshold? "); zs_thr = getdecd(zs_thr); } printf("Readout Mode? (0=Full Readout, 1=Sparse Readout) "); readout_mode = getdecd(readout_mode); printf("Trigger Source: [1]=Software Trigger, [4]=TTC Trigger, [6]=AUX "); trigger_source = getdecd(trigger_source); /**************** CONFIGURATION OF THE RCU **************/ /********************************************/ /* Configure ALTROIF Register */ /********************************************/ /* [9:0] Nr. samples/ event */ /* [13:10] clk_ratio */ /* [15:14] cstb delay */ /********************************************/ reg_data = (0x3 <<14) | (0x1 << 10) | nr_samples; ret = RCU_ALTROIF_Write(reg_data); if(ret) { DEBUG_TEXT(P_ID_RCU, 5,("FECSCOPE()> RCU_ALTROIF_Write fail: %d", ret)); return ret; } /********************************************/ /* Configure TRCFG Register */ /********************************************/ /* [12:0] L2 latency (only for softw TRG) */ /* [13] trigger mode (0 for TPC) */ /* [16:14] trigger source (ttc,hdw,sfw) */ /********************************************/ reg_data = (trigger_source <<14) | (0x0 << 10) | 0x1fff; ret = RCU_TRGCONF_Write(reg_data); if(ret) { DEBUG_TEXT(P_ID_RCU, 5,("FECSCOPE()> RCU_TRGCONF_Write fail: %d", ret)); return ret; } /********************************************/ /* Configure RDOMOD Register */ /********************************************/ /* [0] meb mode (4/8) buffers */ /* [1] exec_seq on SOD/EOD */ /* [2] sparse rdo */ /* [3] disable check rdyrx */ /********************************************/ reg_data = (0x1 <<3) | (readout_mode << 2) | (0x0 << 1) | 0x0; ret = RCU_RDOMOD_Write(reg_data); if(ret) { DEBUG_TEXT(P_ID_RCU, 5,("FECSCOPE()> RCU_RDOMOD_Write fail: %d", ret)); return ret; } /********************************************/ /* Configure L1 latency register */ /********************************************/ reg_data = 0x20e0; ret = RCU_L1_LATENCY_Write(reg_data); if(ret) { DEBUG_TEXT(P_ID_RCU, 5,("FECSCOPE()> RCU_L1_LATENCY_Write: %d", ret)); return ret; } /********************************************/ /* Configure L1 Message Latency register */ /********************************************/ reg_data = 0xe04e20; ret = RCU_L1_MSG_LATENCY_Write(reg_data); if(ret) { DEBUG_TEXT(P_ID_RCU, 5,("FECSCOPE()> RCU_L1_MSG_LATENCY_Write: %d", ret)); return ret; } /********************************************/ /* Configure RDO_CONFIG1 */ /********************************************/ reg_data = 0xabcd; ret = RCU_ALTROCFG1_Write(reg_data); if(ret) { DEBUG_TEXT(P_ID_RCU, 5,("FECSCOPE()> RCU_ALTROCFG1_Read: %d", ret)); return ret; } /********************************************/ /* Configure RDO_CONFIG2 */ /********************************************/ reg_data = 0xcd; ret = RCU_ALTROCFG2_Write(reg_data); if(ret) { DEBUG_TEXT(P_ID_RCU, 5,("FECSCOPE()> RCU_ALTROCFG2_Read: %d", ret)); return ret; } /********************************************/ /* Configure Readout List Memory */ /********************************************/ ret = RCU_ACTFECLIST_Read(&act_fec); if(ret) { DEBUG_TEXT(P_ID_RCU, 5,("FECSCOPE()> RCU_ACTFECLIST_Read: %d", ret)); return ret; } offset = 0; // for(fec_add=0; fec_add<32; fec_add++) for(i=0; i<32; i++) { fec_add=(i%2)<<4+i/2; if((act_fec >> fec_add) & 0x1) { for(index=0; index<128; index++) memdata[index] = (fec_add << 7) | index; ret = RCU_ROLM_Write(offset, 128, memdata); offset = offset + 128; } } memdata[0]=0x0fff; ret = RCU_ROLM_Write(offset, 1, memdata); /**************** CONFIGURATION OF FECs **************/ for(fec_add=0; fec_add<32; fec_add++) { for(chip_add=0; chip_add<8; chip_add++) { if((act_fec >> fec_add) & 0x1) { ret = FEC_ALTRO_Write(fec_add, chip_add << 4, A_ZSTHR, zs_thr); ret = FEC_ALTRO_Write(fec_add, chip_add << 4, A_TRCFG, nr_samples); ret = FEC_ALTRO_Write(fec_add, chip_add << 4, A_DPCFG, zs_enable << 19); /* ret = FEC_ALTRO_Write(fec_add, chip_add << 4, A_BCTHR, 0x000); ret = FEC_ALTRO_Write(fec_add, chip_add << 4, A_BFNPT, 0x000); for (channel_add=0;channel_add<16;++channel_add) ret = FEC_ALTRO_Write(fec_add,chip_add<<4|channel_add,A_VFPED,0x123); */ } } } } /************************************************/ /* RCU FILE READ */ /************************************************/ if (fun == 11) { printf("Enter the path and name of the file to read "); getstrd(fname, fname); printf("Enter the number of words to read "); fsize = getdecd(fsize); ret = RCU_File_Read(fname, fsize, fdata); if (ret) { rcc_error_print(stdout, ret); return(-1); } printf("The file has been read into the internal array\n"); for(ii=0; ii 4)){ printf ("\n ERROR: your selection is out of range\n"); return(-1); } switch(choice) { case 1: bc_add = 0x12; break; case 3: bc_add = 0x40; break; case 4: bc_add = 0x15; break;} /* Reading */ ret = FEC_BC_Read(fec_add, bc_add, ®_data); if(ret) { DEBUG_TEXT(P_ID_FEC, 5, ("FECSCOPE> FEC_BC_Read() fail: return value = %d", ret)); return ret; } printf("\nFEC_ADD = 0x%x", fec_add); printf("\nREG_ADD = 0x%x\tDATA = 0x%x\n", bc_add, reg_data ); } /* end ofwhile() */ } } /* end of main while () */ /* cleanup library, close physmem, etc. */ /* release_channel (rorc); return(0); */ } /* end of fecfuncmenu() */