diff --git a/slsDetectorServers/slsDetectorServer/include/XILINX_FMC.h b/slsDetectorServers/slsDetectorServer/include/XILINX_FMC.h new file mode 100644 index 000000000..99647ef28 --- /dev/null +++ b/slsDetectorServers/slsDetectorServer/include/XILINX_FMC.h @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package + +void XILINX_FMC_enable_all(); +void XILINX_FMC_disable_all(); \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/src/XILINX_FMC.c b/slsDetectorServers/slsDetectorServer/src/XILINX_FMC.c new file mode 100644 index 000000000..6d55d8c7f --- /dev/null +++ b/slsDetectorServers/slsDetectorServer/src/XILINX_FMC.c @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package +#include "XILINX_FMC.h" +#include "arm64.h" +#include "clogger.h" +#include +#include +#include + +// clang-format off +#define FMC_BASE_PATH "/root/fmc/" +#define FMC_VADJ_EN "FMC_VADJ_EN" +#define FMCP_VADJ_EN "FMCP_VADJ_EN" +#define FMCP_3V3_EN "FMCP_3V3_EN" +#define FMC_3V3_EN "FMC_3V3_EN" +#define FMC_12V_EN "FMC_12V_EN" +#define FMCP_12V_EN "FMCP_12V_EN" + +static const char *fmc_files[] = { + FMC_VADJ_EN, + FMCP_VADJ_EN, + FMCP_3V3_EN, + FMC_3V3_EN, + FMC_12V_EN, + FMCP_12V_EN +}; +// clang-format on + +void XILINX_FMC_enable_all() { + LOG(logINFOBLUE, ("enable FMC power\n")); + #ifdef VIRTUAL + return; + #endif + char full_path[64]; + for (size_t i = 0; i < sizeof(fmc_files) / sizeof(fmc_files[0]); ++i) { + snprintf(full_path, sizeof(full_path), "%s%s", FMC_BASE_PATH, fmc_files[i]); + FILE *fp = fopen(full_path, "w"); + if (fp == NULL) { + LOG(logERROR,("XILINX_FMC: enable Error\n")); + continue; + } + + fprintf(fp, "1\n"); + fclose(fp); + } +} + +void XILINX_FMC_disable_all() { + LOG(logINFOBLUE, ("disable FMC power\n")); + #ifdef VIRTUAL + return; + #endif + char full_path[64]; + for (size_t i = 0; i < sizeof(fmc_files) / sizeof(fmc_files[0]); ++i) { + snprintf(full_path, sizeof(full_path), "%s%s", FMC_BASE_PATH, fmc_files[i]); + FILE *fp = fopen(full_path, "w"); + if (fp == NULL) { + LOG(logERROR,("XILINX_FMC: disable Error\n")); + continue; + } + fprintf(fp, "0\n"); + fclose(fp); + } +} \ No newline at end of file diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt b/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt index fa72ff586..284c9b6fc 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt +++ b/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt @@ -7,6 +7,7 @@ add_executable(xilinx_ctbDetectorServer_virtual ../slsDetectorServer/src/communication_funcs.c ../slsDetectorServer/src/arm64.c ../slsDetectorServer/src/XILINX_PLL.c + ../slsDetectorServer/src/XILINX_FMC.c ../slsDetectorServer/src/common.c ../slsDetectorServer/src/sharedMemory.c ../slsDetectorServer/src/loadPattern.c diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/Makefile b/slsDetectorServers/xilinx_ctbDetectorServer/Makefile index f08ac3792..487959d6f 100755 --- a/slsDetectorServers/xilinx_ctbDetectorServer/Makefile +++ b/slsDetectorServers/xilinx_ctbDetectorServer/Makefile @@ -23,7 +23,7 @@ DESTDIR ?= bin INSTMODE = 0777 SRCS = slsDetectorFunctionList.c -SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)arm64.c $(main_src)XILINX_PLL.c $(main_src)common.c $(main_src)/sharedMemory.c $(main_src)/loadPattern.c $(md5_dir)md5.c $(main_src)programViaArm.c $(main_src)LTC2620_Driver.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)arm64.c $(main_src)XILINX_PLL.c $(main_src)XILINX_FMC.c $(main_src)common.c $(main_src)/sharedMemory.c $(main_src)/loadPattern.c $(md5_dir)md5.c $(main_src)programViaArm.c $(main_src)LTC2620_Driver.c OBJS = $(SRCS:.c=.o) diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer b/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer deleted file mode 100755 index d28cb6db7..000000000 Binary files a/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer and /dev/null differ diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c index 992d11f18..8598c0d80 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c @@ -10,6 +10,7 @@ #include "LTC2620_Driver.h" #include "XILINX_PLL.h" +#include "XILINX_FMC.h" #include "loadPattern.h" #ifdef VIRTUAL @@ -405,6 +406,10 @@ void setupDetector() { LTC2620_D_SetDefines(DAC_MIN_MV, DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC, NPWR, DAC_POWERDOWN_DRIVER_FILE_NAME); + + // power LTC2620 before talking to it: + XILINX_FMC_enable_all(); + LOG(logINFOBLUE, ("Powering down all dacs\n")); for (int idac = 0; idac < NDAC; ++idac) { setDAC(idac, LTC2620_D_GetPowerDownValue(), 0); @@ -579,6 +584,7 @@ int powerChip(int on, char *mess) { } else { LOG(logINFOBLUE, ("Powering chip: off\n")); bus_w(addr, bus_r(addr) & ~mask); + XILINX_FMC_disable_all(); chipConfigured = 0;