mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-23 10:07:59 +02:00
G2hdi (#510)
* g2: new hdi values, write hdi value to reg, set slave/master to reg, able to set master from server config file, server command line and client * print versions for virtual as well
This commit is contained in:
@ -100,6 +100,12 @@
|
||||
#define CONFIG_VETO_CH_10GBE_ALG_MSK (0x00000007 << CONFIG_VETO_CH_10GBE_ALG_OFST)
|
||||
#define CONFIG_VETO_CH_10GBE_ENBL_OFST (15)
|
||||
#define CONFIG_VETO_CH_10GBE_ENBL_MSK (0x00000001 << CONFIG_VETO_CH_10GBE_ENBL_OFST)
|
||||
#define CONFIG_SLAVE_OFST (16)
|
||||
#define CONFIG_SLAVE_MSK (0x00000001 << CONFIG_SLAVE_OFST)
|
||||
#define CONFIG_HDI_MOD_ID_OFST (17)
|
||||
#define CONFIG_HDI_MOD_ID_MSK (0x00000007 << CONFIG_HDI_MOD_ID_OFST)
|
||||
#define CONFIG_FLIP_DATA_STREAM_OFST (20)
|
||||
#define CONFIG_FLIP_DATA_STREAM_MSK (0x00000001 << CONFIG_FLIP_DATA_STREAM_OFST)
|
||||
#define ALGORITHM_HITS_VAL (0x0)
|
||||
#define ALGORITHM_RAW_VAL (0x7)
|
||||
|
||||
|
Binary file not shown.
@ -73,7 +73,6 @@ int64_t burstPeriodReg = 0;
|
||||
int filterResistor = 0;
|
||||
int cdsGain = 0;
|
||||
int detPos[2] = {};
|
||||
int master = 1;
|
||||
|
||||
int isInitCheckDone() { return initCheckDone; }
|
||||
|
||||
@ -87,7 +86,10 @@ void basictests() {
|
||||
initCheckDone = 0;
|
||||
memset(initErrorMessage, 0, MAX_STR_LENGTH);
|
||||
#ifdef VIRTUAL
|
||||
LOG(logINFOBLUE, ("******** Gotthard2 Virtual Server *****************\n"));
|
||||
LOG(logINFOBLUE, ("************ Gotthard2 Virtual Server ************\n"));
|
||||
#else
|
||||
LOG(logINFOBLUE, ("**************** Gotthard2 Server ****************\n"));
|
||||
#endif
|
||||
if (mapCSP0() == FAIL) {
|
||||
strcpy(initErrorMessage,
|
||||
"Could not map to memory. Dangerous to continue.\n");
|
||||
@ -95,16 +97,7 @@ void basictests() {
|
||||
initError = FAIL;
|
||||
return;
|
||||
}
|
||||
return;
|
||||
#else
|
||||
LOG(logINFOBLUE, ("************ Gotthard2 Server *********************\n"));
|
||||
if (mapCSP0() == FAIL) {
|
||||
strcpy(initErrorMessage,
|
||||
"Could not map to memory. Dangerous to continue.\n");
|
||||
LOG(logERROR, ("%s\n\n", initErrorMessage));
|
||||
initError = FAIL;
|
||||
return;
|
||||
}
|
||||
#ifndef VIRTUAL
|
||||
// does check only if flag is 0 (by default), set by command line
|
||||
if ((!debugflag) && (!updateFlag) &&
|
||||
((validateKernelVersion(KERNEL_DATE_VRSN) == FAIL) ||
|
||||
@ -118,7 +111,7 @@ void basictests() {
|
||||
initError = FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
#endif
|
||||
uint16_t hversion = getHardwareVersionNumber();
|
||||
uint32_t ipadd = getDetectorIP();
|
||||
uint64_t macadd = getDetectorMAC();
|
||||
@ -129,7 +122,7 @@ void basictests() {
|
||||
uint32_t requiredFirmwareVersion = REQRD_FRMWRE_VRSN;
|
||||
|
||||
LOG(logINFOBLUE,
|
||||
("*************************************************\n"
|
||||
("**************************************************\n"
|
||||
"Hardware Version:\t\t 0x%x\n"
|
||||
|
||||
"Detector IP Addr:\t\t 0x%x\n"
|
||||
@ -146,6 +139,7 @@ void basictests() {
|
||||
(long long int)sw_fw_apiversion, requiredFirmwareVersion,
|
||||
(long long int)client_sw_apiversion));
|
||||
|
||||
#ifndef VIRTUAL
|
||||
// return if flag is not zero, debug mode
|
||||
if (debugflag || updateFlag) {
|
||||
return;
|
||||
@ -234,6 +228,7 @@ int testBus() {
|
||||
|
||||
int ret = OK;
|
||||
u_int32_t addr = DTA_OFFSET_REG;
|
||||
u_int32_t prevValue = bus_r(addr);
|
||||
u_int32_t times = 1000 * 1000;
|
||||
|
||||
for (u_int32_t i = 0; i < times; ++i) {
|
||||
@ -245,7 +240,7 @@ int testBus() {
|
||||
}
|
||||
}
|
||||
|
||||
bus_w(addr, 0);
|
||||
bus_w(addr, prevValue);
|
||||
|
||||
if (ret == OK) {
|
||||
LOG(logINFO, ("Successfully tested bus %d times\n", times));
|
||||
@ -388,8 +383,9 @@ void initStopServer() {
|
||||
}
|
||||
#ifdef VIRTUAL
|
||||
sharedMemory_setStop(0);
|
||||
// not reading config file (nothing of interest to stop server)
|
||||
if (checkCommandLineConfiguration() == FAIL) {
|
||||
setMaster(OW_MASTER);
|
||||
if (readConfigFile() == FAIL ||
|
||||
checkCommandLineConfiguration() == FAIL) {
|
||||
initCheckDone = 1;
|
||||
return;
|
||||
}
|
||||
@ -464,35 +460,15 @@ void setupDetector() {
|
||||
setHighVoltage(DEFAULT_HIGH_VOLTAGE);
|
||||
|
||||
// check module type attached if not in debug mode
|
||||
{
|
||||
int ret = checkDetectorType();
|
||||
if (checkModuleFlag) {
|
||||
switch (ret) {
|
||||
case -1:
|
||||
sprintf(initErrorMessage,
|
||||
"Could not get the module type attached.\n");
|
||||
initError = FAIL;
|
||||
LOG(logERROR, ("Aborting startup!\n\n", initErrorMessage));
|
||||
return;
|
||||
case -2:
|
||||
sprintf(initErrorMessage,
|
||||
"No Module attached! Run server with -nomodule.\n");
|
||||
initError = FAIL;
|
||||
LOG(logERROR, ("Aborting startup!\n\n", initErrorMessage));
|
||||
return;
|
||||
case FAIL:
|
||||
sprintf(initErrorMessage,
|
||||
"Wrong Module (Not Gotthard2) attached!\n");
|
||||
initError = FAIL;
|
||||
LOG(logERROR, ("Aborting startup!\n\n", initErrorMessage));
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
LOG(logINFOBLUE,
|
||||
("In No-Module mode: Ignoring module type. Continuing.\n"));
|
||||
}
|
||||
if (initError == FAIL)
|
||||
return;
|
||||
if (!checkModuleFlag) {
|
||||
LOG(logINFOBLUE, ("In No-Module mode: Ignoring module type...\n"));
|
||||
} else {
|
||||
initError = checkDetectorType(initErrorMessage);
|
||||
}
|
||||
if (initError == FAIL) {
|
||||
return;
|
||||
}
|
||||
|
||||
// power on chip
|
||||
@ -710,8 +686,35 @@ int readConfigFile() {
|
||||
strlen(line) - 1, line));
|
||||
memset(command, 0, LZ);
|
||||
|
||||
// master command
|
||||
if (!strncmp(line, "master", strlen("master"))) {
|
||||
int m = -1;
|
||||
// cannot scan values
|
||||
if (sscanf(line, "%s %d", command, &m) != 2) {
|
||||
sprintf(initErrorMessage,
|
||||
"Could not scan master commands from on-board server "
|
||||
"config file. Line:[%s].\n",
|
||||
line);
|
||||
break;
|
||||
}
|
||||
// validations
|
||||
if (m != 0 && m != 1) {
|
||||
sprintf(initErrorMessage,
|
||||
"Invalid master argument from on-board server "
|
||||
"config file. Line:[%s].\n",
|
||||
line);
|
||||
break;
|
||||
}
|
||||
if (setMaster(m == 1 ? OW_MASTER : OW_SLAVE) == FAIL) {
|
||||
sprintf(initErrorMessage,
|
||||
"Could not set master from config file. Line:[%s].\n",
|
||||
line);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// vetoref command
|
||||
if (!strncmp(line, "vetoref", strlen("vetoref"))) {
|
||||
else if (!strncmp(line, "vetoref", strlen("vetoref"))) {
|
||||
int igain = 0;
|
||||
int value = 0;
|
||||
|
||||
@ -957,15 +960,15 @@ int readConfigFile() {
|
||||
|
||||
int checkCommandLineConfiguration() {
|
||||
if (masterCommandLine != -1) {
|
||||
#ifdef VIRTUAL
|
||||
master = masterCommandLine;
|
||||
#else
|
||||
initError = FAIL;
|
||||
strcpy(initErrorMessage,
|
||||
"Cannot set Master from command line for this detector. "
|
||||
"Should have been caught before!\n");
|
||||
return FAIL;
|
||||
#endif
|
||||
LOG(logINFOBLUE, ("Setting %s from Command Line\n",
|
||||
(masterCommandLine == 1 ? "Master" : "Slave")));
|
||||
if (setMaster(masterCommandLine == 1 ? OW_MASTER : OW_SLAVE) == FAIL) {
|
||||
initError = FAIL;
|
||||
sprintf(initErrorMessage, "Could not set %s from command line.\n",
|
||||
(masterCommandLine == 1 ? "Master" : "Slave"));
|
||||
LOG(logERROR, (initErrorMessage));
|
||||
return FAIL;
|
||||
}
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
@ -1497,8 +1500,38 @@ int setHighVoltage(int val) {
|
||||
|
||||
/* parameters - timing */
|
||||
|
||||
int setMaster(enum MASTERINDEX m) {
|
||||
char *master_names[] = {MASTER_NAMES};
|
||||
LOG(logINFOBLUE, ("Setting up as %s in (%s server)\n", master_names[m],
|
||||
(isControlServer ? "control" : "stop")));
|
||||
int retval = -1;
|
||||
switch (m) {
|
||||
case OW_MASTER:
|
||||
bus_w(CONFIG_REG, bus_r(CONFIG_REG) & ~CONFIG_SLAVE_MSK);
|
||||
isMaster(&retval);
|
||||
if (retval != 1) {
|
||||
LOG(logERROR, ("Could not set master\n"));
|
||||
return FAIL;
|
||||
}
|
||||
break;
|
||||
case OW_SLAVE:
|
||||
bus_w(CONFIG_REG, bus_r(CONFIG_REG) | CONFIG_SLAVE_MSK);
|
||||
isMaster(&retval);
|
||||
if (retval != 0) {
|
||||
LOG(logERROR, ("Could not set slave\n"));
|
||||
return FAIL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// hardware settings (do nothing)
|
||||
break;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
int isMaster(int *retval) {
|
||||
*retval = master;
|
||||
int slave = ((bus_r(CONFIG_REG) & CONFIG_SLAVE_MSK) >> CONFIG_SLAVE_OFST);
|
||||
*retval = (slave == 1 ? 0 : 1);
|
||||
return OK;
|
||||
}
|
||||
|
||||
@ -1950,54 +1983,71 @@ int *getDetectorPosition() { return detPos; }
|
||||
|
||||
// Detector Specific
|
||||
|
||||
int checkDetectorType() {
|
||||
int checkDetectorType(char *mess) {
|
||||
#ifdef VIRTUAL
|
||||
setMaster(OW_MASTER);
|
||||
return OK;
|
||||
#endif
|
||||
LOG(logINFO, ("Checking type of module\n"));
|
||||
LOG(logINFO, ("Checking module type\n"));
|
||||
FILE *fd = fopen(TYPE_FILE_NAME, "r");
|
||||
if (fd == NULL) {
|
||||
LOG(logERROR,
|
||||
("Could not open file %s to get type of the module attached\n",
|
||||
TYPE_FILE_NAME));
|
||||
return -1;
|
||||
sprintf(mess,
|
||||
"Could not open file %s to get type of the module attached\n",
|
||||
TYPE_FILE_NAME);
|
||||
return FAIL;
|
||||
}
|
||||
char buffer[MAX_STR_LENGTH];
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
fread(buffer, MAX_STR_LENGTH, sizeof(char), fd);
|
||||
fclose(fd);
|
||||
if (strlen(buffer) == 0) {
|
||||
LOG(logERROR,
|
||||
("Could not read file %s to get type of the module attached\n",
|
||||
TYPE_FILE_NAME));
|
||||
return -1;
|
||||
sprintf(mess,
|
||||
"Could not read file %s to get type of the module attached\n",
|
||||
TYPE_FILE_NAME);
|
||||
LOG(logERROR, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
int type = atoi(buffer);
|
||||
if (type > TYPE_NO_MODULE_STARTING_VAL) {
|
||||
LOG(logERROR,
|
||||
("No Module attached! Expected %d, %d or %d for Gotthard2, got "
|
||||
"%d\n",
|
||||
TYPE_GOTTHARD2_MODULE_VAL, TYPE_GOTTHARD2_25UM_MASTER_MODULE_VAL,
|
||||
TYPE_GOTTHARD2_25UM_SLAVE_MODULE_VAL, type));
|
||||
return -2;
|
||||
}
|
||||
|
||||
if (abs(type - TYPE_GOTTHARD2_25UM_MASTER_MODULE_VAL) <= TYPE_TOLERANCE) {
|
||||
LOG(logINFOBLUE, ("MASTER 25um Module\n"));
|
||||
master = 1;
|
||||
} else if (abs(type - TYPE_GOTTHARD2_25UM_SLAVE_MODULE_VAL) <=
|
||||
enum MASTERINDEX master = OW_MASTER;
|
||||
if (abs(type - TYPE_GOTTHARD2_25UM_MASTER_HD1_V1_VAL) <= TYPE_TOLERANCE) {
|
||||
LOG(logINFOBLUE, ("MASTER 25um Module (HDI v1.0)\n"));
|
||||
} else if (abs(type - TYPE_GOTTHARD2_25UM_MASTER_HD1_V2_VAL) <=
|
||||
TYPE_TOLERANCE) {
|
||||
master = 0;
|
||||
LOG(logINFOBLUE, ("SLAVE 25um Module\n"));
|
||||
LOG(logINFOBLUE, ("MASTER 25um Module (HDI v2.0)\n"));
|
||||
} else if (abs(type - TYPE_GOTTHARD2_25UM_SLAVE_HDI_V1_VAL) <=
|
||||
TYPE_TOLERANCE) {
|
||||
LOG(logINFOBLUE, ("SLAVE 25um Module (HDI v1.0)\n"));
|
||||
master = OW_SLAVE;
|
||||
} else if (abs(type - TYPE_GOTTHARD2_25UM_SLAVE_HDI_V2_VAL) <=
|
||||
TYPE_TOLERANCE) {
|
||||
LOG(logINFOBLUE, ("SLAVE 25um Module (HDI v2.0)\n"));
|
||||
master = OW_SLAVE;
|
||||
} else if (abs(type - TYPE_GOTTHARD2_MODULE_VAL) <= TYPE_TOLERANCE) {
|
||||
master = -1;
|
||||
LOG(logINFOBLUE, ("50um Module\n"));
|
||||
}
|
||||
// no module or invalid module
|
||||
else if (type > TYPE_NO_MODULE_STARTING_VAL) {
|
||||
sprintf(mess, "No Module attached! Run server with -nomodule.\n");
|
||||
LOG(logERROR, (mess));
|
||||
return FAIL;
|
||||
} else {
|
||||
LOG(logERROR,
|
||||
("Wrong Module attached! Expected %d, %d or %d for Gotthard2, got "
|
||||
"%d\n",
|
||||
TYPE_GOTTHARD2_MODULE_VAL, TYPE_GOTTHARD2_25UM_MASTER_MODULE_VAL,
|
||||
TYPE_GOTTHARD2_25UM_SLAVE_MODULE_VAL, type));
|
||||
sprintf(mess,
|
||||
"Wrong Module attached! Expected %d, %d, %d, %d or %d for "
|
||||
"Gotthard2, got %d\n",
|
||||
TYPE_GOTTHARD2_MODULE_VAL,
|
||||
TYPE_GOTTHARD2_25UM_MASTER_HD1_V1_VAL,
|
||||
TYPE_GOTTHARD2_25UM_SLAVE_HDI_V1_VAL,
|
||||
TYPE_GOTTHARD2_25UM_MASTER_HD1_V2_VAL,
|
||||
TYPE_GOTTHARD2_25UM_SLAVE_HDI_V2_VAL, type);
|
||||
LOG(logERROR, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
bus_w(CONFIG_REG, bus_r(CONFIG_REG) & ~CONFIG_HDI_MOD_ID_MSK);
|
||||
bus_w(CONFIG_REG, bus_r(CONFIG_REG) | ((type << CONFIG_HDI_MOD_ID_OFST) &
|
||||
CONFIG_HDI_MOD_ID_MSK));
|
||||
if (setMaster(master) == FAIL) {
|
||||
strcpy(mess, "Could not set to master/slave.");
|
||||
LOG(logERROR, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
return OK;
|
||||
|
@ -3,7 +3,7 @@
|
||||
#pragma once
|
||||
#include "sls/sls_detector_defs.h"
|
||||
|
||||
#define REQRD_FRMWRE_VRSN (0x210527)
|
||||
#define REQRD_FRMWRE_VRSN (0x220720)
|
||||
#define KERNEL_DATE_VRSN "Mon May 10 18:00:21 CEST 2021"
|
||||
#define ID_FILE "detid_gotthard2.txt"
|
||||
|
||||
@ -31,8 +31,10 @@
|
||||
#define ADU_MAX_BITS (12)
|
||||
#define MAX_FRAMES_IN_BURST_MODE (2720)
|
||||
#define TYPE_GOTTHARD2_MODULE_VAL (536)
|
||||
#define TYPE_GOTTHARD2_25UM_MASTER_MODULE_VAL (683)
|
||||
#define TYPE_GOTTHARD2_25UM_SLAVE_MODULE_VAL (704)
|
||||
#define TYPE_GOTTHARD2_25UM_MASTER_HD1_V1_VAL (683)
|
||||
#define TYPE_GOTTHARD2_25UM_SLAVE_HDI_V1_VAL (704)
|
||||
#define TYPE_GOTTHARD2_25UM_MASTER_HD1_V2_VAL (723)
|
||||
#define TYPE_GOTTHARD2_25UM_SLAVE_HDI_V2_VAL (747)
|
||||
#define TYPE_GOTTHARD2_MODULE_VAL (536)
|
||||
#define TYPE_TOLERANCE (5)
|
||||
#define TYPE_NO_MODULE_STARTING_VAL (800)
|
||||
@ -146,6 +148,9 @@ enum CLKINDEX {
|
||||
|
||||
enum PLLINDEX { READOUT_PLL, SYSTEM_PLL };
|
||||
|
||||
enum MASTERINDEX { MASTER_HARDWARE, OW_MASTER, OW_SLAVE };
|
||||
#define MASTER_NAMES "hardware (master/slave)", "master", "slave"
|
||||
|
||||
/** Chip Definitions */
|
||||
#define ASIC_ADDR_MAX_BITS (4)
|
||||
#define ASIC_CURRENT_INJECT_ADDR (0x9)
|
||||
|
Reference in New Issue
Block a user