#ifndef RCU2_FUNCTIONS_H #define RCU2_FUNCTIONS_H #include "rcu2_addr_map.h" #include //======================================================================== int getBranchFromFec(int fec, int rp) { // // check in which branch this FEC (0..32) is in // int inner = 5; // for RPs 3, 4, 5 if (rp==0) inner = 4; else if (rp==1) inner = 6; else if (rp==2) inner = 4; if ( fec >= (16+inner) ) return 3; else if ( fec >= 16 ) return 2; else if ( fec >= inner ) return 1; else return 0; } //======================================================================== int checkFecOn(unsigned int afla, unsigned int aflb, int fec, int verbose) { // // check if this fec is on // unsigned int afl = (aflb<<16) | afla; if ( (afl) & (1<2) printf("FEC%02i is ON!\n", fec); return 1; } else { if (verbose>2) printf("FEC%02i is OFF!\n", fec); return 0; } return 0; } //======================================================================== int checkAltroOn(unsigned int altrolist, int altro, int verbose) { // // check if this altro is included in the list // if ( (altrolist) & (1<2) printf("ALTRO%i is used.\n", altro); return 1; } else { if (verbose>2) printf("ALTRO%i is skipped!\n", altro); return 0; } return 0; } //======================================================================== int checkChannelOn(unsigned int channellist, int channel, int verbose) { // // check if this channel is included in the list // if ( (channellist) & (1<2) printf("CHANNEL%02i is used.\n", channel); return 1; } else { if (verbose>2) printf("CHANNEL%02i is skipped!\n", channel); return 0; } return 0; } //======================================================================== int Read_ACTFECLIST(unsigned int *active_fecsA, unsigned int *active_fecsB, int verbose) { // // Read the ACTFEC List // unsigned int afla = *active_fecsA; unsigned int aflb = *active_fecsB; if (rbm_read(get_Address_ABI_CSW(0), &afla, verbose)) printf("ERROR: Could not read ACTFECLIST_A\n"); if (rbm_read(get_Address_ABI_CSW(2), &aflb, verbose)) printf("ERROR: Could not read ACTFECLIST_B\n"); *active_fecsA = afla; *active_fecsB = aflb; if ( (*active_fecsA==0) && (*active_fecsB==0) ) { printf("Warning: All FECs are off!\n"); } else { if (verbose) printf("Content of Register ACTFECLIST_A: 0x%X\n", *active_fecsA); if (verbose) printf("Content of Register ACTFECLIST_B: 0x%X\n", *active_fecsB); } return 0; } //======================================================================== int Write_ACTFECLIST(unsigned int afla, unsigned int aflb, int verbose) { // // Switch the FECs // unsigned int active_fecsA, active_fecsB; int fec, retval; char desc[256]; // Read AFL if (rbm_read(get_Address_ABI_CSW(0), &active_fecsA, verbose)) printf("ERROR: Could not read ACTFECLIST_A\n"); if (rbm_read(get_Address_ABI_CSW(2), &active_fecsB, verbose)) printf("ERROR: Could not read ACTFECLIST_B\n"); active_fecsA = (active_fecsA & 0xFFFF); active_fecsB = (active_fecsB & 0xFFFF); if ( (active_fecsA==afla) && (active_fecsB==aflb) ) { if ( ((afla>0) || (aflb>0)) && (verbose) ) printf("All FECs already ON\n"); return 0; } // Branches A if (active_fecsA & ~afla) { for ( fec=0; fec<16; ++fec ) { if ( (active_fecsA & ~afla)&1< 3 ) printf("Unlocking reset register ...\n"); *RBM_UNL_REG = 0xFEEDBEEF; // Unlock if ( verbose > 3 ) printf("Sending reset pulse (pattern=0x%X) ...\n", pattern&0x1F); *RBM_RESET = pattern&0xFFF; // RESET PULSE (no HOLD, bit 13 not set) usleep(250000); if ( verbose > 3 ) printf("Reading status in reset register .. \n"); result = *RBM_RESET; if ( (result>>12)&0x1 ) { // Bit 12 if ( verbose > 3 ) { printf("Successful reset with pattern 0x%X (status=0x%X).\n", pattern, result); printf("Locking reset register ...\n"); } *RBM_UNL_REG = 0x0; // Lock reset again usleep(250000); if ( verbose > 3 ) printf("Reading status in reset register once more ...\n"); result = *RBM_RESET; if ( (result>>14)&0x1 ) { if ( verbose > 3 ) printf("Reset is locked (status=0x%X)\n", result); } else { printf("Warning: Reset not locked!! Status=0x%X\n", result); } } else { printf("Error: Reset could not be done!! Status=0x%X\n", result); return 0; } /* if ( verbose > 3 ) printf("Disable PLL lock reset ...\n"); *RBM_PLL_UNL = 0xFEEDAFFE; // Unlock */ return 0; }; //======================================================================== int Disable_PLL_Reset(int verbose) { // // Write 0xFEEDAFFE to PLL reset unlock register to disable the PLL Lock reset // if ( verbose > 3 ) printf("Disable PLL lock reset ...\n"); *RBM_PLL_UNL = 0xFEEDAFFE; // Unlock }; //======================================================================== int Enable_PLL_Reset(int verbose) { // // Write 0 to PLL reset unlock register to enable the PLL Lock reset // if ( verbose > 3 ) printf("Enable PLL lock reset ...\n"); *RBM_PLL_UNL = 0x0; // Unlock }; //======================================================================== //======================================================================== // Dump status register content for the readout module //======================================================================== //======================================================================== //======================================================================== int Dump_BRANCH_READOUT_UNIT_STATUS(int verbose) { // // Dump the status of the 4 Branch Readout Units // int branch = 0; for (branch =0; branch<4; branch++) { unsigned int data = 0; if (rbm_read(get_Address_BRANCH_READOUT_UNIT_STATUS(branch), &data, verbose)) { printf("ERROR: Could not read BRANCH_READOUT_UNIT_STATUS\n"); return 1; } printf("BRANCH_READOUT_UNIT_STATUS (branch %d) = 0x%X===\n", branch, data); printf(" => Bit 1..0 (FSM Status of the Readout Sequencer) = 0x%X => ", data&0x3); switch (data&0x3) { case 0x0: printf("INIT Sequencer\n"); break; case 0x1: printf("ROLM memory address phase\n"); break; case 0x2: printf("ROLM memory data phase\n"); break; case 0x3: printf("End of ROLM reached\n"); break; default: printf("UNDEFINED?\n"); break; } printf(" => Bit 5..4 (FSM Status of the transaction handler) = 0x%X => ", (data>>4)&0x3); switch ((data>>4)&0x3) { case 0x0: printf("IDLE\n"); break; case 0x1: printf("INIT transaction\n"); break; case 0x2: printf("WAIT for completion of transaction\n"); break; case 0x3: printf("Transaction DONE\n"); break; default: printf("UNDEFINED?\n"); break; } printf(" => Bit 9..8 (Transaction in progress flags) = 0x%X => ", (data>>8)&0x3); switch ((data>>8)&0x3) { case 0x0: printf("No transaction\n"); break; case 0x1: printf("Channel readout in progress\n"); break; case 0x2: printf("Read pointer increment (RP_INC) in progress\n"); break; case 0x3: printf("INVALID (should never occur)\n"); break; default: printf("UNDEFINED?\n"); break; } printf(" => Bit 14..12 (FSM Status of the readout controller) = 0x%X => ", (data>>12)&0x7); switch ((data>>12)&0x7) { case 0x0: printf("IDLE\n"); break; case 0x1: printf("Check channel ready\n"); break; case 0x2: printf("Start channel readout\n"); break; case 0x3: printf("Wait for Channel completed\n"); break; case 0x4: printf("Readout completed\n"); break; case 0x5: printf("Send RPINC command\n"); break; case 0x6: printf("Wait for RPINC done\n"); break; default: printf("UNDEFINED?\n"); break; } } return 0; } //======================================================================== int Dump_TRIG_HANDLER_STATUS(int verbose) { // // Dump the status of the Trigger Handler // unsigned int data = 0; if (rbm_read(get_Address_TRIG_HANDLER_STATUS(), &data, verbose)) { printf("ERROR: Could not read TRIG_HANDLER_STATUS\n"); return 1; } printf("TRIGGER_HANDLER_STATUS = 0x%X\n", data); printf(" => Bit 3..0 (FSM Status) = 0x%X => ", data&0xF); switch (data&0xF) { case 0x0: printf("IDLE\n"); break; case 0x1: printf("WAIT FOR L1\n"); break; case 0x2: printf("SEND L1 to ALTRO\n"); break; case 0x3: printf("WAIT FOR L2\n"); break; case 0x4: printf("SEND L2 to ALTRO\n"); break; case 0x5: printf("START EVENT READOUT\n"); break; case 0x6: printf("WAIT READOUT COMPLETE\n"); break; case 0x7: printf("WAIT EVENT COMPLETE\n"); break; case 0x8: printf("SEND SOD\n"); break; case 0x9: printf("SEND EOD\n"); break; case 0xA: printf("SEND SYNC\n"); break; case 0xB: printf("CHECK TRIGGER TYPE\n"); break; default: printf("UNDEFINED?\n"); break; } printf(" => Bit 4 (Event in progress) = %u", (data>>4)&0x1); if ((data>>4)&0x1) printf(" => Event is in progress\n"); else printf("\n"); printf(" => Bit 5 (Readout in progress) = %u", (data>>5)&0x1); if ((data>>5)&0x1) printf(" => Readout is in progress\n"); else printf("\n"); printf(" => Bit 7..6 (Not used)\n"); printf(" => Bit 15..8 (Trigger pulse width) = 0x%X=%d\n", (data>>8)&0xFF, (data>>8)&0xFF); return 0; } //======================================================================== int Dump_CHANNEL_DATA_CONDITIONER_STATUS(int verbose) { // // Dump the status of the channel data conditioner // unsigned int data = 0; if (rbm_read(get_Address_CHANNEL_DATA_CONDITIONER_STATUS(), &data, verbose)) { printf("ERROR: Could not read CHANNEL_DATA_CONDITIONER_STATUS\n"); return 1; } printf("CHANNEL_DATA_CONDITIONER_STATUS = 0x%X\n", data); printf(" => Bit 2..0 (FSM Status) = 0x%X => ", data&0x7); switch (data&0x7) { case 0x0: printf("IDLE\n"); break; case 0x1: printf("START PAYLOAD TRANSFER (of channel data from FIFOs to DDL2)\n"); break; case 0x2: printf("SEND BRANCH AI PAYLOAD\n"); break; case 0x3: printf("SEND BRANCH AO PAYLOAD\n"); break; case 0x4: printf("SEND BRANCH BI PAYLOAD\n"); break; case 0x5: printf("SEND BRANCH BO PAYLOAD\n"); break; case 0x6: printf("PAYLOAD TRANSFER DONE\n"); break; default: printf("UNDEFINED?\n"); break; } printf(" => Bit 7..4 (READOUT ACTIVE) = 0x%X ", (data>>4)&0xF); if ( ((data>>4)&0xF) == 0x1 ) printf("=> BRANCH AI active\n"); else if ( ((data>>4)&0xF) == 0x2 ) printf("=> BRANCH AO active\n"); else if ( ((data>>4)&0xF) == 0x4 ) printf("=> BRANCH BI active\n"); else if ( ((data>>4)&0xF) == 0x8 ) printf("=> BRANCH BO active\n"); else printf("=> No BRANCH active\n"); printf(" => Bit 11..8 (BRANCH FINISHED) = 0x%X\n", (data>>8)&0xF); if ( (data>>8 )&0x1) printf(" => BRANCH AI finished\n"); if ( (data>>9 )&0x1) printf(" => BRANCH AO finished\n"); if ( (data>>10)&0x1) printf(" => BRANCH BI finished\n"); if ( (data>>11)&0x1) printf(" => BRANCH BO finished\n"); if (!((data>> 8)&0xF)) printf(" => No BRANCH finished yet\n"); return 0; } //======================================================================== int Dump_EVT_ASSEMBLER_CONTROLLER_STATUS(int verbose) { // // Dump the status of the event assembler // unsigned int data = 0; if (rbm_read(get_Address_EVT_ASSEMBLER_CONTROLLER_STATUS(), &data, verbose)) { printf("ERROR: Could not read EVT_ASSEMBLER_CONTROLLER_STATUS\n"); return 1; } printf("EVENT_ASSEMBLER_CONTROLLER_STATUS = 0x%X\n", data); printf(" => Bit 3..0 (FSM Status) = 0x%X => ", data&0xF); switch (data&0xF) { case 0x0: printf("IDLE\n"); break; case 0x1: printf("WAIT SEND START OF EVENT (SOE only send if XOFF not asserted by DDL2)\n"); break; case 0x2: printf("SEND SOE (start of event)\n"); break; case 0x3: printf("SEND CDH\n"); break; case 0x4: printf("SEND CDH DONE\n"); break; case 0x5: printf("SEND PAYLOAD (data is sourced from CDC, check CDC status)\n"); break; case 0x6: printf("WAIT SEND TRAILER (XOFF asserted, to sending trailer is delayed)\n"); break; case 0x7: printf("SEND EOE ( event done )\n"); break; case 0x8: printf("EVENT DONE\n"); break; default: printf("UNDEFINED?\n"); break; } printf(" => Bit 4 (Event Type) = %u => ", (data>>4)&0x1); if ((data>>4)&0x1) printf("CDH only event (SOR, EOR, SYNC)\n"); else printf("Normal event\n"); return 0; } //======================================================================== int Dump_DDL2_LINK_FIFO_STATUS(int verbose) { // // Dump the status of the DDL2 link FIFO // unsigned int data = 0; if (rbm_read(get_Address_DDL2_LINK_FIFO_STATUS(), &data, verbose)) { printf("ERROR: Could not read DDL2_LINK_FIFO_STATUS\n"); return 1; } printf("DDL2_LINK_FIFO_STATUS = 0x%X\n", data); printf(" => Bit 2..0 (Branch AI FIFO Status) = 0x%X => ", data&0x7); if ( data&0x1 ) printf("FIFO is empty\n"); else if ( (data>>1)&0x1 ) printf("FIFO is almost full\n"); else if ( (data>>2)&0x1 ) printf("FIFO is FULL\n"); else printf("FIFO partially filled\n"); printf(" => Bit 6..4 (Branch AO FIFO Status) = 0x%X => ", (data>>4)&0x7); if ( (data>>4)&0x1 ) printf("FIFO is empty\n"); else if ( (data>>5)&0x1 ) printf("FIFO is almost full\n"); else if ( (data>>6)&0x1 ) printf("FIFO is FULL\n"); else printf("FIFO partially filled\n"); printf(" => Bit 10..8 (Branch BI FIFO Status) = 0x%X => ", (data>>8)&0x7); if ( (data>>8)&0x1 ) printf("FIFO is empty\n"); else if ( (data>>9)&0x1 ) printf("FIFO is almost full\n"); else if ( (data>>10)&0x1 ) printf("FIFO is FULL\n"); else printf("FIFO partially filled\n"); printf(" => Bit 14..12 (Branch BO FIFO Status) = 0x%X => ", (data>>12)&0x7); if ( (data>>12)&0x1 ) printf("FIFO is empty\n"); else if ( (data>>13)&0x1 ) printf("FIFO is almost full\n"); else if ( (data>>14)&0x1 ) printf("FIFO is FULL\n"); else printf("FIFO partially filled\n"); printf(" => Bit 16 (DDL XOFF Status) = 0x%X => ", (data>>16)&0x1); if ( (data>>16)&0x1 ) printf("XOFF from DDL2\n"); else printf("No XOFF from DDL2\n"); printf(" => Bit 17 (DDL Ready) = 0x%X => ", (data>>17)&0x1); if ( (data>>17)&0x1 ) printf("DDL2 is ready\n"); else printf("DDL2 is not ready (no data transfer possible)\n"); return 0; } //======================================================================== int Dump_SOD_EOD_SYNC_TRIG_CTR(int verbose) { // // Dump the SOD, EOD and SYNC trigger counters // unsigned int data = 0; if (rbm_read(get_Address_SOD_EOD_SYNC_TRIG_CTR(), &data, verbose)) { printf("ERROR: Could not read SOD_EOD_SYNC_TRIG_CTR\n"); return 1; } printf("SOD_EOD_SYNC_TRIG_CTR = 0x%X\n", data); printf(" => Bit 7..0 (Number of SOD events) = %u\n", data&0xFF); printf(" => Bit 15..8 (Number of EOD events) = %u\n", (data>>8)&0xFF); printf(" => Bit 23..16 (Number of SYNC events) = %u\n", (data>>16)&0xFF); return 0; } //======================================================================== int Dump_EVENT_READOUT_MANAGER_STATUS(int verbose) { // // Dump the status of the event readout manager // unsigned int data = 0; if (rbm_read(get_Address_EVENT_READOUT_MANAGER_STATUS(), &data, verbose)) { printf("ERROR: Could not read EVENT_READOUT_MANAGER_STATUS\n"); return 1; } printf("REG_EVENT_READOUT_MANAGER_STATUS = 0x%X\n", data); printf(" => Bit 2..0 (FSM Status) = 0x%X => ", data&0x7); switch (data&0x7) { case 0x0: printf("IDLE\n"); break; case 0x1: printf("Start ALTRO readout\n"); break; case 0x2: printf("ALTRO readout in progress\n"); break; case 0x3: printf("Start RPINC (Read-Pointer increment)\n"); break; case 0x4: printf("RPINC in progress\n"); break; case 0x5: printf("ALTRO readout completed\n"); break; default: printf("UNDEFINED?\n"); break; } printf(" => Bit 7..4 (Branch Readout active) = 0x%X\n", (data>>4)&0xF); if ( ((data>>4)&0xF) == 0 ) printf(" => No branch readout active\n"); if ( (data>>4)&0x1 ) printf(" => BRANCH AI in progress\n"); else printf(" => BRANCH AI done\n"); if ( (data>>5)&0x1 ) printf(" => BRANCH AO in progress\n"); else printf(" => BRANCH AO done\n"); if ( (data>>6)&0x1 ) printf(" => BRANCH BI in progress\n"); else printf(" => BRANCH BI done\n"); if ( (data>>7)&0x1 ) printf(" => BRANCH BO in progress\n"); else printf(" => BRANCH BO done\n"); printf(" => Bit 11..8 (RPINC in progress) = 0x%X\n", (data>>8)&0xF); if ( ((data>> 8)&0xF) == 0 ) printf(" => No RPINC in progress\n"); if ( (data>> 8)&0x1 ) printf(" => BRANCH AI in progress\n"); if ( (data>> 9)&0x1 ) printf(" => BRANCH AO in progress\n"); if ( (data>>10)&0x1 ) printf(" => BRANCH BI in progress\n"); if ( (data>>11)&0x1 ) printf(" => BRANCH BO in progress\n"); return 0; } //======================================================================== int Dump_RDO_CFG1(int verbose) { // // Dump the readout config 1 register content // unsigned int data = 0; if (rbm_read(get_Address_RDO_CFG1(), &data, verbose)) { printf("ERROR: Could not read RDO_CFG1 register\n"); return 1; } printf("RDO CFG1 = 0x%X\n", data); printf(" => Bit 3..0 (channel readout order) = 0x%X\n", data&0xF); if (data&0xF==0xF) printf(" Linear readout enabled for all branches\n"); else if ( !(data&0xF) ) printf(" Chunk-based readout enabled for all branches\n"); else { if ( data &0x1) printf(" Linear readout enabled for Branch AI\n"); else printf(" Chunk-based readout enabled for Branch AI\n"); if ((data>>1)&0x1) printf(" Linear readout enabled for Branch AO\n"); else printf(" Chunk-based readout enabled for Branch AO\n"); if ((data>>2)&0x1) printf(" Linear readout enabled for Branch BI\n"); else printf(" Chunk-based readout enabled for Branch BI\n"); if ((data>>3)&0x1) printf(" Linear readout enabled for Branch BO\n"); else printf(" Chunk-based readout enabled for Branch BO\n"); } printf(" => Bit 4 (Empty channel suppression) = %u\n", (data>>4)&0x1); if ((data>>4)&0x1) printf(" Empty channel suppression enabled\n"); else printf(" empty channel suppression disabled\n"); printf(" => Bit 5 (Sparse readout mode) = %u\n", (data>>5)&0x1); if ((data>>5)&0x1) printf(" Sparse readout\n"); else printf(" Full readout\n"); printf(" => Bit 23..8 (SCEVL wait time) = 0x%X (=> %.2f us)\n", (data>>8)&0xFFFF, ((data>>8)&0xFFFF)*12.5/1000); return 0; } //======================================================================== int Dump_TRIG_SELECT(int verbose) { // // Dump the trig select register // unsigned int data = 0; if (rbm_read(get_Address_TRIG_SELECT(), &data, verbose)) { printf("ERROR: Could not read TRIG_SELECT\n"); return 1; } printf("TRIG_SELECT = 0x%X\n", data); printf(" => Bit 3..0 (Trigger mode) = %u\n", data&0x1); if (data&0x1) printf(" L0 from TTC is forwarded to ALTROs to start sampling\n"); else printf(" L1 from TTC is forwarded to ALTROs to start sampling\n"); printf(" => Bit 11..4 (Trigger pulse width for L0 and L1) = 0x%X = %d\n", (data>>4)&0xFF, (data>>4)&0xFF); printf(" => Bit 12 (Pulse width control) = %u\n", (data>>12)&0x1); if ((data>>12)&0x1) printf(" Use fixed trigger pulse width\n"); else printf(" Use automatically determined trigger pulse width (from SCLK)\n"); printf(" => Bit 31 (Rdo disable) = %u => ", (data>>31)&0x1); if ((data>>31)&0x1) printf(" Readout disabled. No data will be sent after a trigger, only CDH\n"); else printf(" Readout enabled\n"); return 0; } //======================================================================== int Dump_TRG_MEB_CFG(int verbose) { // // Dump the value from the MEB configuration register // unsigned int data = 0; if (rbm_read(get_Address_TRG_MEB_CFG(), &data, verbose)) { printf("ERROR: Could not read TRG_MEB_CFG\n"); return 1; } printf("TRG_MEB_CFG = 0x%X\n", data); return 0; } //======================================================================== int Dump_TRG_MEB_STS(int verbose) { // // Dump the value from the MEB status register // unsigned int data = 0; if (rbm_read(get_Address_TRG_MEB_STS(), &data, verbose)) { printf("ERROR: Could not read TRG_MEB_STS\n"); return 1; } printf("TRG_MEB_STS = 0x%X\n", data); return 0; } //======================================================================== int Dump_BENCHMARK_STATUS(int verbose) { // // Dump the value from the benchmark module register // unsigned int data = 0; if (rbm_read(get_Address_BENCHMARK_STATUS(), &data, verbose)) { printf("ERROR: Could not read EVENT_BENCHMARK_STATUS\n"); return 1; } printf("BENCHMARK_STATUS = 0x%X\n", data); return 0; } //======================================================================== int Dump_BENCHMARK_READOUT_TIME(int verbose) { // // Dump the value from the benchmark module register // unsigned int data = 0; if (rbm_read(get_Address_BENCHMARK_ACTUAL_READOUT_TIME(), &data, verbose)) { printf("ERROR: Could not read EVENT_BENCHMARK_ACTUAL_READOUT_TIME\n"); return 1; } printf("BENCHMARK_ACTUAL_READOUT_TIME = 0x%X", data); printf(" => %.2f us\n", data*12.5/1000); return 0; } //======================================================================== int Dump_BENCHMARK_LAST_READOUT_TIME(int verbose) { // // Dump the value from the benchmark module register // unsigned int data = 0; if (rbm_read(get_Address_BENCHMARK_LAST_READOUT_TIME(), &data, verbose)) { printf("ERROR: Could not read EVENT_BENCHMARK_LAST_READOUT_TIME\n"); return 1; } printf("BENCHMARK_LAST_READOUT_TIME = 0x%X", data); printf(" => %.2f us\n", data*12.5/1000); return 0; } //======================================================================== int Dump_BENCHMARK_BUSY_TIME(int verbose) { // // Dump the value from the benchmark module register // // unsigned int data = 0; if (rbm_read(get_Address_BENCHMARK_BUSY_TIME(), &data, verbose)) { printf("ERROR: Could not read EVENT_BENCHMARK_BUSY_TIME\n"); return 1; } printf("BENCHMARK_BUSY_TIME (XOff) = 0x%X", data); printf(" => %.2f us\n", data*12.5/1000); return 0; } //======================================================================== int Dump_BENCHMARK_MAX_BUSY_TIME(int verbose) { // // Dump the value from the benchmark module register // unsigned int data = 0; if (rbm_read(get_Address_BENCHMARK_MAX_BUSY_TIME(), &data, verbose)) { printf("ERROR: Could not read EVENT_BENCHMARK_MAX_BUSY_TIME\n"); return 1; } printf("BENCHMARK_MAX_BUSY_TIME (XOff) = 0x%X", data); printf(" => %.2f us\n", data*12.5/1000); return 0; } //======================================================================== int Dump_BENCHMARK_INT_BUSY_TIME(int verbose) { // // Dump the value from the benchmark module register // unsigned int data = 0; if (rbm_read(get_Address_BENCHMARK_INT_BUSY_TIME_LOW(), &data, verbose)) { printf("ERROR: Could not read EVENT_BENCHMARK_INT_BUSY_TIME_LOW\n"); return 1; } printf("BENCHMARK_INT_BUSY_TIME_LOW = 0x%X\n", data); float integrated = data; // if (rbm_read(get_Address_BENCHMARK_INT_BUSY_TIME_HIGH(), &data, verbose)) { printf("ERROR: Could not read EVENT_BENCHMARK_INT_BUSY_TIME_HIGH\n"); return 1; } printf("BENCHMARK_INT_BUSY_TIME_HI = 0x%X\n", data); integrated = data*53.6870912+integrated*12.5/1000000000; printf(" => Integrated Busy Time (XOff) = %.5f s\n", integrated); return 0; } //======================================================================== int Dump_BENCHMARK_TTRC_READY_LOW_COUNT(int verbose) { // // Dump the value from the benchmark module register // unsigned int data = 0; if (rbm_read(get_Address_BENCHMARK_TTRC_READY_LOW_COUNT(), &data, verbose)) { printf("ERROR: Could not read EVENT_BENCHMARK_TTC_READY_LOW_COUNT\n"); return 1; } printf("BENCHMARK_TTRC_READY_LOW_COUNT = 0x%X", data); printf(" => %d\n", data); return 0; } //======================================================================== int Dump_TRIGGER_COLLISION_STATUS_COUNT(int verbose,int triggertype) { // // Check Status when trigger arrived // Triggertype // 0 - L0 // 1 - L1a // 2 - L1r // 3 - L2a // 4 - L2r // 5 - L2t // 6 - SOR // 7 - EOR // 8 - SYNC // char* s_triggertype; if(triggertype==0) s_triggertype="L0"; if(triggertype==1) s_triggertype="L1a"; if(triggertype==2) s_triggertype="L1r"; if(triggertype==3) s_triggertype="L2a"; if(triggertype==4) s_triggertype="L2r"; if(triggertype==5) s_triggertype="L2t"; if(triggertype==6) s_triggertype="SOR"; if(triggertype==7) s_triggertype="EOR"; if(triggertype==7) s_triggertype="SYN"; unsigned int data = 0; if (rbm_read(get_Address_TDC(triggertype), &data, verbose)) { printf("ERROR: Could not read TDC REGISTER\n"); return 1; } printf("TRIGGER ARRIVAL of %s", s_triggertype); printf(" => %X \n", data); int event; for (event=0;event<8;event++){ printf("TRIGGER ARRIVAL of %s for the LAST-%d EVENTS: %X (%X)", s_triggertype,event,((data>>(event*4)&0xF)),get_Address_TDC(triggertype) ); if( ((data>>(event*4)&0xF)) == 0x0 ) printf(" => (IDLE)\n"); if( ((data>>(event*4)&0xF)) == 0x1 ) printf(" => (Wait for L1)\n"); if( ((data>>(event*4)&0xF)) == 0x2 ) printf(" => (Send L1 to ALTRO)\n"); if( ((data>>(event*4)&0xF)) == 0x3 ) printf(" => (Wait for L2)\n"); if( ((data>>(event*4)&0xF)) == 0x4 ) printf(" => (Send L2 to ALTRO)\n"); if( ((data>>(event*4)&0xF)) == 0x5 ) printf(" => (Start Event Readout)\n"); if( ((data>>(event*4)&0xF)) == 0x6 ) printf(" => (Wait for Readout done)\n"); if( ((data>>(event*4)&0xF)) == 0x7 ) printf(" => (wait for event done)\n"); if( ((data>>(event*4)&0xF)) == 0x8 ) printf(" => (Send SOR)\n"); if( ((data>>(event*4)&0xF)) == 0x9 ) printf(" => (Send EOR)\n"); if( ((data>>(event*4)&0xF)) == 0xA ) printf(" => (Send SYNC)\n"); if( ((data>>(event*4)&0xF)) == 0xB ) printf(" => (Check Trigger Type)\n"); } return 0; } //======================================================================== int Dump_CHDRO_ERROR_COUTNER(int verbose) { // // Dump the value from the benchmark module register // int branch; unsigned int data = 0; for(branch=0;branch<4;branch++){ if (rbm_read(get_Address_CHDRO_ERR_COUNTER(branch), &data, verbose)) { printf("ERROR: Could not read CHDRO_ERR_COUNTER\n"); return 1; } printf("CHDRO COUNTER (Branch %d)= 0x%X",branch, data); printf(" => %d\n", data); } return 0; } //======================================================================== int Dump_ESP_ERROR_COUTNER(int verbose) { // // Dump the value from the benchmark module register // int branch; unsigned int data = 0; for(branch=0;branch<4;branch++){ if (rbm_read(get_Address_ESP_ERR_COUNTER(branch), &data, verbose)) { printf("ERROR: Could not read ESP_ERR_COUNTER\n"); return 1; } printf("EVLRDO ERROR COUNTER (Branch %d)= 0x%X",branch, ((data>>20)&0x1FF)); printf(" => %d\n",((data>>20)&0x1FF) ); printf("SCEVL ERROR COUNTER (Branch %d)= 0x%X",branch, ((data>>10)&0x1FF) ); printf(" => %d\n", ((data>>10)&0x1FF)); printf("RPINC ERROR COUNTER (Branch %d)= 0x%X",branch, ((data>>0) & 0x1FF )); printf(" => %d\n", ((data>>0) & 0x1FF )); printf("-----------\n"); } return 0; } //======================================================================== int Dump_LAST_ERROR(int verbose) { // // Dump the value from the benchmark module register // int branch; unsigned int data = 0; for(branch=0;branch<4;branch++){ printf("LAST ERROR - Branch %d \n",branch); if (rbm_read(get_Address_CHDRO_LAST(branch), &data, verbose)) { printf("ERROR: Could not read ESP_ERR_COUNTER\n"); return 1; } if(data == 0){ printf("No LAST ERROR\n"); } else{ printf("Channel Adresse (CHDRO)= 0x%X \n", ((data>>0)&0x3FF)); printf("Transaction Error Type (CHDRO) = 0x%X \n", ((data>>11)&0xFF) ); printf("FEC Adresse (ELRDO) = 0x%X\n",((data>>20) & 0xF ) ); printf("Transsction Error Type (ELRDO)= 0x%X\n", ((data>>24) & 0xFF ) ); printf("----\n", data); } } return 0; } //======================================================================== int Dump_PAR_REQUEST(int verbose) { // // Dump the value from the PAR request register // unsigned int data = 0; if (rbm_read(get_Address_PAR_REQUEST(), &data, verbose)) { printf("ERROR: Could not read PAR_REQUEST\n"); return 1; } printf("PAR_REQUEST = 0x%X\n", data); if ( data &0x1) printf(" => Bit 0 -> ALTRO error occurred on any branch\n"); if ((data>>1)&0x1) printf(" => Bit 1 -> ALTRO status line stuck (ACK or DSTB or TRSF) on any branch\n"); if ((data>>2)&0x1) printf(" => Bit 2 -> ACK not asserted during write transaction (time-out) on any branch\n"); if ((data>>3)&0x1) printf(" => Bit 3 -> TRSF not asserted during CHRDO transaction (time-out) on any branch\n"); if ((data>>4)&0x1) printf(" => Bit 4 -> DSTB never asserted during CHDRO (no data received from ALTRO) on any branch\n"); return 0; } //======================================================================== int Dump_PAR_REQUEST_MASK_A(int verbose) { // // Dump the value from the PAR request mask register for branches AI and AO // unsigned int data = 0; if (rbm_read(get_Address_PAR_REQUEST_MASK_A(), &data, verbose)) { printf("ERROR: Could not read PAR_REQUEST_MASK_A\n"); return 1; } printf("PAR_REQUEST_MASK_A = 0x%X\n", data); printf("Active conditions in branch AI:\n"); if ( data &0x1) printf(" => Bit 0 (PAR request bit 2 -> Read transaction acknowledge not asserted on branch AI)\n"); if ((data>>1) &0x1) printf(" => Bit 1 (PAR request bit 2 -> Read transaction acknowledge not de-asserted on branch AI)\n"); if ((data>>2) &0x1) printf(" => Bit 2 (PAR request bit 2 -> Write transaction acknowledge not asserted on branch AI)\n"); if ((data>>3) &0x1) printf(" => Bit 3 (PAR request bit 2 -> Write transaction acknowledge not de-asserted on branch AI)\n"); if ((data>>4) &0x1) printf(" => Bit 4 (PAR request bit 2 -> Channel Readout transaction acknowledge not asserted on branch AI)\n"); if ((data>>5) &0x1) printf(" => Bit 5 (PAR request bit 2 -> Channel Readout transaction acknowledge not de-asserted on branch AI)\n"); if ((data>>6) &0x1) printf(" => Bit 6 (PAR request bit 3 -> Transfer line not asserted on branch AI)\n"); if ((data>>7) &0x1) printf(" => Bit 7 (PAR request bit 3 -> Transfer line not de-asserted on branch AI)\n"); if ((data>>8) &0x1) printf(" => Bit 8 (PAR request bit 4 -> DSTB never asserted during data transmission (no data from ALTRO) on branch AI)\n"); if ((data>>9) &0x1) printf(" => Bit 9 (PAR request bit 1 -> ALTRO ACK line stuck/asserted outside of transmission on branch AI)\n"); if ((data>>10)&0x1) printf(" => Bit 10 (PAR request bit 1 -> ALTRO TRSF line stuck/asserted outside of transmission on branch AI)\n"); if ((data>>11)&0x1) printf(" => Bit 11 (PAR request bit 1 -> ALTRO DSTB line stuck/asserted outside of transmission on branch AI)\n"); if ((data>>12)&0x1) printf(" => Bit 12 (PAR request bit 0 -> ALTRO ERROR line asserted on branch AI)\n"); printf("MASKED conditions in branch AI:\n"); if (!( data &0x1)) printf(" => Bit 0 (PAR request bit 2 -> Read transaction acknowledge not asserted on branch AI)\n"); if (!((data>>1) &0x1)) printf(" => Bit 1 (PAR request bit 2 -> Read transaction acknowledge not de-asserted on branch AI)\n"); if (!((data>>2) &0x1)) printf(" => Bit 2 (PAR request bit 2 -> Write transaction acknowledge not asserted on branch AI)\n"); if (!((data>>3) &0x1)) printf(" => Bit 3 (PAR request bit 2 -> Write transaction acknowledge not de-asserted on branch AI)\n"); if (!((data>>4) &0x1)) printf(" => Bit 4 (PAR request bit 2 -> Channel Readout transaction acknowledge not asserted on branch AI)\n"); if (!((data>>5) &0x1)) printf(" => Bit 5 (PAR request bit 2 -> Channel Readout transaction acknowledge not de-asserted on branch AI)\n"); if (!((data>>6) &0x1)) printf(" => Bit 6 (PAR request bit 3 -> Transfer line not asserted on branch AI)\n"); if (!((data>>7) &0x1)) printf(" => Bit 7 (PAR request bit 3 -> Transfer line not de-asserted on branch AI)\n"); if (!((data>>8) &0x1)) printf(" => Bit 8 (PAR request bit 4 -> DSTB never asserted during data transmission (no data from ALTRO) on branch AI)\n"); if (!((data>>9) &0x1)) printf(" => Bit 9 (PAR request bit 1 -> ALTRO ACK line stuck/asserted outside of transmission on branch AI)\n"); if (!((data>>10)&0x1)) printf(" => Bit 10 (PAR request bit 1 -> ALTRO TRSF line stuck/asserted outside of transmission on branch AI)\n"); if (!((data>>11)&0x1)) printf(" => Bit 11 (PAR request bit 1 -> ALTRO DSTB line stuck/asserted outside of transmission on branch AI)\n"); if (!((data>>12)&0x1)) printf(" => Bit 12 (PAR request bit 0 -> ALTRO ERROR line asserted on branch AI)\n"); // printf("Active conditions in branch AO:\n"); if ((data>>16)&0x1) printf(" => Bit 0 (PAR request bit 2 -> Read transaction acknowledge not asserted on branch AO)\n"); if ((data>>17) &0x1) printf(" => Bit 1 (PAR request bit 2 -> Read transaction acknowledge not de-asserted on branch AO)\n"); if ((data>>18) &0x1) printf(" => Bit 2 (PAR request bit 2 -> Write transaction acknowledge not asserted on branch AO)\n"); if ((data>>19) &0x1) printf(" => Bit 3 (PAR request bit 2 -> Write transaction acknowledge not de-asserted on branch AO)\n"); if ((data>>20) &0x1) printf(" => Bit 4 (PAR request bit 2 -> Channel Readout transaction acknowledge not asserted on branch AO)\n"); if ((data>>21) &0x1) printf(" => Bit 5 (PAR request bit 2 -> Channel Readout transaction acknowledge not de-asserted on branch AO)\n"); if ((data>>22) &0x1) printf(" => Bit 6 (PAR request bit 3 -> Transfer line not asserted on branch AO)\n"); if ((data>>23) &0x1) printf(" => Bit 7 (PAR request bit 3 -> Transfer line not de-asserted on branch AO)\n"); if ((data>>24) &0x1) printf(" => Bit 8 (PAR request bit 4 -> DSTB never asserted during data transmission (no data from ALTRO) on branch AO)\n"); if ((data>>25) &0x1) printf(" => Bit 9 (PAR request bit 1 -> ALTRO ACK line stuck/asserted outside of transmission on branch AO)\n"); if ((data>>26)&0x1) printf(" => Bit 10 (PAR request bit 1 -> ALTRO TRSF line stuck/asserted outside of transmission on branch AO)\n"); if ((data>>27)&0x1) printf(" => Bit 11 (PAR request bit 1 -> ALTRO DSTB line stuck/asserted outside of transmission on branch AO)\n"); if ((data>>28)&0x1) printf(" => Bit 12 (PAR request bit 0 -> ALTRO ERROR line asserted on branch AO)\n"); printf("MASKED conditions in branch AO:\n"); if (!((data>>16)&0x1)) printf(" => Bit 0 (PAR request bit 2 -> Read transaction acknowledge not asserted on branch AO)\n"); if (!((data>>17)&0x1)) printf(" => Bit 1 (PAR request bit 2 -> Read transaction acknowledge not de-asserted on branch AO)\n"); if (!((data>>18)&0x1)) printf(" => Bit 2 (PAR request bit 2 -> Write transaction acknowledge not asserted on branch AO)\n"); if (!((data>>19)&0x1)) printf(" => Bit 3 (PAR request bit 2 -> Write transaction acknowledge not de-asserted on branch AO)\n"); if (!((data>>20)&0x1)) printf(" => Bit 4 (PAR request bit 2 -> Channel Readout transaction acknowledge not asserted on branch AO)\n"); if (!((data>>21)&0x1)) printf(" => Bit 5 (PAR request bit 2 -> Channel Readout transaction acknowledge not de-asserted on branch AO)\n"); if (!((data>>22)&0x1)) printf(" => Bit 6 (PAR request bit 3 -> Transfer line not asserted on branch AO)\n"); if (!((data>>23)&0x1)) printf(" => Bit 7 (PAR request bit 3 -> Transfer line not de-asserted on branch AO)\n"); if (!((data>>24)&0x1)) printf(" => Bit 8 (PAR request bit 4 -> DSTB never asserted during data transmission (no data from ALTRO) on branch AO)\n"); if (!((data>>25)&0x1)) printf(" => Bit 9 (PAR request bit 1 -> ALTRO ACK line stuck/asserted outside of transmission on branch AO)\n"); if (!((data>>26)&0x1)) printf(" => Bit 10 (PAR request bit 1 -> ALTRO TRSF line stuck/asserted outside of transmission on branch AO)\n"); if (!((data>>27)&0x1)) printf(" => Bit 11 (PAR request bit 1 -> ALTRO DSTB line stuck/asserted outside of transmission on branch AO)\n"); if (!((data>>28)&0x1)) printf(" => Bit 12 (PAR request bit 0 -> ALTRO ERROR line asserted on branch AO)\n"); return 0; } //======================================================================== int Dump_PAR_REQUEST_MASK_B(int verbose) { // // Dump the value from the PAR request mask register for branches BI and BO // unsigned int data = 0; if (rbm_read(get_Address_PAR_REQUEST_MASK_B(), &data, verbose)) { printf("ERROR: Could not read PAR_REQUEST_MASK_B\n"); return 1; } printf("PAR_REQUEST_MASK_B = 0x%X\n", data); printf("Active conditions in branch BI:\n"); if ( data &0x1) printf(" => Bit 0 (PAR request bit 2 -> Read transaction acknowledge not asserted on branch BI)\n"); if ((data>>1) &0x1) printf(" => Bit 1 (PAR request bit 2 -> Read transaction acknowledge not de-asserted on branch BI)\n"); if ((data>>2) &0x1) printf(" => Bit 2 (PAR request bit 2 -> Write transaction acknowledge not asserted on branch BI)\n"); if ((data>>3) &0x1) printf(" => Bit 3 (PAR request bit 2 -> Write transaction acknowledge not de-asserted on branch BI)\n"); if ((data>>4) &0x1) printf(" => Bit 4 (PAR request bit 2 -> Channel Readout transaction acknowledge not asserted on branch BI)\n"); if ((data>>5) &0x1) printf(" => Bit 5 (PAR request bit 2 -> Channel Readout transaction acknowledge not de-asserted on branch BI)\n"); if ((data>>6) &0x1) printf(" => Bit 6 (PAR request bit 3 -> Transfer line not asserted on branch BI)\n"); if ((data>>7) &0x1) printf(" => Bit 7 (PAR request bit 3 -> Transfer line not de-asserted on branch BI)\n"); if ((data>>8) &0x1) printf(" => Bit 8 (PAR request bit 4 -> DSTB never asserted during data transmission (no data from ALTRO) on branch BI)\n"); if ((data>>9) &0x1) printf(" => Bit 9 (PAR request bit 1 -> ALTRO ACK line stuck/asserted outside of transmission on branch BI)\n"); if ((data>>10)&0x1) printf(" => Bit 10 (PAR request bit 1 -> ALTRO TRSF line stuck/asserted outside of transmission on branch BI)\n"); if ((data>>11)&0x1) printf(" => Bit 11 (PAR request bit 1 -> ALTRO DSTB line stuck/asserted outside of transmission on branch BI)\n"); if ((data>>12)&0x1) printf(" => Bit 12 (PAR request bit 0 -> ALTRO ERROR line asserted on branch BI)\n"); printf("MASKED conditions in branch BI:\n"); if (!( data &0x1)) printf(" => Bit 0 (PAR request bit 2 -> Read transaction acknowledge not asserted on branch BI)\n"); if (!((data>>1) &0x1)) printf(" => Bit 1 (PAR request bit 2 -> Read transaction acknowledge not de-asserted on branch BI)\n"); if (!((data>>2) &0x1)) printf(" => Bit 2 (PAR request bit 2 -> Write transaction acknowledge not asserted on branch BI)\n"); if (!((data>>3) &0x1)) printf(" => Bit 3 (PAR request bit 2 -> Write transaction acknowledge not de-asserted on branch BI)\n"); if (!((data>>4) &0x1)) printf(" => Bit 4 (PAR request bit 2 -> Channel Readout transaction acknowledge not asserted on branch BI)\n"); if (!((data>>5) &0x1)) printf(" => Bit 5 (PAR request bit 2 -> Channel Readout transaction acknowledge not de-asserted on branch BI)\n"); if (!((data>>6) &0x1)) printf(" => Bit 6 (PAR request bit 3 -> Transfer line not asserted on branch BI)\n"); if (!((data>>7) &0x1)) printf(" => Bit 7 (PAR request bit 3 -> Transfer line not de-asserted on branch BI)\n"); if (!((data>>8) &0x1)) printf(" => Bit 8 (PAR request bit 4 -> DSTB never asserted during data transmission (no data from ALTRO) on branch BI)\n"); if (!((data>>9) &0x1)) printf(" => Bit 9 (PAR request bit 1 -> ALTRO ACK line stuck/asserted outside of transmission on branch BI)\n"); if (!((data>>10)&0x1)) printf(" => Bit 10 (PAR request bit 1 -> ALTRO TRSF line stuck/asserted outside of transmission on branch BI)\n"); if (!((data>>11)&0x1)) printf(" => Bit 11 (PAR request bit 1 -> ALTRO DSTB line stuck/asserted outside of transmission on branch BI)\n"); if (!((data>>12)&0x1)) printf(" => Bit 12 (PAR request bit 0 -> ALTRO ERROR line asserted on branch AI)\n"); // printf("Active conditions in branch BO:\n"); if ((data>>16)&0x1) printf(" => Bit 0 (PAR request bit 2 -> Read transaction acknowledge not asserted on branch BO)\n"); if ((data>>17) &0x1) printf(" => Bit 1 (PAR request bit 2 -> Read transaction acknowledge not de-asserted on branch BO)\n"); if ((data>>18) &0x1) printf(" => Bit 2 (PAR request bit 2 -> Write transaction acknowledge not asserted on branch BO)\n"); if ((data>>19) &0x1) printf(" => Bit 3 (PAR request bit 2 -> Write transaction acknowledge not de-asserted on branch BO)\n"); if ((data>>20) &0x1) printf(" => Bit 4 (PAR request bit 2 -> Channel Readout transaction acknowledge not asserted on branch BO)\n"); if ((data>>21) &0x1) printf(" => Bit 5 (PAR request bit 2 -> Channel Readout transaction acknowledge not de-asserted on branch BO)\n"); if ((data>>22) &0x1) printf(" => Bit 6 (PAR request bit 3 -> Transfer line not asserted on branch BO)\n"); if ((data>>23) &0x1) printf(" => Bit 7 (PAR request bit 3 -> Transfer line not de-asserted on branch BO)\n"); if ((data>>24) &0x1) printf(" => Bit 8 (PAR request bit 4 -> DSTB never asserted during data transmission (no data from ALTRO) on branch BO)\n"); if ((data>>25) &0x1) printf(" => Bit 9 (PAR request bit 1 -> ALTRO ACK line stuck/asserted outside of transmission on branch BO)\n"); if ((data>>26)&0x1) printf(" => Bit 10 (PAR request bit 1 -> ALTRO TRSF line stuck/asserted outside of transmission on branch BO)\n"); if ((data>>27)&0x1) printf(" => Bit 11 (PAR request bit 1 -> ALTRO DSTB line stuck/asserted outside of transmission on branch BO)\n"); if ((data>>28)&0x1) printf(" => Bit 12 (PAR request bit 0 -> ALTRO ERROR line asserted on branch BO)\n"); printf("MASKED conditions in branch BO:\n"); if (!((data>>16)&0x1)) printf(" => Bit 0 (PAR request bit 2 -> Read transaction acknowledge not asserted on branch BO)\n"); if (!((data>>17)&0x1)) printf(" => Bit 1 (PAR request bit 2 -> Read transaction acknowledge not de-asserted on branch BO)\n"); if (!((data>>18)&0x1)) printf(" => Bit 2 (PAR request bit 2 -> Write transaction acknowledge not asserted on branch BO)\n"); if (!((data>>19)&0x1)) printf(" => Bit 3 (PAR request bit 2 -> Write transaction acknowledge not de-asserted on branch BO)\n"); if (!((data>>20)&0x1)) printf(" => Bit 4 (PAR request bit 2 -> Channel Readout transaction acknowledge not asserted on branch BO)\n"); if (!((data>>21)&0x1)) printf(" => Bit 5 (PAR request bit 2 -> Channel Readout transaction acknowledge not de-asserted on branch BO)\n"); if (!((data>>22)&0x1)) printf(" => Bit 6 (PAR request bit 3 -> Transfer line not asserted on branch BO)\n"); if (!((data>>23)&0x1)) printf(" => Bit 7 (PAR request bit 3 -> Transfer line not de-asserted on branch BO)\n"); if (!((data>>24)&0x1)) printf(" => Bit 8 (PAR request bit 4 -> DSTB never asserted during data transmission (no data from ALTRO) on branch BO)\n"); if (!((data>>25)&0x1)) printf(" => Bit 9 (PAR request bit 1 -> ALTRO ACK line stuck/asserted outside of transmission on branch BO)\n"); if (!((data>>26)&0x1)) printf(" => Bit 10 (PAR request bit 1 -> ALTRO TRSF line stuck/asserted outside of transmission on branch BO)\n"); if (!((data>>27)&0x1)) printf(" => Bit 11 (PAR request bit 1 -> ALTRO DSTB line stuck/asserted outside of transmission on branch BO)\n"); if (!((data>>28)&0x1)) printf(" => Bit 12 (PAR request bit 0 -> ALTRO ERROR line asserted on branch AO)\n"); return 0; } //======================================================================== //======================================================================== // Dump TTC register content //======================================================================== //======================================================================== //======================================================================== int Dump_TTC_CONTROL(int verbose) { // // Dump the Control Register of the Trigger receive module // unsigned int data = 0; if (rbm_read(get_Address_TTC_CONTROL(), &data, verbose)) { printf("ERROR: Could not read TTC_CONTROL\n"); return 1; } printf("TTC_CONTROL = 0x%X\n", data); printf(" => Bit 0 (Channel A and B input enable) = %u\n", data&0x1); printf(" => Bit 1 (Enable masking of illegal triggers) = %u\n", (data>>1)&0x1); printf(" => Bit 3..2 (Sampling CLK frequency) = %u", (data>>2)&0x3); if ( ((data>>2)&0x3) == 0 ) printf(" => 10 MHz\n"); else if ( ((data>>2)&0x3) == 1 ) printf(" => 2.5 MHz\n"); else if ( ((data>>2)&0x3) == 2 ) printf(" => 5 MHz\n"); else if ( ((data>>2)&0x3) == 3 ) printf(" => 20 MHz\n"); printf(" => Bit 4 (Generate CDH on L2r) = %u\n", (data>>4)&0x1); printf(" => Bit 5 (Generate CDH on L2 timeout) = %u\n", (data>>5)&0x1); return 0; } //======================================================================== int Dump_TTC_STATUS(int verbose) { // // Dump the General Status register of Trigger receive module // unsigned int data = 0; if (rbm_read(get_Address_TTC_STATUS(), &data, verbose)) { printf("ERROR: Could not read TTC_STATUS\n"); return 1; } printf("TTC_STATUS = 0x%X\n", data); printf(" => Bit 0 (Bunchcount Overflow) = %u\n", data&0x1); printf(" => Bit 1 (Run active) = %u\n", (data>>1)&0x1); printf(" => Bit 2 (Trigger receiver Busy) = %u\n", (data>>2)&0x1); printf(" => Bit 3 (TTC Ready) = %u\n", (data>>3)&0x1); printf(" => Bit 7..4 (Buffered Events) = %u\n", (data>>4)&0xF); printf(" => Bit 11..8 (CDH Version) = %u\n", (data>>8)&0xF); printf(" => Bit 23..16 (Module Version) = 0x%X\n", (data>>16)&0xFF); return 0; } //======================================================================== int Dump_TTC_L1_LATENCY(int verbose) { // // Dump the acceptable delay region from L0 to L1 // unsigned int data = 0; if (rbm_read(get_Address_TTC_L1_LATENCY(), &data, verbose)) { printf("ERROR: Could not read TTC_L1_LATENCY\n"); return 1; } printf("TTC_L1_LATENCY = 0x%X\n", data); printf(" => Bit 11..0 (Accepted latency L0 -> L1 in clock cycles) = 0x%X\n", data&0xFFF); printf(" => Bit 15..12 (Uncertainty window in clock cycles) = %u\n", (data>>12)&0xF); return 0; } //======================================================================== int Dump_TTC_L2_LATENCY(int verbose) { // // Dump the acceptable delay region from L0 to L2 // unsigned int data = 0; if (rbm_read(get_Address_TTC_L2_LATENCY(), &data, verbose)) { printf("ERROR: Could not read TTC_L2_LATENCY\n"); return 1; } printf("TTC_L2_LATENCY = 0x%X\n", data); printf(" => Bit 15..0 (Min clock cycles from L0 to L2) = 0x%X\n", data&0xFFFF); printf(" => Bit 31..16 (Max clock cycles from L0 to L2) = 0x%X\n", (data>>16)&0xFFFF); return 0; } //======================================================================== int Dump_TTC_L1_MSG_LATENCY(int verbose) { // // Dump the acceptable delay region from L0 to L1 message // unsigned int data = 0; if (rbm_read(get_Address_TTC_L1_MSG_LATENCY(), &data, verbose)) { printf("ERROR: Could not read TTC_L1_MSG_LATENCY\n"); return 1; } printf("TTC_L1_MSG_LATENCY = 0x%X\n", data); printf(" => Bit 15..0 (Min clock cycles from L0 to L1 msg) = 0x%X\n", data&0xFFFF); printf(" => Bit 31..16 (Max clock cycles from L0 to L1 msg) = 0x%X\n", (data>>16)&0xFFFF); return 0; } //======================================================================== int Dump_TTC_HAMMING_ERR_CTR(int verbose) { // // Dump the hamming error counters // unsigned int data = 0; if (rbm_read(get_Address_TTC_HAMMING_ERR_CTR(), &data, verbose)) { printf("ERROR: Could not read TTC_HAMMING_ERR_CTR\n"); return 1; } printf("TTC_HAMMING_ERR_CTR = 0x%X\n", data); printf(" => Bit 15..0 (Single Hamming Error Counter) = %u\n", data&0xFFFF); printf(" => Bit 31..16 (Double Hamming Error Counter) = %u\n", (data>>16)&0xFFFF); return 0; } //======================================================================== int Dump_TTC_SEQUENCE_ERR_CTR(int verbose) { // // Dump the sequence error counters // unsigned int data = 0; if (rbm_read(get_Address_TTC_SEQUENCE_ERR_CTR(), &data, verbose)) { printf("ERROR: Could not read TTC_SEQUENCE_ERR_CTR\n"); return 1; } printf("TTC_SEQUENCE_ERR_CTR = 0x%X\n", data); printf(" => Bit 15..0 (Number of message decoding errors) = %u\n", data&0xFFFF); printf(" => Bit 31..16 (Num of sequence and timeout errors) = %u\n", (data>>16)&0xFFFF); return 0; } //======================================================================== int Dump_TTC_EVENT_INFO(int verbose) { // // Dump the TTC event info for the last received sequence // unsigned int data = 0; if (rbm_read(get_Address_TTC_EVENT_INFO(), &data, verbose)) { printf("ERROR: Could not read TTC_EVENT_INFO\n"); return 1; } printf("TTC_EVENT_INFO = 0x%X\n", data); printf(" => Bit 0 (RoI announced (ESR)) = %u\n", data&0x1); printf(" => Bit 1 (Software trigger) = %u\n", (data>>1) &0x1); printf(" => Bit 2 (Calibration trigger) = %u\n", (data>>2) &0x1); printf(" => Bit 7..4 (RoC - software trigger type) = %u\n", (data>>4) &0xF); printf(" => Bit 8 (Event has L2R) = %u\n", (data>>8) &0x1); printf(" => Bit 9 (Event has L2A) = %u\n", (data>>9) &0x1); printf(" => Bit 10 (Include payload) = %u\n", (data>>10)&0x1); printf(" => Bit 15..12 (SCLK phase upon L1a trigger) = 0x%X\n", (data>>12)&0xF); printf(" => Bit 19..16 (Num of words in Event (0xB)) = 0x%X\n", (data>>16)&0xF); printf(" => Bit 31..20 (Identifier (0xA95)) = 0x%X\n", (data>>20)&0xFFF); return 0; } //======================================================================== int Dump_TTC_EVENT_ERROR(int verbose) { // // Dump the TTC errors for the last received sequence // unsigned int data = 0; if (rbm_read(get_Address_TTC_EVENT_ERROR(), &data, verbose)) { printf("ERROR: Could not read TTC_EVENT_ERROR\n"); return 1; } printf("TTC_EVENT_ERROR = 0x%X\n", data); printf(" => Bit 0 (Channel B stop bit error) = %u\n", data&0x1); printf(" => Bit 1 (Single Hamming error, addressed message) = %u\n", (data>>1) &0x1); printf(" => Bit 2 (Double Hamming error, addressed message) = %u\n", (data>>2) &0x1); printf(" => Bit 3 (Single Hamming error, broadcast message) = %u\n", (data>>3) &0x1); printf(" => Bit 4 (Double Hamming error, broadcast message) = %u\n", (data>>4) &0x1); printf(" => Bit 5 (Unknown message address) = %u\n", (data>>5) &0x1); printf(" => Bit 6 (Incomplete L1 message) = %u\n", (data>>6) &0x1); printf(" => Bit 7 (Incomplete L2A message) = %u\n", (data>>7) &0x1); printf(" => Bit 9 (TTCrx address error) = %u\n", (data>>9) &0x1); printf(" => Bit 10 (L1 message content error) = %u\n", (data>>10)&0x1); printf(" => Bit 11 (L2 message content error) = %u\n", (data>>11)&0x1); printf(" => Bit 12 (Spurious L0) = %u\n", (data>>12)&0x1); printf(" => Bit 13 (Missing L0) = %u\n", (data>>13)&0x1); printf(" => Bit 14 (Spurious L1) = %u\n", (data>>14)&0x1); printf(" => Bit 15 (Boundary L1) = %u\n", (data>>15)&0x1); printf(" => Bit 16 (Missing L1) = %u\n", (data>>16)&0x1); printf(" => Bit 17 (Spurious L1 message) = %u\n", (data>>17)&0x1); printf(" => Bit 18 (Missing L1 message) = %u\n", (data>>18)&0x1); printf(" => Bit 19 (Spurious L2 message) = %u\n", (data>>19)&0x1); printf(" => Bit 20 (Missing L2 message) = %u\n", (data>>20)&0x1); return 0; } #endif // RCU2_FUNCTIONS_H