From 117637863d5919a95fe5836b12fa4c9d10167b28 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 18 Feb 2025 11:30:51 +0100 Subject: [PATCH] Xilinxctb/update reg (#1084) * updated RegisterDefs.h from firmware update * Revert "updated RegisterDefs.h from firmware update" This reverts commit 64f1b2546e742f0b0513124a599cd9bcde11760c. * updated registers and had it formatted * Revert "updated registers and had it formatted" This reverts commit 1641b705b0d8616bcff4a5cd796d8796d09391f2. * udpated registers from firmware, reading config file in server (chip config, reset chip, enable_clock_pattern) specific for matterhorn,this is done when powering on chip, removed startreadout, fixed status register bits, updated firmware version * fix for patioctrl allowed for zxilinx and adding readout pattern for scientists that like to push the acquire button * fixing default enable clock and readout pattern for xilinx (patioctrl has to be 32 bit) * Xilinxctb/first image (#1094) * reduce xilinxCTB readout done checks to single register, increased clockEna pattern limits, clear FPGA FiFos and counters on powerchip, disable counters 1-3 in matterhorn configuration * change print of xilinxctb server * remove acquisition done check --------- Co-authored-by: Martin Mueller * binary xilinx in * formatting * added reset of udp buffer FIFO to xilinxCTB --------- Co-authored-by: Martin Mueller <72937414+mmarti04@users.noreply.github.com> Co-authored-by: Martin Mueller --- .../include/slsDetectorFunctionList.h | 5 +- .../slsDetectorServer/src/loadPattern.c | 8 +- .../src/slsDetectorServer_funcs.c | 3 +- .../xilinx_ctbDetectorServer/CMakeLists.txt | 6 + .../xilinx_ctbDetectorServer/Makefile | 4 + .../xilinx_ctbDetectorServer/RegisterDefs.h | 79 +++- .../bin/xilinx_ctbDetectorServer_developer | Bin 304856 -> 304856 bytes .../chip_config_xilinx.txt | 24 ++ .../enable_clock_pattern.pyat | 8 + .../readout_pattern.pyat | 22 ++ .../reset_chip_xilinx.txt | 40 ++ .../slsDetectorFunctionList.c | 345 ++++++++++++------ .../slsDetectorServer_defs.h | 5 +- slsSupportLib/include/sls/versionAPI.h | 2 +- 14 files changed, 402 insertions(+), 149 deletions(-) create mode 100644 slsDetectorServers/xilinx_ctbDetectorServer/chip_config_xilinx.txt create mode 100644 slsDetectorServers/xilinx_ctbDetectorServer/enable_clock_pattern.pyat create mode 100644 slsDetectorServers/xilinx_ctbDetectorServer/readout_pattern.pyat create mode 100644 slsDetectorServers/xilinx_ctbDetectorServer/reset_chip_xilinx.txt diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index ee7182f16..cc4d43934 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -197,6 +197,8 @@ int isChipConfigured(); int powerChip(int on, char *mess); int getPowerChip(); int configureChip(char *mess); +int readConfigFile(char *mess, char *fileName, char *fileType); +int resetChip(char *mess); #endif #if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) || \ defined(MYTHEN3D) || defined(GOTTHARD2D) @@ -742,8 +744,7 @@ int softwareTrigger(); #if defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD) int softwareTrigger(int block); #endif -#if defined(EIGERD) || defined(MYTHEN3D) || defined(CHIPTESTBOARDD) || \ - defined(XILINX_CHIPTESTBOARDD) +#if defined(EIGERD) || defined(MYTHEN3D) || defined(CHIPTESTBOARDD) int startReadOut(); #endif enum runStatus getRunStatus(); diff --git a/slsDetectorServers/slsDetectorServer/src/loadPattern.c b/slsDetectorServers/slsDetectorServer/src/loadPattern.c index 6065d0076..90ef5b6d4 100644 --- a/slsDetectorServers/slsDetectorServer/src/loadPattern.c +++ b/slsDetectorServers/slsDetectorServer/src/loadPattern.c @@ -853,7 +853,7 @@ int loadPattern(char *message, enum TLogLevel printLevel, } } // iocontrol -#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) // TODO +#if !defined(MYTHEN3D) if (ret == OK) { ret = validate_writePatternIOControl(message, pat->ioctrl); } @@ -914,7 +914,7 @@ int getPattern(char *message, patternParameters *pat) { pat->word[i] = retval64; } // iocontrol -#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) // TODO +#if !defined(MYTHEN3D) if (ret == OK) { validate_readPatternIOControl(); } @@ -1051,12 +1051,12 @@ int loadPatternFile(char *patFname, char *errMessage) { } // patioctrl -#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) // TODO +#if !defined(MYTHEN3D) // TODO if (!strncmp(line, "patioctrl", strlen("patioctrl"))) { uint64_t arg = 0; // cannot scan values -#ifdef VIRTUAL +#if defined(VIRTUAL) || defined(XILINX_CHIPTESTBOARDD) if (sscanf(line, "%s 0x%lx", command, &arg) != 2) { #else if (sscanf(line, "%s 0x%llx", command, &arg) != 2) { diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 9d133f7f4..94657697f 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -8467,8 +8467,7 @@ int get_bursts_left(int file_des) { int start_readout(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); -#if !defined(MYTHEN3D) && !defined(CHIPTESTBOARDD) && \ - !defined(XILINX_CHIPTESTBOARDD) +#if !defined(MYTHEN3D) && !defined(CHIPTESTBOARDD) functionNotImplemented(); #else if (Server_VerifyLock() == OK) { diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt b/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt index 78a5fbfb7..db081528a 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt +++ b/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt @@ -40,3 +40,9 @@ set_target_properties(xilinx_ctbDetectorServer_virtual PROPERTIES install(TARGETS xilinx_ctbDetectorServer_virtual RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +configure_file(chip_config_xilinx.txt ${CMAKE_BINARY_DIR}/bin/chip_config_xilinx.txt COPYONLY) +configure_file(reset_chip_xilinx.txt ${CMAKE_BINARY_DIR}/bin/reset_chip_xilinx.txt COPYONLY) +configure_file(enable_clock_pattern.pyat ${CMAKE_BINARY_DIR}/bin/enable_clock_pattern.pyat COPYONLY) +configure_file(readout_pattern.pyat ${CMAKE_BINARY_DIR}/bin/readout_pattern.pyat COPYONLY) + diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/Makefile b/slsDetectorServers/xilinx_ctbDetectorServer/Makefile index c271efdfe..59cf0fe37 100755 --- a/slsDetectorServers/xilinx_ctbDetectorServer/Makefile +++ b/slsDetectorServers/xilinx_ctbDetectorServer/Makefile @@ -48,6 +48,10 @@ $(PROGS): $(OBJS) mkdir -p $(DESTDIR) $(CC) -o $@ $^ $(CFLAGS) $(LDLIBS) mv $(PROGS) $(DESTDIR) + cp chip_config_xilinx.txt $(DESTDIR) + cp reset_chip_xilinx.txt $(DESTDIR) + cp enable_clock_pattern.pyat $(DESTDIR) + cp readout_pattern.pyat $(DESTDIR) rm $(main_src)*.o $(md5_dir)*.o clean: rm -rf $(DESTDIR)/$(PROGS) *.o *.gdb $(main_src)*.o $(md5_dir)*.o diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h b/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h index 3563a8b82..6059d1e8f 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h +++ b/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h @@ -17,12 +17,24 @@ #define EMPTY4REG (0x4) -#define STATUSREG1 (0x8) +#define STATUS_REG (0x8) -#define TRANSMISSIONBUSY_OFST (0) -#define TRANSMISSIONBUSY_MSK (0x00000001 << TRANSMISSIONBUSY_OFST) +#define PATTERN_RUNNING_OFST (0) +#define PATTERN_RUNNING_MSK (0x00000001 << PATTERN_RUNNING_OFST) +#define RX_BUSY_OFST (1) +#define RX_BUSY_MSK (0x00000001 << RX_BUSY_OFST) +#define PROCESSING_BUSY_OFST (2) +#define PROCESSING_BUSY_MSK (0x00000001 << PROCESSING_BUSY_OFST) +#define UDP_GEN_BUSY_OFST (3) +#define UDP_GEN_BUSY_MSK (0x00000001 << UDP_GEN_BUSY_OFST) +#define NETWORK_BUSY_OFST (4) +#define NETWORK_BUSY_MSK (0x00000001 << NETWORK_BUSY_OFST) +#define WAIT_FOR_TRIGGER_OFST (5) +#define WAIT_FOR_TRIGGER_MSK (0x00000001 << WAIT_FOR_TRIGGER_OFST) +#define RX_NOT_GOOD_OFST (6) +#define RX_NOT_GOOD_MSK (0x00000001 << RX_NOT_GOOD_OFST) -#define STATUSREG2 (0xC) +#define STATUS_REG2 (0xC) #define FPGAVERSIONREG (0x10) @@ -31,7 +43,7 @@ #define FPGADETTYPE_OFST (24) #define FPGADETTYPE_MSK (0x000000ff << FPGADETTYPE_OFST) -#define EMPTY14REG (0x14) +#define FPGA_GIT_HEAD (0x14) #define FIXEDPATTERNREG (0x18) #define FIXEDPATTERNVAL (0xACDC2016) @@ -889,7 +901,10 @@ #define GTTPOWERGOOD_OFST (26) #define GTTPOWERGOOD_MSK (0x0000000f << GTTPOWERGOOD_OFST) -#define EMPTY654REG (0x654) +#define TRANSCEIVERSTATUS2 (0x654) + +#define RXLOCKED_OFST (0) +#define RXLOCKED_MSK (0x0000000f << RXLOCKED_OFST) #define TRANSCEIVERCONTROL (0x658) @@ -905,30 +920,58 @@ #define RESETRXDATAPATHIN_MSK (0x00000001 << RESETRXDATAPATHIN_OFST) #define RXPOLARITY_OFST (5) #define RXPOLARITY_MSK (0x0000000f << RXPOLARITY_OFST) +#define RXERRORCNTRESET_OFST (9) +#define RXERRORCNTRESET_MSK (0x0000000f << RXERRORCNTRESET_OFST) +#define RXMSBLSBINVERT_OFST (13) +#define RXMSBLSBINVERT_MSK (0x0000000f << RXMSBLSBINVERT_OFST) -#define EMPTY65CREG (0x65C) +#define TRANSCEIVERERRCNT_REG0 (0x65C) -#define EMPTY660REG (0x660) +#define TRANSCEIVERERRCNT_REG1 (0x660) -#define EMPTY664REG (0x664) +#define TRANSCEIVERERRCNT_REG2 (0x664) -#define EMPTY668REG (0x668) +#define TRANSCEIVERERRCNT_REG3 (0x668) -#define EMPTY66CREG (0x66C) +#define TRANSCEIVERALIGNCNT_REG0 (0x66C) -#define EMPTY670REG (0x670) +#define RXALIGNCNTCH0_OFST (0) +#define RXALIGNCNTCH0_MSK (0x0000ffff << RXALIGNCNTCH0_OFST) -#define EMPTY674REG (0x674) +#define TRANSCEIVERALIGNCNT_REG1 (0x670) -#define EMPTY678REG (0x678) +#define RXALIGNCNTCH1_OFST (0) +#define RXALIGNCNTCH1_MSK (0x0000ffff << RXALIGNCNTCH1_OFST) -#define EMPTY67CREG (0x67C) +#define TRANSCEIVERALIGNCNT_REG2 (0x674) -#define EMPTY680REG (0x680) +#define RXALIGNCNTCH2_OFST (0) +#define RXALIGNCNTCH2_MSK (0x0000ffff << RXALIGNCNTCH2_OFST) -#define EMPTY684REG (0x684) +#define TRANSCEIVERALIGNCNT_REG3 (0x678) -#define EMPTY688REG (0x688) +#define RXALIGNCNTCH3_OFST (0) +#define RXALIGNCNTCH3_MSK (0x0000ffff << RXALIGNCNTCH3_OFST) + +#define TRANSCEIVERLASTWORD_REG0 (0x67C) + +#define RXDATACH0_OFST (0) +#define RXDATACH0_MSK (0x0000ffff << RXDATACH0_OFST) + +#define TRANSCEIVERLASTWORD_REG1 (0x680) + +#define RXDATACH1_OFST (0) +#define RXDATACH1_MSK (0x0000ffff << RXDATACH1_OFST) + +#define TRANSCEIVERLASTWORD_REG2 (0x684) + +#define RXDATACH2_OFST (0) +#define RXDATACH2_MSK (0x0000ffff << RXDATACH2_OFST) + +#define TRANSCEIVERLASTWORD_REG3 (0x688) + +#define RXDATACH3_OFST (0) +#define RXDATACH3_MSK (0x0000ffff << RXDATACH3_OFST) #define EMPTY68CREG (0x68C) diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer b/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer index 15bb18072ddb6342aac3e005bc82fcf86a230451..2617952ecfccf01d22a5ea1aa6911bd87004acc6 100755 GIT binary patch delta 87787 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 delta 85739 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 R&v{~xJ4Tk7gL~X#{|AJQ9ykC1 diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/chip_config_xilinx.txt b/slsDetectorServers/xilinx_ctbDetectorServer/chip_config_xilinx.txt new file mode 100644 index 000000000..0aac43aad --- /dev/null +++ b/slsDetectorServers/xilinx_ctbDetectorServer/chip_config_xilinx.txt @@ -0,0 +1,24 @@ +# Prepare MH02 configuration +reg 0x600 0x00000041 +reg 0x604 0x01200004 + +# configure Matterhorn SPI +setbit 0x608 0 + +# wait till config is done +pollbit 0x608 3 0 + +# reset transceiver +reg 0x658 0x0 +reg 0x658 0x1 +reg 0x658 0x0 + +# set MSB LSB inversions and polarity for transceiver +reg 0x658 0x61e0 + +# Enable MH02 PLL clock +patternX enable_clock_pattern.pyat +# start the flow +setbit 0x108 0 +clearbit 0x108 0 +sleep 1 diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/enable_clock_pattern.pyat b/slsDetectorServers/xilinx_ctbDetectorServer/enable_clock_pattern.pyat new file mode 100644 index 000000000..debfbbd27 --- /dev/null +++ b/slsDetectorServers/xilinx_ctbDetectorServer/enable_clock_pattern.pyat @@ -0,0 +1,8 @@ +patword 0x0000 0x0000000000000000 +patword 0x0001 0x0000000000008000 +patword 0x0002 0x0000000000008000 +patword 0x0003 0x0000000000008000 +patword 0x0004 0x0000000000008000 +patword 0x0005 0x0000000000008000 +patioctrl 0x01b3ffff +patlimits 0x0000 0x0005 diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/readout_pattern.pyat b/slsDetectorServers/xilinx_ctbDetectorServer/readout_pattern.pyat new file mode 100644 index 000000000..fb5520142 --- /dev/null +++ b/slsDetectorServers/xilinx_ctbDetectorServer/readout_pattern.pyat @@ -0,0 +1,22 @@ +patword 0x0000 0x0000000000008000 +patword 0x0001 0x0000000000008000 +patword 0x0002 0x0000000000008000 +patword 0x0003 0x0000000000008000 +patword 0x0004 0x0000000000008000 +patword 0x0005 0x0000000000008000 +patword 0x0006 0x0000000000008000 +patword 0x0007 0x0000000000008000 +patword 0x0008 0x0000000000008000 +patword 0x0009 0x0000000000008000 +patword 0x000a 0x0000000000008000 +patword 0x000b 0x0000000000108000 +patword 0x000c 0x0000000000108000 +patword 0x000d 0x0000000000108000 +patword 0x000e 0x0000000000108000 +patword 0x000f 0x0000000000008000 +patword 0x0010 0x0000000000008000 +patword 0x0011 0x0000000000008000 +patword 0x0012 0x0000000000008000 +patword 0x0013 0x0000000000008000 +patioctrl 0x01b3ffff +patlimits 0x0000 0x0013 \ No newline at end of file diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/reset_chip_xilinx.txt b/slsDetectorServers/xilinx_ctbDetectorServer/reset_chip_xilinx.txt new file mode 100644 index 000000000..70892384f --- /dev/null +++ b/slsDetectorServers/xilinx_ctbDetectorServer/reset_chip_xilinx.txt @@ -0,0 +1,40 @@ + +# turn off clock +setbit 0x600 16 +setbit 0x608 0 +sleep 1 + +# reset Matterhorn periphery +setbit 0x608 1 +sleep 1 + +# turn on clock +clearbit 0x600 16 +setbit 0x608 0 +sleep 1 + +# reset rx transceiver datapath +setbit 0x658 4 +sleep 1 + +# reset 8b10b counters +setbit 0x658 9 +setbit 0x658 10 +setbit 0x658 11 +setbit 0x658 12 +sleep 1 +clearbit 0x658 9 +clearbit 0x658 10 + +# reset buffer fifos +reg 0x5C8 0xFFFFFFFF +reg 0x5D0 0xFFFFFFFF +reg 0x5D8 0xFFFFFFFF +reg 0x5C8 0x0 +reg 0x5D0 0x0 +reg 0x5D8 0x0 +setbit 0x500 18 + +# load default pattern +patternX readout_pattern.pyat + diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c index d0b42841a..75f66efd7 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c @@ -492,7 +492,16 @@ void setTransceiverAlignment(int align) { #endif int isTransceiverAligned() { - return (bus_r(TRANSCEIVERSTATUS) & RXBYTEISALIGNED_MSK); + int times = 0; + int retval = bus_r(TRANSCEIVERSTATUS2) & RXLOCKED_MSK; + while (retval) { + retval = bus_r(TRANSCEIVERSTATUS2) & RXLOCKED_MSK; + times++; + usleep(10); + if (times == 5) + return 1; + } + return retval; } int waitTransceiverAligned(char *mess) { @@ -511,7 +520,9 @@ int waitTransceiverAligned(char *mess) { int times = 0; while (transceiverWordAligned == 0) { if (times++ > WAIT_TIME_OUT_0US_TIMES) { - sprintf(mess, "Transceiver alignment timed out\n"); + sprintf(mess, "Transceiver alignment timed out. Check connection, " + "p-n inversions, LSB-MSB inversions, link error " + "counters and channel enable settings\n"); LOG(logERROR, (mess)); return FAIL; } @@ -587,34 +598,197 @@ int getPowerChip() { int configureChip(char *mess) { LOG(logINFOBLUE, ("\tConfiguring chip\n")); - - // enable correct endianness (Only for MH_PR_2) - // uint32_t addr = MATTERHORNSPIREG1; - // bus_w(addr, bus_r(addr) &~MATTERHORNSPI1_MSK); - // bus_w(addr, bus_r(addr) | ((0x40000 << MATTERHORNSPI1_OFST) & - // MATTERHORNSPI1_MSK)); - - // start configuration - uint32_t addr = MATTERHORNSPICTRL; - bus_w(addr, bus_r(addr) | CONFIGSTART_P_MSK); - bus_w(addr, bus_r(addr) & ~CONFIGSTART_P_MSK); - - // wait until configuration is done -#ifndef VIRTUAL - int configDone = (bus_r(MATTERHORNSPICTRL) & BUSY_MSK); - int times = 0; - while (configDone == 0) { - if (times++ > WAIT_TIME_OUT_0US_TIMES) { - sprintf(mess, "Configuration of chip timed out\n"); - LOG(logERROR, (mess)); - return FAIL; - } - usleep(0); - configDone = (bus_r(MATTERHORNSPICTRL) & BUSY_MSK); + chipConfigured = 0; + if (readConfigFile(mess, CONFIG_CHIP_FILE, "chip config") == FAIL) { + return FAIL; } -#endif + if (readConfigFile(mess, RESET_CHIP_FILE, "reset chip") == FAIL) { + return FAIL; + } + LOG(logINFOBLUE, ("Chip configured.\n")); chipConfigured = 1; - LOG(logINFOBLUE, ("\tChip configured\n")); + return OK; +} + +int readConfigFile(char *mess, char *fileName, char *fileType) { + const int fileNameSize = 128; + char fname[fileNameSize]; + if (getAbsPath(fname, fileNameSize, fileName) == FAIL) { + sprintf(mess, "Could not get full path for %s file [%s].\n", fileType, + fname); + LOG(logERROR, (mess)); + return FAIL; + } + if (access(fname, F_OK) != 0) { + sprintf(mess, "Could not find %s file [%s].\n", fileType, fname); + LOG(logERROR, (mess)); + return FAIL; + } + FILE *fd = fopen(fname, "r"); + if (fd == NULL) { + sprintf(mess, "Could not open on-board detector server %s file [%s].\n", + fileType, fname); + LOG(logERROR, (mess)); + return FAIL; + } + LOG(logINFOBLUE, ("Reading %s file %s\n", fileType, fname)); + + const size_t LZ = 256; + char line[LZ]; + memset(line, 0, LZ); + char command[LZ]; + + // keep reading a line + while (fgets(line, LZ, fd)) { + + // ignore comments + if (line[0] == '#') { + LOG(logDEBUG1, ("Ignoring Comment\n")); + continue; + } + + // ignore empty lines + if (strlen(line) <= 1) { + LOG(logDEBUG1, ("Ignoring Empty line\n")); + continue; + } + + // removing leading spaces + if (line[0] == ' ' || line[0] == '\t') { + int len = strlen(line); + // find first valid character + int i = 0; + for (i = 0; i < len; ++i) { + if (line[i] != ' ' && line[i] != '\t') { + break; + } + } + // ignore the line full of spaces (last char \n) + if (i >= len - 1) { + LOG(logDEBUG1, ("Ignoring line full of spaces\n")); + continue; + } + // copying only valid char + char temp[LZ]; + memset(temp, 0, LZ); + memcpy(temp, line + i, strlen(line) - i); + memset(line, 0, LZ); + memcpy(line, temp, strlen(temp)); + LOG(logDEBUG1, ("Removing leading spaces.\n")); + } + + LOG(logDEBUG1, ("Command to process: (size:%d) %.*s\n", strlen(line), + strlen(line) - 1, line)); + memset(command, 0, LZ); + + // reg command + if (!strncmp(line, "reg", strlen("reg"))) { + uint32_t addr = 0; + uint32_t val = 0; + if (sscanf(line, "%s %x %x", command, &addr, &val) != 3) { + sprintf(mess, "Could not scan reg command. Line:[%s].\n", line); + LOG(logERROR, (mess)); + return FAIL; + } + bus_w(addr, val); + LOG(logINFOBLUE, ("Wrote 0x%x to 0x%x\n", val, addr)); + } + + // setbit command + else if (!strncmp(line, "setbit", strlen("setbit"))) { + uint32_t addr = 0; + uint32_t bit = 0; + if (sscanf(line, "%s %x %d", command, &addr, &bit) != 3) { + sprintf(mess, "Could not scan setbit command. Line:[%s].\n", + line); + LOG(logERROR, (mess)); + return FAIL; + } + bus_w(addr, bus_r(addr) | (1 << bit)); + LOG(logINFOBLUE, ("Set bit %d in 0x%x\n", bit, addr)); + } + + // clearbit command + else if (!strncmp(line, "clearbit", strlen("clearbit"))) { + uint32_t addr = 0; + uint32_t bit = 0; + if (sscanf(line, "%s %x %d", command, &addr, &bit) != 3) { + sprintf(mess, "Could not scan clearbit command. Line:[%s].\n", + line); + LOG(logERROR, (mess)); + return FAIL; + } + bus_w(addr, bus_r(addr) & ~(1 << bit)); + LOG(logINFOBLUE, ("Cleared bit %d in 0x%x\n", bit, addr)); + } + + // pollbit command + else if (!strncmp(line, "pollbit", strlen("pollbit"))) { + uint32_t addr = 0; + uint32_t bit = 0; + uint32_t val = 0; + if (sscanf(line, "%s %x %d %d", command, &addr, &bit, &val) != 4) { + sprintf(mess, "Could not scan pollbit command. Line:[%s].\n", + line); + LOG(logERROR, (mess)); + return FAIL; + } +#ifndef VIRTUAL + int times = 0; + while (((bus_r(addr) >> bit) & 0x1) != val) { + if (times++ > WAIT_TIME_OUT_0US_TIMES) { + sprintf(mess, "Polling bit %d in 0x%x timed out\n", bit, + addr); + LOG(logERROR, (mess)); + return FAIL; + } + usleep(0); + } +#endif + LOG(logINFOBLUE, ("Polled bit %d in 0x%x\n", bit, addr)); + } + + // patternX command + else if (!strncmp(line, "patternX", strlen("patternX"))) { + // take a file name and call loadPAtterFile + char patternFileName[LZ]; + if (sscanf(line, "%s %s", command, patternFileName) != 2) { + sprintf(mess, "Could not scan patternX command. Line:[%s].\n", + line); + LOG(logERROR, (mess)); + return FAIL; + } + if (loadPatternFile(patternFileName, mess) == FAIL) { + return FAIL; + } + LOG(logINFOBLUE, ("loaded pattern [%s].\n", patternFileName)); + } + + // sleep command + else if (!strncmp(line, "sleep", strlen("sleep"))) { + int time = 0; + if (sscanf(line, "%s %d", command, &time) != 2) { + sprintf(mess, "Could not scan sleep command. Line:[%s].\n", + line); + LOG(logERROR, (mess)); + return FAIL; + } + usleep(time * 1000 * 1000); + LOG(logINFOBLUE, ("Slept for %d s\n", time)); + } + + // other commands + else { + sprintf(mess, + "Could not scan command from on-board server " + "%s file. Line:[%s].\n", + fileType, line); + break; + } + memset(line, 0, LZ); + } + fclose(fd); + LOG(logINFOBLUE, ("Successfully read %s file.\n", fileType)); return OK; } @@ -1328,31 +1502,13 @@ int startStateMachine() { return OK; #endif - LOG(logINFOBLUE, ("Starting State Machine\n")); - // cleanFifos(); removing this for now as its done before readout pattern + LOG(logINFOBLUE, ("Starting readout\n")); - // start state machine - bus_w(FLOW_CONTROL_REG, bus_r(FLOW_CONTROL_REG) | START_F_MSK); - - LOG(logINFORED, ("Waiting for exposing to be done\n")); - int exposingDone = (bus_r(FLOW_STATUS_REG) & RSM_BUSY_MSK); - while (exposingDone != 0) { - usleep(0); - exposingDone = (bus_r(FLOW_STATUS_REG) & RSM_BUSY_MSK); - } - - LOG(logINFORED, ("Starting readout of chip to fifo\n")); + // MM:readout via pattern does not work right now due to firmware bug, + // readout via MatterhornCTRL for the moment + // bus_w(FLOW_CONTROL_REG, bus_r(FLOW_CONTROL_REG) | START_F_MSK); bus_w(MATTERHORNSPICTRL, bus_r(MATTERHORNSPICTRL) | STARTREAD_P_MSK); - LOG(logINFORED, ("Waiting until k-words or end of acquisition\n")); - usleep(0); - int commaDet = (bus_r(TRANSCEIVERSTATUS) & RXCOMMADET_MSK); - while (commaDet == 0) { - usleep(0); - commaDet = (bus_r(TRANSCEIVERSTATUS) & RXCOMMADET_MSK); - } - LOG(logINFORED, ("Kwords or end of acquisition detected\n")); - return OK; } @@ -1467,56 +1623,6 @@ int stopStateMachine() { return OK; } -int startReadOut() { - LOG(logINFOBLUE, ("Starting Readout\n")); -#ifdef VIRTUAL - // cannot set #frames and exptiem temporarily to 1 and 0, - // because have to set it back after readout (but this is non blocking) - return startStateMachine(); -#endif - // check if data in fifo - int ret = FAIL; - if (transceiverEnable) { - if ((bus_r(X_FIFO_EMPTY_STATUS_REG) & X_FIFO_EMPTY_STATUS_MSK) != - X_FIFO_EMPTY_STATUS_MSK) { - LOG(logINFO, ("Data in transceiver fifo\n")); - ret = OK; - } - } - if (analogEnable) { - if (bus_r(A_FIFO_EMPTY_STATUS_REG) != BIT32_MSK) { - LOG(logINFO, ("Data in analog fifo\n")); - ret = OK; - } - } - if (digitalEnable) { - if ((bus_r(D_FIFO_EMPTY_STATUS_REG) & D_FIFO_EMPTY_STATUS_MSK) != - D_FIFO_EMPTY_STATUS_MSK) { - LOG(logINFO, ("Data in digital fifo\n")); - ret = OK; - } - } - // if no module, dont check fifo empty - if (checkModuleFlag && ret == FAIL) { - LOG(logERROR, ("No data in fifo\n")); - return FAIL; - } - - LOG(logINFOBLUE, ("Streaming data from fifo\n")); - bus_w(FIFO_TO_GB_CONTROL_REG, - bus_r(FIFO_TO_GB_CONTROL_REG) | START_STREAMING_P_MSK); - - // wait until streaming is done (not same as fifo empty) - int streamingBusy = (bus_r(STATUSREG1) & TRANSMISSIONBUSY_MSK); - while (streamingBusy != 0) { - usleep(0); - streamingBusy = (bus_r(STATUSREG1) & TRANSMISSIONBUSY_MSK); - } - LOG(logINFORED, ("Streaming done\n")); - - return OK; -} - int softwareTrigger() { #ifndef VIRTUAL // ready for trigger @@ -1552,36 +1658,33 @@ enum runStatus getRunStatus() { LOG(logINFOBLUE, ("Status: IDLE\n")); return IDLE; #endif - uint32_t retval = bus_r(FLOW_STATUS_REG); - LOG(logINFO, ("Flow Status Register: %08x\n", retval)); + uint32_t retval = bus_r(STATUS_REG); + LOG(logINFO, ("Status Register: %08x\n", retval)); - if (retval & RSM_TRG_WAIT_MSK) { - LOG(logINFOBLUE, ("Status: WAITING\n")); - return WAITING; - } else if (retval & RSM_BUSY_MSK) { - LOG(logINFOBLUE, ("Status: RUNNING (exposing)\n")); - return RUNNING; - } else if (bus_r(MATTERHORNSPICTRL) & READOUTFROMASIC_MSK) { - LOG(logINFOBLUE, ("Status: RUNNING (data from chip to fifo)\n")); - return RUNNING; - } else if (bus_r(STATUSREG1) & TRANSMISSIONBUSY_MSK) { - LOG(logINFOBLUE, ("Status: TRANSMITTING\n")); - return TRANSMITTING; + if (retval == 0x0) { + return IDLE; } - LOG(logINFOBLUE, ("Status: IDLE\n")); - return IDLE; - // TODO: STOPPED, ERROR? + if (retval & RX_NOT_GOOD_MSK) { + LOG(logINFOBLUE, ("Status: ERROR\n")); + return ERROR; + } + + if (retval & WAIT_FOR_TRIGGER_MSK) { + LOG(logINFOBLUE, ("Status: WAITING\n")); + return WAITING; + } + + LOG(logINFOBLUE, ("Status: RUNNING\n")); + return RUNNING; + // TODO: STOPPED? } u_int32_t runBusy() { #ifdef VIRTUAL return ((sharedMemory_getStatus() == RUNNING) ? 1 : 0); #endif - uint32_t exposingBusy = bus_r(FLOW_STATUS_REG) & RSM_BUSY_MSK; - uint32_t fillingFifoBusy = bus_r(MATTERHORNSPICTRL) & READOUTFROMASIC_MSK; - uint32_t streamingBusy = bus_r(STATUSREG1) & TRANSMISSIONBUSY_MSK; - return (exposingBusy || fillingFifoBusy || streamingBusy); + return (bus_r(STATUS_REG)); } void waitForAcquisitionEnd() { diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h index 54cb758de..df291c0d2 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h @@ -4,7 +4,7 @@ #include "RegisterDefs.h" #include "sls/sls_detector_defs.h" -#define REQRD_FRMWRE_VRSN (0x230710) +#define REQRD_FRMWRE_VRSN (0x250203) #define KERNEL_DATE_VRSN "Wed Nov 29 17:32:14 CET 2023" #define LINKED_SERVER_NAME "xilinx_ctbDetectorServer" @@ -40,6 +40,9 @@ #define SLOWADC_DRIVER_FILE_NAME CURRENT_BOARD_LINKS_FOLDER "/ai%d" #define TEMP_DRIVER_FILE_NAME DEVICE_TREE_DST "0/in_temp7_input" +#define CONFIG_CHIP_FILE "chip_config_xilinx.txt" +#define RESET_CHIP_FILE "reset_chip_xilinx.txt" + /** Default Parameters */ #define DEFAULT_NUM_FRAMES (1) #define DEFAULT_NUM_CYCLES (1) diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index 6018bc31c..7fa4f1d0e 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -7,7 +7,7 @@ #define APIEIGER "developer 0x241107" #define APILIB "developer 0x241122" #define APIRECEIVER "developer 0x241122" -#define APIXILINXCTB "developer 0x250131" #define APICTB "developer 0x250131" #define APIMYTHEN3 "developer 0x250131" +#define APIXILINXCTB "developer 0x250213" #define APIJUNGFRAU "developer 0x250218"