From 6e6fcec6983d0ecb5e2891e3afe8f8729161a465 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marie=20Andr=C3=A4?= <33870994+MarieAndrae@users.noreply.github.com> Date: Mon, 30 Sep 2019 14:36:33 +0200 Subject: [PATCH] MY3.0:read and write Registers, frames, cycles, delay (#64) * MY3.0:read and write Registers, frames, cycles, delay * write pattern seems to work * done all corrections. added default clks: run_clk=125MHz, tick_clk=20MHz (fix), sampling_clk=80MHz (from Carlos) * clk check for aquistition time * clk check for aquistition time * Update slsDetectorServer_defs.h * Update slsDetectorFunctionList.c --- .../mythen3DetectorServer/CMakeLists.txt | 5 +- .../mythen3DetectorServer/RegisterDefs.h | 166 +++++++-- .../bin/mythen3DetectorServer_developer | Bin 77784 -> 86340 bytes .../slsDetectorFunctionList.c | 336 +++++++++++++++++- .../slsDetectorServer_defs.h | 12 +- .../include/slsDetectorFunctionList.h | 11 +- .../slsDetectorServer/src/nios.c | 4 +- .../src/slsDetectorServer_funcs.c | 10 +- slsSupportLib/include/versionAPI.h | 2 +- 9 files changed, 490 insertions(+), 56 deletions(-) diff --git a/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt b/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt index faa66a8dc..dbfef1518 100644 --- a/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt +++ b/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt @@ -3,11 +3,10 @@ add_executable(mythen3DetectorServer_virtual ../slsDetectorServer/src/slsDetectorServer.c ../slsDetectorServer/src/slsDetectorServer_funcs.c ../slsDetectorServer/src/communication_funcs.c - # ../slsDetectorServer/src/blackfin.c - ../slsDetectorServer/src/communication_funcs_UDP.c + ../slsDetectorServer/src/nios.c + ../slsDetectorServer/src/communication_funcs_UDP.c ../slsDetectorServer/src/DAC6571.c ../slsDetectorServer/src/common.c - ../slsDetectorServer/src/nios.c ) include_directories( diff --git a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h index 6fe4d531a..711191582 100644 --- a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h +++ b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h @@ -2,39 +2,159 @@ #pragma once /* Definitions for FPGA*/ -#define MEM_MAP_SHIFT 1 + +#define BASE_CONTROL (0x0) +#define BASE_PATTERN_CONTROL (0x200 ) +#define BASE_PATTERN_RAM (0x10000 ) + +/* Basic detector FPGA registers --------------------------------------------------*/ +/* FPGA Version register */ +#define FPGA_VERSION_REG (0x04 + BASE_CONTROL) + +#define FPGA_COMPILATION_DATE_OFST (0) +#define FPGA_COMPILATION_DATE_MSK (0x00FFFFFF << FPGA_COMPILATION_DATE_OFST) +#define DETECTOR_TYPE_OFST (24) +#define DETECTOR_TYPE_MSK (0x000000FF << DETECTOR_TYPE_OFST) +/* Module Control Board Serial Number Register */ +#define MCB_SERIAL_NO_REG (0x00 + BASE_CONTROL) +/* API Version Register */ +#define API_VERSION_REG (0x08 + BASE_CONTROL) + +/* Fix pattern register */ +#define FIX_PATT_REG (0x0C + BASE_CONTROL) +#define FIX_PATT_VAL (0xACDC2019) + +/* Status register */ +#define STATUS_REG (0x10 + BASE_CONTROL) #ifdef VIRTUAL // until firmware is ready ---------------------------------- -/* Status register */ -#define STATUS_REG (0x01 << MEM_MAP_SHIFT) - #define RUN_BUSY_OFST (0) #define RUN_BUSY_MSK (0x00000001 << RUN_BUSY_OFST) +#endif -/* Set Cycles 64 bit register */ -#define SET_CYCLES_LSB_REG (0x02 << MEM_MAP_SHIFT) -#define SET_CYCLES_MSB_REG (0x03 << MEM_MAP_SHIFT) +/* Look at me register */ +#define LOOK_AT_ME_REG (0x14 + BASE_CONTROL) //Not used in firmware or software, good to play with -/* Set Frames 64 bit register */ -#define SET_FRAMES_LSB_REG (0x04 << MEM_MAP_SHIFT) -#define SET_FRAMES_MSB_REG (0x05 << MEM_MAP_SHIFT) -/* Set Period 64 bit register tT = T x 50 ns */ -#define SET_PERIOD_LSB_REG (0x06 << MEM_MAP_SHIFT) -#define SET_PERIOD_MSB_REG (0x07 << MEM_MAP_SHIFT) +/* Pattern Control FPGA registers --------------------------------------------------*/ +/* Pattern status Register*/ +#define PAT_STATUS_REG (0x00 + BASE_PATTERN_CONTROL) -/* Set Exptime 64 bit register eEXP = Exp x 25 ns */ -#define SET_EXPTIME_LSB_REG (0x08 << MEM_MAP_SHIFT) -#define SET_EXPTIME_MSB_REG (0x09 << MEM_MAP_SHIFT) +/* Delay left 64bit Register */ +#define GET_DELAY_LSB_REG (0x08 + BASE_PATTERN_CONTROL) +#define GET_DELAY_MSB_REG (0x0C + BASE_PATTERN_CONTROL) -/* Get Cycles 64 bit register */ -#define GET_CYCLES_LSB_REG (0x0A << MEM_MAP_SHIFT) -#define GET_CYCLES_MSB_REG (0x0B << MEM_MAP_SHIFT) +/* Cycles left 64bit Register */ +#define GET_CYCLES_LSB_REG (0x10 + BASE_PATTERN_CONTROL) +#define GET_CYCLES_MSB_REG (0x14 + BASE_PATTERN_CONTROL) -/* Get Frames 64 bit register */ -#define GET_FRAMES_LSB_REG (0x0C << MEM_MAP_SHIFT) -#define GET_FRAMES_MSB_REG (0x0D << MEM_MAP_SHIFT) -#endif \ No newline at end of file +/* Frames left 64bit Register */ +#define GET_FRAMES_LSB_REG (0x18 + BASE_PATTERN_CONTROL) +#define GET_FRAMES_MSB_REG (0x1C + BASE_PATTERN_CONTROL) + +/* Period left 64bit Register */ +#define GET_PERIOD_LSB_REG (0x20 + BASE_PATTERN_CONTROL) +#define GET_PERIOD_MSB_REG (0x24 + BASE_PATTERN_CONTROL) + + +/* Delay 64bit Write-register */ +#define SET_DELAY_LSB_REG (0x88 + BASE_PATTERN_CONTROL) +#define SET_DELAY_MSB_REG (0x8C + BASE_PATTERN_CONTROL) + +/* Cylces 64bit Write-register */ +#define SET_CYCLES_LSB_REG (0x90 + BASE_PATTERN_CONTROL) +#define SET_CYCLES_MSB_REG (0x94 + BASE_PATTERN_CONTROL) + +/* Frames 64bit Write-register */ +#define SET_FRAMES_LSB_REG (0x98 + BASE_PATTERN_CONTROL) +#define SET_FRAMES_MSB_REG (0x9C + BASE_PATTERN_CONTROL) + +/* Period 64bit Write-register */ +#define SET_PERIOD_LSB_REG (0xA0 + BASE_PATTERN_CONTROL) +#define SET_PERIOD_MSB_REG (0xA4 + BASE_PATTERN_CONTROL) + + +/* Pattern Control FPGA registers --------------------------------------------------*/ + +// /* Pattern IO Control 64 bit RW Register +// * Each bit configured as output(1)/ input(0) */ +// #define PATTERN_IO_CNTRL_LSB_REG (0x88 + BASE_CONTROL) +// #define PATTERN_IO_CNTRL_MSB_REG (0x8C + BASE_CONTROL) + +/* Pattern Limit RW Register */ +#define PATTERN_LIMIT_REG (0x100 + BASE_PATTERN_CONTROL) + +#define PATTERN_LIMIT_STRT_OFST (0) +#define PATTERN_LIMIT_STRT_MSK (0x00001FFF << PATTERN_LIMIT_STRT_OFST) +#define PATTERN_LIMIT_STP_OFST (16) +#define PATTERN_LIMIT_STP_MSK (0x00001FFF << PATTERN_LIMIT_STP_OFST) + +/* Pattern Wait 0 RW Register*/ +#define PATTERN_WAIT_0_ADDR_REG (0x188 + BASE_PATTERN_CONTROL) + +#define PATTERN_WAIT_0_ADDR_OFST (0) +#define PATTERN_WAIT_0_ADDR_MSK (0x00001FFF << PATTERN_WAIT_0_ADDR_OFST) + +/* Pattern Wait 1 RW Register*/ +#define PATTERN_WAIT_1_ADDR_REG (0x19C + BASE_PATTERN_CONTROL) + +#define PATTERN_WAIT_1_ADDR_OFST (0) +#define PATTERN_WAIT_1_ADDR_MSK (0x00001FFF << PATTERN_WAIT_1_ADDR_OFST) + +/* Pattern Wait 2 RW Register*/ +#define PATTERN_WAIT_2_ADDR_REG (0x1B0 + BASE_PATTERN_CONTROL) + +#define PATTERN_WAIT_2_ADDR_OFST (0) +#define PATTERN_WAIT_2_ADDR_MSK (0x00001FFF << PATTERN_WAIT_2_ADDR_OFST) + +/* Pattern Wait Timer 0 64bit RW Register */ +#define PATTERN_WAIT_TIMER_0_LSB_REG (0x180 + BASE_PATTERN_CONTROL) +#define PATTERN_WAIT_TIMER_0_MSB_REG (0x184 + BASE_PATTERN_CONTROL) + +/* Pattern Wait Timer 1 64bit RW Register */ +#define PATTERN_WAIT_TIMER_1_LSB_REG (0x194 + BASE_PATTERN_CONTROL) +#define PATTERN_WAIT_TIMER_1_MSB_REG (0x198 + BASE_PATTERN_CONTROL) + +/* Pattern Wait Timer 2 64bit RW Register */ +#define PATTERN_WAIT_TIMER_2_LSB_REG (0x1A8 + BASE_PATTERN_CONTROL) +#define PATTERN_WAIT_TIMER_2_MSB_REG (0x1AC + BASE_PATTERN_CONTROL) + +/* Pattern Loop 0 Address RW Register */ +#define PATTERN_LOOP_0_ADDR_REG (0x190 + BASE_PATTERN_CONTROL) + +#define PATTERN_LOOP_0_ADDR_STRT_OFST (0) +#define PATTERN_LOOP_0_ADDR_STRT_MSK (0x00001FFF << PATTERN_LOOP_0_ADDR_STRT_OFST) +#define PATTERN_LOOP_0_ADDR_STP_OFST (16) +#define PATTERN_LOOP_0_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_0_ADDR_STP_OFST) + +/* Pattern Loop 1 Address RW Register */ +#define PATTERN_LOOP_1_ADDR_REG (0x1A4 + BASE_PATTERN_CONTROL) + +#define PATTERN_LOOP_1_ADDR_STRT_OFST (0) +#define PATTERN_LOOP_1_ADDR_STRT_MSK (0x00001FFF << PATTERN_LOOP_1_ADDR_STRT_OFST) +#define PATTERN_LOOP_1_ADDR_STP_OFST (16) +#define PATTERN_LOOP_1_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_1_ADDR_STP_OFST) + +/* Pattern Loop 0 Address RW Register */ +#define PATTERN_LOOP_2_ADDR_REG (0x1B8 + BASE_PATTERN_CONTROL) + +#define PATTERN_LOOP_2_ADDR_STRT_OFST (0) +#define PATTERN_LOOP_2_ADDR_STRT_MSK (0x00001FFF << PATTERN_LOOP_2_ADDR_STRT_OFST) +#define PATTERN_LOOP_2_ADDR_STP_OFST (16) +#define PATTERN_LOOP_2_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_2_ADDR_STP_OFST) + +/* Pattern Loop 0 Iteration RW Register */ +#define PATTERN_LOOP_0_ITERATION_REG (0x18C + BASE_PATTERN_CONTROL) // patnloop + +/* Pattern Loop 1 Iteration RW Register */ +#define PATTERN_LOOP_1_ITERATION_REG (0x1A0 + BASE_PATTERN_CONTROL) // patnloop + +/* Pattern Loop 2 Iteration RW Register */ +#define PATTERN_LOOP_2_ITERATION_REG (0x1B4 + BASE_PATTERN_CONTROL) // patnloop + +/* Register of first word */ +#define PATTERN_STEP0_LSB_REG (0x0 + BASE_PATTERN_RAM) +#define PATTERN_STEP0_MSB_REG (0x4 + BASE_PATTERN_RAM) diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index 045e98c1f734a8dc7686be627b2fd0a0bc67e4a9..0f2e55610986955b679462bd6543821bb69b5abf 100755 GIT binary patch literal 86340 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 literal 77784 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

Y#*i9=Ke3cP{TBDt>|X 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 Yb~42lbty@6o5H^^lK4!jjKp;NUlDW6D*ylh diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c index 8ef60ffc2..1508a6af3 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c @@ -4,6 +4,8 @@ #include "nios.h" #include "DAC6571.h" #include "common.h" +#include "RegisterDefs.h" + #ifdef VIRTUAL #include "communication_funcs_UDP.h" #endif @@ -29,6 +31,9 @@ int virtual_status = 0; int virtual_stop = 0; #endif +int32_t clkPhase[NUM_CLOCKS] = {0, 0, 0}; +uint32_t clkDivider[NUM_CLOCKS] = {125, 20, 80}; + int highvoltage = 0; int isFirmwareCheckDone() { @@ -57,12 +62,58 @@ void basictests() { firmware_check_done = 1; return; #else - // faking it - firmware_check_done = 1; + FILE_LOG(logINFOBLUE, ("******** Mythen3 Server: do the checks *****************\n")); + if (mapCSP0() == FAIL) { + strcpy(firmware_message, + "Could not map to memory. Dangerous to continue.\n"); + FILE_LOG(logERROR, ("%s\n\n", firmware_message)); + firmware_compatibility = FAIL; + firmware_check_done = 1; + return; + } + // does check only if flag is 0 (by default), set by command line + if ((!debugflag) && ((testFpga() == FAIL))) { + strcpy(firmware_message, + "Could not pass basic tests of FPGA and bus. Dangerous to continue.\n"); + FILE_LOG(logERROR, ("%s\n\n", firmware_message)); + firmware_compatibility = FAIL; + firmware_check_done = 1; + return; + } + #endif } +int checkType() { +#ifdef VIRTUAL + return OK; +#endif + volatile u_int32_t type = ((bus_r(FPGA_VERSION_REG) & DETECTOR_TYPE_MSK) >> DETECTOR_TYPE_OFST); + if (type != MYTHEN3){ + FILE_LOG(logERROR, ("This is not a Mythen3 Server (read %d, expected %d)\n", type, MYTHEN3)); + return FAIL; + } + return OK; +} + +int testFpga() { +#ifdef VIRTUAL + return OK; +#endif + FILE_LOG(logINFO, ("Testing FPGA:\n")); + + //fixed pattern + int ret = OK; + volatile u_int32_t val = bus_r(FIX_PATT_REG); + if (val == FIX_PATT_VAL) { + FILE_LOG(logINFO, ("Fixed pattern: successful match 0x%08x\n",val)); + } else { + FILE_LOG(logERROR, ("Fixed pattern does not match! Read 0x%08x, expected 0x%08x\n", val, FIX_PATT_VAL)); + ret = FAIL; + } + return ret; +} /* Ids */ @@ -174,15 +225,26 @@ void initStopServer() { void setupDetector() { FILE_LOG(logINFO, ("This Server is for 1 Mythen3 module \n")); + clkDivider[RUN_CLK] = DEFAULT_RUN_CLK; + clkDivider[TICK_CLK] = DEFAULT_TICK_CLK; + clkDivider[SAMPLING_CLK] = DEFAULT_SAMPLING_CLK; + + highvoltage = 0; + +#ifndef VIRTUAL // hv - DAC6571_SetDefines(HV_HARD_MAX_VOLTAGE, HV_DRIVER_FILE_NAME); + DAC6571_SetDefines(HV_HARD_MAX_VOLTAGE, HV_DRIVER_FILE_NAME); +#endif setHighVoltage(DEFAULT_HIGH_VOLTAGE); // Initialization of acquistion parameters setTimer(FRAME_NUMBER, DEFAULT_NUM_FRAMES); setTimer(CYCLES_NUMBER, DEFAULT_NUM_CYCLES); + setTimer(ACQUISITION_TIME, DEFAULT_EXPTIME); setTimer(FRAME_PERIOD, DEFAULT_PERIOD); + setTimer(DELAY_AFTER_TRIGGER, DEFAULT_DELAY_AFTER_TRIGGER); + } @@ -206,7 +268,7 @@ int getSpeed(enum speedVariable ind) { int64_t setTimer(enum timerIndex ind, int64_t val) { int64_t retval = -1; -#ifdef VIRTUAL + switch(ind){ case FRAME_NUMBER: // defined in sls_detector_defs.h (general) @@ -216,24 +278,36 @@ int64_t setTimer(enum timerIndex ind, int64_t val) { retval = set64BitReg(val, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); // defined in my RegisterDefs.h FILE_LOG(logDEBUG1, ("Getting #frames: %lld\n", (long long int)retval)); break; - + case ACQUISITION_TIME: if(val >= 0){ - FILE_LOG(logINFO, ("Setting exptime: %lldns\n", (long long int)val)); - val *= (1E-3 * TEMP_CLK); + FILE_LOG(logINFO, ("Setting exptime (pattern wait time level 0): %lldns\n",(long long int)val)); + val *= (1E-3 * clkDivider[RUN_CLK]); + setPatternWaitTime(0, val); } - retval = set64BitReg(val, SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG) / (1E-3 * TEMP_CLK); // CLK defined in slsDetectorServer_defs.h - FILE_LOG(logDEBUG1, ("Getting exptime: %lldns\n", (long long int)retval)); + retval = setPatternWaitTime(0, -1) / (1E-3 * clkDivider[RUN_CLK]); + FILE_LOG(logINFO, ("\tGetting exptime (pattern wait time level 0): %lldns\n", (long long int)retval)); + FILE_LOG(logDEBUG1, ("Getting exptime (pattern wait time level 0): %lldns\n", (long long int)retval)); break; case FRAME_PERIOD: if(val >= 0){ FILE_LOG(logINFO, ("Setting period: %lldns\n",(long long int)val)); - val *= (1E-3 * TEMP_CLK); + val *= (1E-3 * TICK_CLK); } - retval = set64BitReg(val, SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG )/ (1E-3 * TEMP_CLK); + retval = set64BitReg(val, SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG )/ (1E-3 * TICK_CLK); FILE_LOG(logDEBUG1, ("Getting period: %lldns\n", (long long int)retval)); break; + + case DELAY_AFTER_TRIGGER: + if(val >= 0){ + FILE_LOG(logINFO, ("Setting delay: %lldns\n", (long long int)val)); + val *= (1E-3 * clkDivider[TICK_CLK]); + } + retval = set64BitReg(val, GET_DELAY_LSB_REG, GET_DELAY_MSB_REG) / (1E-3 * clkDivider[TICK_CLK]); + FILE_LOG(logINFO, ("\tGetting delay: %lldns\n", (long long int)retval)); + break; + case CYCLES_NUMBER: if(val >= 0) { FILE_LOG(logINFO, ("Setting #cycles: %lld\n", (long long int)val)); @@ -246,7 +320,7 @@ int64_t setTimer(enum timerIndex ind, int64_t val) { FILE_LOG(logERROR, ("Timer Index not implemented for this detector: %d\n", ind)); break; } -#endif + return retval; } @@ -256,11 +330,19 @@ int validateTimer(enum timerIndex ind, int64_t val, int64_t retval) { return OK; switch(ind) { case ACQUISITION_TIME: - case FRAME_PERIOD: // convert to freq - val *= (1E-3 * TEMP_CLK); + val *= (1E-3 * RUN_CLK); // convert back to timer - val = (val) / (1E-3 * TEMP_CLK); + val = (val) / (1E-3 * RUN_CLK); + if (val != retval) + return FAIL; + break; + case FRAME_PERIOD: + case DELAY_AFTER_TRIGGER: + // convert to freq + val *= (1E-3 * TICK_CLK); + // convert back to timer + val = (val) / (1E-3 * TICK_CLK); if (val != retval) return FAIL; break; @@ -294,7 +376,7 @@ int64_t getTimeLeft(enum timerIndex ind){ break; } #endif - return -1; + return retval; } int setHighVoltage(int val){ @@ -333,6 +415,226 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t return OK; } +/* pattern */ + +uint64_t readPatternWord(int addr) { + // error (handled in tcp) + if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { + FILE_LOG(logERROR, ("Cannot get Pattern - Word. Invalid addr 0x%x. " + "Should be between 0 and 0x%x\n", addr, MAX_PATTERN_LENGTH)); + return -1; + } + + FILE_LOG(logINFORED, (" Reading (Executing) Pattern Word (addr:0x%x)\n", addr)); + uint32_t reg_lsb = PATTERN_STEP0_LSB_REG + addr; // the first word in RAM as base plus the offset of the word to write (addr) + uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr; + + // read value + uint64_t retval = get64BitReg(reg_lsb, reg_msb); + FILE_LOG(logDEBUG1, (" Word(addr:0x%x) retval: 0x%llx\n", addr, (long long int) retval)); + + return retval; +} + +uint64_t writePatternWord(int addr, uint64_t word) { + // get + if (word == -1) + return readPatternWord(addr); + + // error (handled in tcp) + if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { + FILE_LOG(logERROR, ("Cannot set Pattern - Word. Invalid addr 0x%x. " + "Should be between 0 and 0x%x\n", addr, MAX_PATTERN_LENGTH)); + return -1; + } + + FILE_LOG(logINFO, ("Setting Pattern Word (addr:0x%x, word:0x%llx)\n", addr, (long long int) word)); + uint32_t reg_lsb = PATTERN_STEP0_LSB_REG + addr; // the first word in RAM as base plus the offset of the word to write (addr) + uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr; + + // write word + set64BitReg(word, reg_lsb, reg_msb); + FILE_LOG(logDEBUG1, (" Wrote word. PatternIn Reg: 0x%llx\n", get64BitReg(reg_lsb, reg_msb))); + + return readPatternWord(addr); +} + +int setPatternWaitAddress(int level, int addr) { + + // error (handled in tcp) + if (addr >= MAX_PATTERN_LENGTH) { + FILE_LOG(logERROR, ("Cannot set Pattern Wait Address. Invalid addr 0x%x. " + "Should be between 0 and 0x%x\n", addr, MAX_PATTERN_LENGTH)); + return -1; + } + + uint32_t reg = 0; + uint32_t offset = 0; + uint32_t mask = 0; + + switch (level) { + case 0: + reg = PATTERN_WAIT_0_ADDR_REG; + offset = PATTERN_WAIT_0_ADDR_OFST; + mask = PATTERN_WAIT_0_ADDR_MSK; + break; + case 1: + reg = PATTERN_WAIT_1_ADDR_REG; + offset = PATTERN_WAIT_1_ADDR_OFST; + mask = PATTERN_WAIT_1_ADDR_MSK; + break; + case 2: + reg = PATTERN_WAIT_2_ADDR_REG; + offset = PATTERN_WAIT_2_ADDR_OFST; + mask = PATTERN_WAIT_2_ADDR_MSK; + break; + default: + FILE_LOG(logERROR, ("Cannot set Pattern Wait Address. Invalid level 0x%x. " + "Should be between 0 and 2.\n", level)); + return -1; + } + + // set + if (addr >= 0) { + FILE_LOG(logINFO, ("Setting Pattern Wait Address (level:%d, addr:0x%x)\n", level, addr)); + bus_w(reg, ((addr << offset) & mask)); + } + + // get + uint32_t regval = bus_r((reg & mask) >> offset); + FILE_LOG(logDEBUG1, (" Wait Address retval (level:%d, addr:0x%x)\n", level, regval)); + return regval; +} + +uint64_t setPatternWaitTime(int level, uint64_t t) { + uint32_t regl = 0; + uint32_t regm = 0; + + switch (level) { + case 0: + regl = PATTERN_WAIT_TIMER_0_LSB_REG; + regm = PATTERN_WAIT_TIMER_0_MSB_REG; + break; + case 1: + regl = PATTERN_WAIT_TIMER_1_LSB_REG; + regm = PATTERN_WAIT_TIMER_1_MSB_REG; + break; + case 2: + regl = PATTERN_WAIT_TIMER_2_LSB_REG; + regm = PATTERN_WAIT_TIMER_2_MSB_REG; + break; + default: + FILE_LOG(logERROR, ("Cannot set Pattern Wait Time. Invalid level %d. " + "Should be between 0 and 2.\n", level)); + return -1; + } + + // set + if (t >= 0) { + FILE_LOG(logINFO, ("Setting Pattern Wait Time (level:%d, t:%lld)\n", level, (long long int)t)); + set64BitReg(t, regl, regm); + } + + // get + uint64_t regval = get64BitReg(regl, regm); + FILE_LOG(logDEBUG1, (" Wait Time retval (level:%d, t:%lld)\n", level, (long long int)regval)); + return regval; +} + +void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) { + + // (checked at tcp) + if (*startAddr >= MAX_PATTERN_LENGTH || *stopAddr >= MAX_PATTERN_LENGTH) { + FILE_LOG(logERROR, ("Cannot set Pattern Loop, Address (startaddr:0x%x, stopaddr:0x%x) must be " + "less than 0x%x\n", + *startAddr, *stopAddr, MAX_PATTERN_LENGTH)); + } + + uint32_t addr = 0; + uint32_t nLoopReg = 0; + uint32_t startOffset = 0; + uint32_t startMask = 0; + uint32_t stopOffset = 0; + uint32_t stopMask = 0; + + switch (level) { + case 0: + addr = PATTERN_LOOP_0_ADDR_REG; + nLoopReg = PATTERN_LOOP_0_ITERATION_REG; + startOffset = PATTERN_LOOP_0_ADDR_STRT_OFST; + startMask = PATTERN_LOOP_0_ADDR_STRT_MSK; + stopOffset = PATTERN_LOOP_0_ADDR_STP_OFST; + stopMask = PATTERN_LOOP_0_ADDR_STP_MSK; + break; + case 1: + addr = PATTERN_LOOP_1_ADDR_REG; + nLoopReg = PATTERN_LOOP_1_ITERATION_REG; + startOffset = PATTERN_LOOP_1_ADDR_STRT_OFST; + startMask = PATTERN_LOOP_1_ADDR_STRT_MSK; + stopOffset = PATTERN_LOOP_1_ADDR_STP_OFST; + stopMask = PATTERN_LOOP_1_ADDR_STP_MSK; + break; + case 2: + addr = PATTERN_LOOP_2_ADDR_REG; + nLoopReg = PATTERN_LOOP_2_ITERATION_REG; + startOffset = PATTERN_LOOP_2_ADDR_STRT_OFST; + startMask = PATTERN_LOOP_2_ADDR_STRT_MSK; + stopOffset = PATTERN_LOOP_2_ADDR_STP_OFST; + stopMask = PATTERN_LOOP_2_ADDR_STP_MSK; + break; + case -1: + // complete pattern + addr = PATTERN_LIMIT_REG; + nLoopReg = -1; + startOffset = PATTERN_LIMIT_STRT_OFST; + startMask = PATTERN_LIMIT_STRT_MSK; + stopOffset = PATTERN_LIMIT_STP_OFST; + stopMask = PATTERN_LIMIT_STP_MSK; + break; + default: + // already checked at tcp interface + FILE_LOG(logERROR, ("Cannot set Pattern loop. Invalid level %d. " + "Should be between -1 and 2.\n", level)); + *startAddr = 0; + *stopAddr = 0; + *nLoop = 0; + } + + // set iterations + if (level >= 0) { + // set iteration + if (*nLoop >= 0) { + FILE_LOG(logINFO, ("Setting Pattern Loop (level:%d, nLoop:%d)\n", + level, *nLoop)); + bus_w(nLoopReg, *nLoop); + } + *nLoop = bus_r(nLoopReg); + } + + // set + if (*startAddr >= 0 && *stopAddr >= 0) { + // writing start and stop addr + FILE_LOG(logINFO, ("Setting Pattern Loop (level:%d, startaddr:0x%x, stopaddr:0x%x)\n", + level, *startAddr, *stopAddr)); + bus_w(addr, ((*startAddr << startOffset) & startMask) | ((*stopAddr << stopOffset) & stopMask)); + FILE_LOG(logDEBUG1, ("Addr:0x%x, val:0x%x\n", addr, bus_r(addr))); + } + + // get + else { + *startAddr = ((bus_r(addr) & startMask) >> startOffset); + FILE_LOG(logDEBUG1, ("Getting Pattern Loop Start Address (level:%d, Read startAddr:0x%x)\n", + level, *startAddr)); + + *stopAddr = ((bus_r(addr) & stopMask) >> stopOffset); + FILE_LOG(logDEBUG1, ("Getting Pattern Loop Stop Address (level:%d, Read stopAddr:0x%x)\n", + level, *stopAddr)); + } +} + + + +/* aquisition */ int startStateMachine(){ #ifdef VIRTUAL @@ -452,4 +754,4 @@ int calculateDataBytes(){ int getTotalNumberOfChannels(){return ((int)getNumberOfChannelsPerChip() * (int)getNumberOfChips());} int getNumberOfChips(){return NCHIP;} int getNumberOfDACs(){return NDAC;} -int getNumberOfChannelsPerChip(){return NCHAN;} \ No newline at end of file +int getNumberOfChannelsPerChip(){return NCHAN;} diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h index 96c4f292c..144a3f523 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h @@ -1,6 +1,5 @@ #pragma once #include "sls_detector_defs.h" -#include "RegisterDefs.h" #define CTRL_SRVR_INIT_TIME_US (300 * 1000) @@ -9,20 +8,23 @@ #define NCHAN (128) #define NCHIP (10) #define NDAC (16) -#define TEMP_CLK (20) /* MHz */ #define HV_SOFT_MAX_VOLTAGE (200) #define HV_HARD_MAX_VOLTAGE (530) -#define HV_DRIVER_FILE_NAME ("/root/devlinks/hvdac") +#define HV_DRIVER_FILE_NAME ("/etc/devlinks/hvdac") /** Default Parameters */ #define DEFAULT_NUM_FRAMES (1) #define DEFAULT_NUM_CYCLES (1) #define DEFAULT_EXPTIME (100*1000*1000) //ns #define DEFAULT_PERIOD (2*1000*1000) //ns +#define DEFAULT_DELAY_AFTER_TRIGGER (0) #define DEFAULT_HIGH_VOLTAGE (0) - +#define DEFAULT_RUN_CLK (125) +#define DEFAULT_TICK_CLK (20) // will be fixed later. Not configurable +#define DEFAULT_SAMPLING_CLK (80) /* Enums */ +enum CLKINDEX {RUN_CLK, TICK_CLK, SAMPLING_CLK, NUM_CLOCKS}; enum DACINDEX {VIBIASSH, VTRIM, VIPRE, VRFSHNPOL, VTH1, VIPREOUT, VRF, VTH2, CAS, CASSH, VPL, VDCSH, VICIN, VICINSH, VICBIAS, VPH, VTH3, VRFSH}; #define DEFAULT_DAC_VALS {1200, /* vIbiasSh */ \ 2300, /* vTrim */ \ @@ -45,3 +47,5 @@ enum DACINDEX {VIBIASSH, VTRIM, VIPRE, VRFSHNPOL, VTH1, VIPREOUT, VRF, VTH2, C }; +/* Defines in the Firmware */ +#define MAX_PATTERN_LENGTH (0x8192) // maximum number of words (64bit) diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index a29f53eaf..0ee453146 100755 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -19,9 +19,11 @@ enum interfaceType {OUTER, INNER}; int isFirmwareCheckDone(); int getFirmwareCheckResult(char** mess); void basictests(); -#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(GOTTHARD2D) +#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) int checkType(); int testFpga(); +#endif +#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) int testBus(); #endif @@ -363,6 +365,13 @@ int setAllTrimbits(int val); int getAllTrimbits(); int getBebFPGATemp(); int activate(int enable); + +#elif MYTHEN3D +uint64_t readPatternWord(int addr); +uint64_t writePatternWord(int addr, uint64_t word); +int setPatternWaitAddress(int level, int addr); +uint64_t setPatternWaitTime(int level, uint64_t t); +void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop); #endif #if defined(JUNGFRAUD) || defined(EIGERD) diff --git a/slsDetectorServers/slsDetectorServer/src/nios.c b/slsDetectorServers/slsDetectorServer/src/nios.c index 2f7fbbda6..3dc8f1469 100755 --- a/slsDetectorServers/slsDetectorServer/src/nios.c +++ b/slsDetectorServers/slsDetectorServer/src/nios.c @@ -9,7 +9,7 @@ /* global variables */ u_int32_t* csp0base = 0; -#define CSP0 0x18000000 +#define CSP0 0x18060000 #define MEM_SIZE 0x100000 @@ -21,7 +21,7 @@ void bus_w(u_int32_t offset, u_int32_t data) { u_int32_t bus_r(u_int32_t offset) { volatile u_int32_t *ptr1; - ptr1=(u_int32_t*)(csp0base + offset/(sizeof(u_int32_t))); + ptr1=(u_int32_t*)(csp0base + offset/(sizeof(u_int32_t))); return *ptr1; } diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index ea4bab3ed..5f6be1614 100755 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -1660,7 +1660,7 @@ int set_timer(int file_des) { case ANALOG_SAMPLES: case DIGITAL_SAMPLES: #endif -#if !defined(EIGERD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) +#if !defined(EIGERD) && !defined(GOTTHARD2D) case DELAY_AFTER_TRIGGER: #endif retval = setTimer(ind, tns); @@ -2608,7 +2608,7 @@ int set_pattern_word(int file_des) { if (receiveData(file_des, args, sizeof(args), INT64) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) functionNotImplemented(); #else int addr = (int)args[0]; @@ -2644,7 +2644,7 @@ int set_pattern_loop(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) functionNotImplemented(); #else int loopLevel = args[0]; @@ -2695,7 +2695,7 @@ int set_pattern_wait_addr(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) functionNotImplemented(); #else int loopLevel = args[0]; @@ -2737,7 +2737,7 @@ int set_pattern_wait_time(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) functionNotImplemented(); #else int loopLevel = (int)args[0]; diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index 047933582..23570536f 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -8,5 +8,5 @@ #define APIGOTTHARD 0x190902 #define APIJUNGFRAU 0x190902 #define APIEIGER 0x190902 -#define APIMYTHEN3 0x190903 #define APIGOTTHARD2 0x190927 +#define APIMYTHEN3 0x190930