Xilinx ctb (#884)

* updated registers, arm64

* compiler set to aarch64 for xilinx server

* updated RegisterDefs.h

* merge into generate branch and resolving conflicts and adding the xilinx changes to callerspecial and commands.yaml

* compiles and can print firmware version (using a different csp0 address)

* fixing other servers (gotthard, jungfrau, moench, mythen3) that it returns in case of mapping failure, xilinxctb: added that it checks type, prints proper fw version, checks kernel date, added armprocessor define to use in common places, added specifiers to supress overflow and truncation warnings

* added detector ip and mac adddress to the printout

* fixed tests and recompiled servers
This commit is contained in:
2024-01-04 17:10:16 +01:00
committed by GitHub
parent 4f4125a3b2
commit 9738cb7d74
35 changed files with 1602 additions and 316 deletions

View File

@ -0,0 +1,38 @@
# SPDX-License-Identifier: LGPL-3.0-or-other
# Copyright (C) 2021 Contributors to the SLS Detector Package
add_executable(xilinx_ctbDetectorServer_virtual
slsDetectorFunctionList.c
../slsDetectorServer/src/slsDetectorServer.c
../slsDetectorServer/src/slsDetectorServer_funcs.c
../slsDetectorServer/src/communication_funcs.c
../slsDetectorServer/src/arm64.c
../slsDetectorServer/src/common.c
../slsDetectorServer/src/sharedMemory.c
../../slsSupportLib/src/md5.c
)
include_directories(
../slsDetectorServer/include
../../slsSupportLib/include
../../slsDetectorSoftware/include/sls/
)
target_include_directories(xilinx_ctbDetectorServer_virtual
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
)
target_compile_definitions(xilinx_ctbDetectorServer_virtual
PUBLIC XILINX_CHIPTESTBOARDD ARMPROCESSOR VIRTUAL STOP_SERVER
)
target_link_libraries(xilinx_ctbDetectorServer_virtual
PUBLIC pthread rt slsProjectCSettings
)
set_target_properties(xilinx_ctbDetectorServer_virtual PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
install(TARGETS xilinx_ctbDetectorServer_virtual
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

View File

@ -0,0 +1,47 @@
# SPDX-License-Identifier: LGPL-3.0-or-other
# Copyright (C) 2021 Contributors to the SLS Detector Package
current_dir = $(shell pwd)
main_inc = ../slsDetectorServer/include/
main_src = ../slsDetectorServer/src/
support_lib = ../../slsSupportLib/include/
det_lib = ../../slsDetectorSoftware/include/sls/
md5_dir = ../../slsSupportLib/src/
CROSS = aarch64-none-linux-gnu-
CC = $(CROSS)gcc
#TODO: allow these warnings and fix code
CFLAGS += -Wall -std=gnu99 -Wno-format-overflow -Wno-format-truncation -DXILINX_CHIPTESTBOARDD -DARMPROCESSOR -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(det_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE
#CFLAGS += -Wall -std=gnu99 -DXILINX_CHIPTESTBOARDD -DARMPROCESSOR -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(det_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE
LDLIBS += -lm -lrt -pthread
PROGS = xilinx_ctbDetectorServer
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)common.c $(main_src)/sharedMemory.c $(md5_dir)md5.c
OBJS = $(SRCS:.c=.o)
all: clean $(PROGS)
version: clean versioning $(PROGS)
boot: $(OBJS)
version_branch=$(API_BRANCH)
version_name=APIXILINXCTB
version_path=slsDetectorServers/xilinx_ctbDetectorServer
versioning:
cd ../../ && echo $(PWD) && echo `tput setaf 6; ./updateAPIVersion.sh $(version_name) $(version_path) $(version_branch); tput sgr0;`
$(PROGS): $(OBJS)
# echo $(OBJS)
mkdir -p $(DESTDIR)
$(CC) -o $@ $^ $(CFLAGS) $(LDLIBS)
mv $(PROGS) $(DESTDIR)
rm $(main_src)*.o $(md5_dir)*.o
clean:
rm -rf $(DESTDIR)/$(PROGS) *.o *.gdb $(main_src)*.o $(md5_dir)*.o

View File

@ -0,0 +1,416 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#pragma once
#define CTRLREG1 (0x0)
#define CTR1_OFST (0)
#define CTR1_MSK (0xffffffff << CTR1_OFST)
#define CTRLREG2 (0x4)
#define CTRL2_OFST (0)
#define CTRL2_MSK (0xffffffff << CTRL2_OFST)
#define STATUSREG1 (0x8)
#define STATUS1_OFST (0)
#define STATUS1_MSK (0xffffffff << STATUS1_OFST)
#define STATUSREG2 (0xC)
#define STATUS2_OFST (0)
#define STATUS2_MSK (0xffffffff << STATUS2_OFST)
#define FPGAVERSIONREG (0x10)
#define COMPDATE_OFST (0)
#define COMPDATE_MSK (0x00ffffff << COMPDATE_OFST)
#define DETTYPE_OFST (24)
#define DETTYPE_MSK (0x000000ff << DETTYPE_OFST)
#define PKTPACKETLENGTHREG (0x28)
#define PACKETLENGTH1G_OFST (0)
#define PACKETLENGTH1G_MSK (0x0000ffff << PACKETLENGTH1G_OFST)
#define PACKETLENGTH10G_OFST (16)
#define PACKETLENGTH10G_MSK (0x0000ffff << PACKETLENGTH10G_OFST)
#define PKTNOPACKETSREG (0x30)
#define NOPACKETS1G_OFST (0)
#define NOPACKETS1G_MSK (0x0000003f << NOPACKETS1G_OFST)
#define NOPACKETS10G_OFST (8)
#define NOPACKETS10G_MSK (0x0000003f << NOPACKETS10G_OFST)
#define PKTCTRLREG (0x38)
#define NSERVERS_OFST (0)
#define NSERVERS_MSK (0x0000003f << NSERVERS_OFST)
#define SERVERSTART_OFST (6)
#define SERVERSTART_MSK (0x0000001f << SERVERSTART_OFST)
#define ETHINTERF_OFST (11)
#define ETHINTERF_MSK (0x00000001 << ETHINTERF_OFST)
#define PKTCOORDREG1 (0x40)
#define COORDX_OFST (0)
#define COORDX_MSK (0x0000ffff << COORDX_OFST)
#define COORDY_OFST (16)
#define COORDY_MSK (0x0000ffff << COORDY_OFST)
#define PKTCOORDREG2 (0x48)
#define COORDZ_OFST (0)
#define COORDZ_MSK (0x0000ffff << COORDZ_OFST)
#define FLOWSTATUSREG (0x100)
#define RSMBUSY_OFST (0)
#define RSMBUSY_MSK (0x00000001 << RSMBUSY_OFST)
#define RSMTRGWAIT_OFST (3)
#define RSMTRGWAIT_MSK (0x00000001 << RSMTRGWAIT_OFST)
#define CSMBUSY_OFST (17)
#define CSMBUSY_MSK (0x00000001 << CSMBUSY_OFST)
#define FLOWCONTROLREG (0x108)
#define STARTF_OFST (0)
#define STARTF_MSK (0x00000001 << STARTF_OFST)
#define STOPF_OFST (1)
#define STOPF_MSK (0x00000001 << STOPF_OFST)
#define RSTF_OFST (2)
#define RSTF_MSK (0x00000001 << RSTF_OFST)
#define SWTRIGGERF_OFST (3)
#define SWTRIGGERF_MSK (0x00000001 << SWTRIGGERF_OFST)
#define TRIGGERENABLE_OFST (4)
#define TRIGGERENABLE_MSK (0x00000001 << TRIGGERENABLE_OFST)
#define TIMEFROMSTARTOUTREG1 (0x110)
#define TIMEFROMSTARTOUT1_OFST (0)
#define TIMEFROMSTARTOUT1_MSK (0xffffffff << TIMEFROMSTARTOUT1_OFST)
#define TIMEFROMSTARTOUTREG2 (0x114)
#define TIMEFROMSTARTOUT2_OFST (0)
#define TIMEFROMSTARTOUT2_MSK (0xffffffff << TIMEFROMSTARTOUT2_OFST)
#define FRAMESFROMSTARTOUTREG1 (0x118)
#define FRAMESFROMSTARTOUT1_OFST (0)
#define FRAMESFROMSTARTOUT1_MSK (0xffffffff << FRAMESFROMSTARTOUT1_OFST)
#define FRAMESFROMSTARTOUTREG2 (0x11C)
#define FRAMESFROMSTARTOUT2_OFST (0)
#define FRAMESFROMSTARTOUT2_MSK (0xffffffff << FRAMESFROMSTARTOUT2_OFST)
#define FRAMETIMEOUTREG1 (0x120)
#define FRAMETIMEOUT1_OFST (0)
#define FRAMETIMEOUT1_MSK (0xffffffff << FRAMETIMEOUT1_OFST)
#define FRAMETIMEOUTREG2 (0x124)
#define FRAMETIMEOUT2_OFST (0)
#define FRAMETIMEOUT2_MSK (0xffffffff << FRAMETIMEOUT2_OFST)
#define DELAYOUTREG1 (0x128)
#define DELAYOUT1_OFST (0)
#define DELAYOUT1_MSK (0xffffffff << DELAYOUT1_OFST)
#define DELAYOUTREG2 (0x12C)
#define DELAYOUT2_OFST (0)
#define DELAYOUT2_MSK (0xffffffff << DELAYOUT2_OFST)
#define CYCLESOUTREG1 (0x130)
#define CYCLESOUT1_OFST (0)
#define CYCLESOUT1_MSK (0xffffffff << CYCLESOUT1_OFST)
#define CYCLESOUTREG2 (0x134)
#define CYCLESOUT2_OFST (0)
#define CYCLESOUT2_MSK (0xffffffff << CYCLESOUT2_OFST)
#define FRAMESOUTREG1 (0x138)
#define FRAMESOUT1_OFST (0)
#define FRAMESOUT1_MSK (0xffffffff << FRAMESOUT1_OFST)
#define FRAMESOUTREG2 (0x13C)
#define FRAMESOUT2_OFST (0)
#define FRAMESOUT2_MSK (0xffffffff << FRAMESOUT2_OFST)
#define PERIODOUTREG1 (0x140)
#define PERIODOUT1_OFST (0)
#define PERIODOUT1_MSK (0xffffffff << PERIODOUT1_OFST)
#define PERIODOUTREG2 (0x144)
#define PERIODOUT2_OFST (0)
#define PERIODOUT2_MSK (0xffffffff << PERIODOUT2_OFST)
#define DELAYINREG1 (0x148)
#define DELAYIN1_OFST (0)
#define DELAYIN1_MSK (0xffffffff << DELAYIN1_OFST)
#define DELAYINREG2 (0x14C)
#define DELAYIN2_OFST (0)
#define DELAYIN2_MSK (0xffffffff << DELAYIN2_OFST)
#define CYCLESINREG1 (0x150)
#define CYCLESIN1_OFST (0)
#define CYCLESIN1_MSK (0xffffffff << CYCLESIN1_OFST)
#define CYCLESINREG2 (0x154)
#define CYCLESIN2_OFST (0)
#define CYCLESIN2_MSK (0xffffffff << CYCLESIN2_OFST)
#define FRAMESINREG1 (0x158)
#define FRAMESIN1_OFST (0)
#define FRAMESIN1_MSK (0xffffffff << FRAMESIN1_OFST)
#define FRAMESINREG2 (0x15C)
#define FRAMESIN2_OFST (0)
#define FRAMESIN2_MSK (0xffffffff << FRAMESIN2_OFST)
#define PERIODINREG1 (0x160)
#define PERIODIN1_OFST (0)
#define PERIODIN1_MSK (0xffffffff << PERIODIN1_OFST)
#define PERIODINREG2 (0x164)
#define PERIODIN2_OFST (0)
#define PERIODIN2_MSK (0xffffffff << PERIODIN2_OFST)
#define PATTERNOUTREG0 (0x200)
#define PATTERNOUT0_OFST (0)
#define PATTERNOUT0_MSK (0xffffffff << PATTERNOUT0_OFST)
#define PATTERNOUTREG1 (0x204)
#define PATTERNOUT1_OFST (0)
#define PATTERNOUT1_MSK (0xffffffff << PATTERNOUT1_OFST)
#define PATTERNINREG0 (0x208)
#define PATTERNIN0_OFST (0)
#define PATTERNIN0_MSK (0xffffffff << PATTERNIN0_OFST)
#define PATTERNINREG1 (0x20C)
#define PATTERNIN1_OFST (0)
#define PATTERNIN1_MSK (0xffffffff << PATTERNIN1_OFST)
#define PATTERNIOMASKREG0 (0x210)
#define PATTERNIOMASK0_OFST (0)
#define PATTERNIOMASK0_MSK (0xffffffff << PATTERNIOMASK0_OFST)
#define PATTERNIOMASKREG1 (0x214)
#define PATTERNIOMASK1_OFST (0)
#define PATTERNIOMASK1_MSK (0xffffffff << PATTERNIOMASK1_OFST)
#define PATTERNIOSETREG0 (0x218)
#define PATTERNIOSET0_OFST (0)
#define PATTERNIOSET0_MSK (0xffffffff << PATTERNIOSET0_OFST)
#define PATTERNIOSETREG1 (0x21C)
#define PATTERNIOSET1_OFST (0)
#define PATTERNIOSET1_MSK (0xffffffff << PATTERNIOSET1_OFST)
#define PATTERNCONTROLREG (0x220)
#define PATTERNWRBIT_OFST (0)
#define PATTERNWRBIT_MSK (0x00000001 << PATTERNWRBIT_OFST)
#define PATTERNRDBIT_OFST (1)
#define PATTERNRDBIT_MSK (0x00000001 << PATTERNRDBIT_OFST)
#define PATTERNADDRESSPTR_OFST (16)
#define PATTERNADDRESSPTR_MSK (0x00001fff << PATTERNADDRESSPTR_OFST)
#define PATTERNLIMITADDRESSREG (0x228)
#define PATTERNLIMITADDRESS_OFST (0)
#define PATTERNLIMITADDRESS_MSK (0xffffffff << PATTERNLIMITADDRESS_OFST)
#define PATTERNLOOP1ADDRESSREG (0x230)
#define PATTERNLOOP1ADDRESS_OFST (0)
#define PATTERNLOOP1ADDRESS_MSK (0xffffffff << PATTERNLOOP1ADDRESS_OFST)
#define PATTERNNLOOPS1REG (0x238)
#define PATTERNNLOOPS1_OFST (0)
#define PATTERNNLOOPS1_MSK (0xffffffff << PATTERNNLOOPS1_OFST)
#define PATTERNWAIT1ADDRESSREG (0x240)
#define PATTERNWAIT1ADDRESS_OFST (0)
#define PATTERNWAIT1ADDRESS_MSK (0xffffffff << PATTERNWAIT1ADDRESS_OFST)
#define PATTERNWAIT1TIMEREG1 (0x248)
#define PATTERNWAIT1TIME1_OFST (0)
#define PATTERNWAIT1TIME1_MSK (0xffffffff << PATTERNWAIT1TIME1_OFST)
#define PATTERNWAIT1TIMEREG2 (0x24C)
#define PATTERNWAIT1TIME2_OFST (0)
#define PATTERNWAIT1TIME2_MSK (0xffffffff << PATTERNWAIT1TIME2_OFST)
#define PATTERNLOOP2ADDRESSREG (0x250)
#define PATTERNLOOP2ADDRESS_OFST (0)
#define PATTERNLOOP2ADDRESS_MSK (0xffffffff << PATTERNLOOP2ADDRESS_OFST)
#define PATTERNNLOOPS2REG (0x258)
#define PATTERNNLOOPS2_OFST (0)
#define PATTERNNLOOPS2_MSK (0xffffffff << PATTERNNLOOPS2_OFST)
#define PATTERNWAIT2ADDRESSREG (0x260)
#define PATTERNWAIT2ADDRESS_OFST (0)
#define PATTERNWAIT2ADDRESS_MSK (0xffffffff << PATTERNWAIT2ADDRESS_OFST)
#define PATTERNWAIT2TIMEREG1 (0x268)
#define PATTERNWAIT2TIME1_OFST (0)
#define PATTERNWAIT2TIME1_MSK (0xffffffff << PATTERNWAIT2TIME1_OFST)
#define PATTERNWAIT2TIMEREG2 (0x26C)
#define PATTERNWAIT2TIME2_OFST (0)
#define PATTERNWAIT2TIME2_MSK (0xffffffff << PATTERNWAIT2TIME2_OFST)
#define PATTERNLOOP3ADDRESSREG (0x270)
#define PATTERNLOOP3ADDRESS_OFST (0)
#define PATTERNLOOP3ADDRESS_MSK (0xffffffff << PATTERNLOOP3ADDRESS_OFST)
#define PATTERNNLOOPS3REG (0x278)
#define PATTERNNLOOPS3_OFST (0)
#define PATTERNNLOOPS3_MSK (0xffffffff << PATTERNNLOOPS3_OFST)
#define PATTERNWAIT3ADDRESSREG (0x280)
#define PATTERNWAIT3ADDRESS_OFST (0)
#define PATTERNWAIT3ADDRESS_MSK (0xffffffff << PATTERNWAIT3ADDRESS_OFST)
#define PATTERNWAIT3TIMEREG1 (0x288)
#define PATTERNWAIT3TIME1_OFST (0)
#define PATTERNWAIT3TIME1_MSK (0xffffffff << PATTERNWAIT3TIME1_OFST)
#define PATTERNWAIT3TIMEREG2 (0x28C)
#define PATTERNWAIT3TIME2_OFST (0)
#define PATTERNWAIT3TIME2_MSK (0xffffffff << PATTERNWAIT3TIME2_OFST)
#define PATTERNLOOP4ADDRESSREG (0x290)
#define PATTERNLOOP4ADDRESS_OFST (0)
#define PATTERNLOOP4ADDRESS_MSK (0xffffffff << PATTERNLOOP4ADDRESS_OFST)
#define PATTERNNLOOPS4REG (0x298)
#define PATTERNNLOOPS4_OFST (0)
#define PATTERNNLOOPS4_MSK (0xffffffff << PATTERNNLOOPS4_OFST)
#define PATTERNWAIT4ADDRESSREG (0x300)
#define PATTERNWAIT4ADDRESS_OFST (0)
#define PATTERNWAIT4ADDRESS_MSK (0xffffffff << PATTERNWAIT4ADDRESS_OFST)
#define PATTERNWAIT4TIMEREG1 (0x308)
#define PATTERNWAI4TIME1_OFST (0)
#define PATTERNWAI4TIME1_MSK (0xffffffff << PATTERNWAI4TIME1_OFST)
#define PATTERNWAIT4TIMEREG2 (0x30C)
#define PATTERNWAIT4TIME2_OFST (0)
#define PATTERNWAIT4TIME2_MSK (0xffffffff << PATTERNWAIT4TIME2_OFST)
#define PATTERNLOOP5ADDRESSREG (0x310)
#define PATTERNLOOP5ADDRESS_OFST (0)
#define PATTERNLOOP5ADDRESS_MSK (0xffffffff << PATTERNLOOP5ADDRESS_OFST)
#define PATTERNNLOOPS5REG (0x318)
#define PATTERNNLOOPS5_OFST (0)
#define PATTERNNLOOPS5_MSK (0xffffffff << PATTERNNLOOPS5_OFST)
#define PATTERNWAIT5ADDRESSREG (0x320)
#define PATTERNWAIT5ADDRESS_OFST (0)
#define PATTERNWAIT5ADDRESS_MSK (0xffffffff << PATTERNWAIT5ADDRESS_OFST)
#define PATTERNWAIT5TIMEREG1 (0x328)
#define PATTERNWAIT5TIME1_OFST (0)
#define PATTERNWAIT5TIME1_MSK (0xffffffff << PATTERNWAIT5TIME1_OFST)
#define PATTERNWAIT5TIMEREG2 (0x32C)
#define PATTERNWAIT5TIME2_OFST (0)
#define PATTERNWAIT5TIME2_MSK (0xffffffff << PATTERNWAIT5TIME2_OFST)
#define PATTERNLOOP6ADDRESSREG (0x330)
#define PATTERNLOOP6ADDRESS_OFST (0)
#define PATTERNLOOP6ADDRESS_MSK (0xffffffff << PATTERNLOOP6ADDRESS_OFST)
#define PATTERNNLOOPS6REG (0x338)
#define PATTERNNLOOPS6_OFST (0)
#define PATTERNNLOOPS6_MSK (0xffffffff << PATTERNNLOOPS6_OFST)
#define PATTERNWAIT6ADDRESSREG (0x340)
#define PATTERNWAIT6ADDRESS_OFST (0)
#define PATTERNWAIT6ADDRESS_MSK (0xffffffff << PATTERNWAIT6ADDRESS_OFST)
#define PATTERNWAIT6TIMEREG1 (0x348)
#define PATTERNWAIT6TIME1_OFST (0)
#define PATTERNWAIT6TIME1_MSK (0xffffffff << PATTERNWAIT6TIME1_OFST)
#define PATTERNWAIT6TIMEREG2 (0x34C)
#define PATTERNWAIT6TIME2_OFST (0)
#define PATTERNWAIT6TIME2_MSK (0xffffffff << PATTERNWAIT6TIME2_OFST)
#define EXPCTRLREG (0x400)
#define STARTP_OFST (0)
#define STARTP_MSK (0x00000001 << STARTP_OFST)
#define EXPFRAMESREG (0x408)
#define NOFRAMES_OFST (0)
#define NOFRAMES_MSK (0xffffffff << NOFRAMES_OFST)
#define EXPTIMEREG (0x410)
#define EXPTIME_OFST (0)
#define EXPTIME_MSK (0xffffffff << EXPTIME_OFST)

View File

@ -0,0 +1,211 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#include "slsDetectorFunctionList.h"
#include "arm64.h"
#include "clogger.h"
#include "common.h"
#include "sharedMemory.h"
#include "sls/versionAPI.h"
#include <string.h>
#include <unistd.h> // usleep
#include <arpa/inet.h> // INET_ADDRSTRLEN
// Global variable from slsDetectorServer_funcs
extern int debugflag;
extern int updateFlag;
extern const enum detectorType myDetectorType;
// Global variable from communication_funcs.c
extern int isControlServer;
int initError = OK;
int initCheckDone = 0;
char initErrorMessage[MAX_STR_LENGTH];
int detPos[2] = {0, 0};
int isInitCheckDone() { return initCheckDone; }
int getInitResult(char **mess) {
*mess = initErrorMessage;
return initError;
}
void basictests() {
initError = OK;
initCheckDone = 0;
memset(initErrorMessage, 0, MAX_STR_LENGTH);
#ifdef VIRTUAL
LOG(logINFOBLUE, ("****** Xilinx Chip Test Board Virtual Server ******\n"));
#else
LOG(logINFOBLUE, ("********** Xilinx Chip Test Board Server **********\n"));
#endif
if (mapCSP0() == FAIL) {
strcpy(initErrorMessage,
"Could not map to memory. Cannot proceed. Check Firmware.\n");
LOG(logERROR, (initErrorMessage));
initError = FAIL;
return;
}
#ifndef VIRTUAL
/*if ((!debugflag) && (!updateFlag) &&
((validateKernelVersion(KERNEL_DATE_VRSN) == FAIL) ||
(checkType() == FAIL) || (testFpga() == FAIL) ||
(testBus() == FAIL))) {*/
if ((!debugflag) && (!updateFlag) &&
((validateKernelVersion(KERNEL_DATE_VRSN) == FAIL) ||
(checkType() == FAIL) /*|| (testFpga() == FAIL) ||
(testBus() == FAIL)*/)) {
sprintf(initErrorMessage,
"Could not pass basic tests of FPGA and bus. Cannot proceed. "
"Check Firmware. (Firmware version:0x%lx) \n",
getFirmwareVersion());
LOG(logERROR, ("%s\n\n", initErrorMessage));
initError = FAIL;
return;
}
#endif
uint32_t ipadd = getDetectorIP();
uint64_t macadd = getDetectorMAC();
int64_t fwversion = getFirmwareVersion();
char swversion[MAX_STR_LENGTH] = {0};
memset(swversion, 0, MAX_STR_LENGTH);
getServerVersion(swversion);
uint32_t requiredFirmwareVersion = REQRD_FRMWRE_VRSN;
LOG(logINFOBLUE,
("**************************************************\n"
"Detector IP Addr:\t\t 0x%x\n"
"Detector MAC Addr:\t\t 0x%lx\n\n"
"Firmware Version:\t\t 0x%lx\n"
"Software Version:\t\t %s\n"
"Required Firmware Version:\t 0x%x\n"
"********************************************************\n",
ipadd, macadd, fwversion, swversion, requiredFirmwareVersion));
}
int checkType() {
#ifdef VIRTUAL
return OK;
#endif
u_int32_t type =
((bus_r(FPGAVERSIONREG) & DETTYPE_MSK) >> DETTYPE_OFST);
if (type != XILINX_CHIPTESTBOARD) {
LOG(logERROR,
("This is not a Xilinx CTB firmware (read %d, expected %d)\n", type,
XILINX_CHIPTESTBOARD));
return FAIL;
}
return OK;
}
/* Ids */
void getServerVersion(char *version) { strcpy(version, APIXILINXCTB); }
uint64_t getFirmwareVersion() {
#ifdef VIRTUAL
return REQRD_FRMWRE_VRSN;
#endif
return ((bus_r(FPGAVERSIONREG) & COMPDATE_MSK) >> COMPDATE_OFST);
}
u_int64_t getDetectorMAC() {
#ifdef VIRTUAL
return 0;
#else
char output[255], mac[255] = "";
u_int64_t res = 0;
FILE *sysFile =
popen("ifconfig eth0 | grep ether | awk '{ print $2 }'", "r");
fgets(output, sizeof(output), sysFile);
pclose(sysFile);
// getting rid of ":"
char *pch;
pch = strtok(output, ":");
while (pch != NULL) {
strcat(mac, pch);
pch = strtok(NULL, ":");
}
sscanf(mac, "%lx", &res);
return res;
#endif
}
u_int32_t getDetectorIP() {
#ifdef VIRTUAL
return 0;
#endif
char temp[INET_ADDRSTRLEN] = "";
u_int32_t res = 0;
// execute and get address
char output[255];
FILE *sysFile = popen(
"ifconfig | grep 'inet '| grep -v '127.0.0.1' | awk '{ print $2 }'",
"r");
fgets(output, sizeof(output), sysFile);
pclose(sysFile);
// converting IPaddress to hex.
char *pcword = strtok(output, ".");
while (pcword != NULL) {
sprintf(output, "%02x", atoi(pcword));
strcat(temp, output);
pcword = strtok(NULL, ".");
}
strcpy(output, temp);
sscanf(output, "%x", &res);
// LOG(logINFO, ("ip:%x\n",res);
return res;
}
/* initialization */
void initControlServer() {
if (!updateFlag && initError == OK) {
setupDetector();
}
initCheckDone = 1;
}
void initStopServer() {
if (!updateFlag && initError == OK) {
usleep(CTRL_SRVR_INIT_TIME_US);
if (mapCSP0() == FAIL) {
initError = FAIL;
strcpy(initErrorMessage,
"Stop Server: Map Fail. Cannot proceed. Check Firmware.\n");
LOG(logERROR, (initErrorMessage));
initCheckDone = 1;
return;
}
#ifdef VIRTUAL
sharedMemory_setStop(0);
#endif
}
initCheckDone = 1;
}
/* set up detector */
void setupDetector() {
LOG(logINFO, ("This Server is for 1 Xilinx Chip Test Board\n"));
#ifdef VIRTUAL
sharedMemory_setStatus(IDLE);
#endif
LOG(logINFO, ("Goodbye...\n"));
}
int setDetectorPosition(int pos[]) {
memcpy(detPos, pos, sizeof(detPos));
return OK;
}
int *getDetectorPosition() { return detPos; }
int getNumberofUDPInterfaces() { return 1; }

View File

@ -0,0 +1,18 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#pragma once
#include "RegisterDefs.h"
#include "sls/sls_detector_defs.h"
#define REQRD_FRMWRE_VRSN (0x230000)
#define KERNEL_DATE_VRSN "Wed Nov 29 17:32:14 CET 2023"
#define LINKED_SERVER_NAME "xilinx_ctbDetectorServer"
#define CTRL_SRVR_INIT_TIME_US (2 * 1000 * 1000)
/* Hardware Definitions */
#define NCHAN (1)
enum ADCINDEX { V_PWR_IO };
enum DACINDEX { D0 };