Dev/xilinx ctb test (#942)

* voltage regulators only looks at dac and not at ctrl_reg

* xilinx: change dac max to 2048, setting dac ist not inverse conversion from dac to voltage anymore, but setting power is inverse, also there is max and min to power, a different min for vio and this is checked at funcs interface, not printign or converting to mv in dac for power regulators (as its conversion max and min are different)

* Use links for dacs/adc and adapt power rglt thresholds

* Remove wait for transceiver reset

* adc and dac device not used anymore and hence removed

* udp restucturing: arm has to be multiple of 16 and no byteswap in udp_gen, option to compile locally in arm architecture, memsize of the second udp memory has to be limited

---------

Co-authored-by: Martin Brückner <martin.brueckner@psi.ch>
This commit is contained in:
maliakal_d 2024-08-20 14:33:18 +02:00 committed by GitHub
parent 991a4115d4
commit b4533ac11f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
21 changed files with 255 additions and 236 deletions

View File

@ -473,8 +473,8 @@ void setupDetector() {
// hv // hv
DAC6571_SetDefines(HV_HARD_MAX_VOLTAGE, HV_DRIVER_FILE_NAME); DAC6571_SetDefines(HV_HARD_MAX_VOLTAGE, HV_DRIVER_FILE_NAME);
// dacs // dacs
LTC2620_D_SetDefines(DAC_MIN_MV, DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC, 1, LTC2620_D_SetDefines(DAC_MIN_MV, DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC, 0,
0, ""); "");
// on chip dacs // on chip dacs
ASIC_Driver_SetDefines(ONCHIP_DAC_DRIVER_FILE_NAME); ASIC_Driver_SetDefines(ONCHIP_DAC_DRIVER_FILE_NAME);
setTimingSource(DEFAULT_TIMING_SOURCE); setTimingSource(DEFAULT_TIMING_SOURCE);

View File

@ -486,8 +486,8 @@ void setupDetector() {
// hv // hv
DAC6571_SetDefines(HV_HARD_MAX_VOLTAGE, HV_DRIVER_FILE_NAME); DAC6571_SetDefines(HV_HARD_MAX_VOLTAGE, HV_DRIVER_FILE_NAME);
// dac // dac
LTC2620_D_SetDefines(DAC_MIN_MV, DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC, 1, LTC2620_D_SetDefines(DAC_MIN_MV, DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC, 0,
0, ""); "");
resetCore(); resetCore();
resetPeripheral(); resetPeripheral();

View File

@ -5,10 +5,12 @@
#include <inttypes.h> #include <inttypes.h>
void LTC2620_D_SetDefines(int hardMinV, int hardMaxV, char *driverfname, void LTC2620_D_SetDefines(int hardMinV, int hardMaxV, char *driverfname,
int numdacs, int numdevices, int startingDeviceIndex, int numdacs, int numpowers,
char *powerdownDriverfname); char *powerdownDriverfname);
int LTC2620_D_GetMaxNumSteps(); int LTC2620_D_GetMaxNumSteps();
int LTC2620_D_GetPowerDownValue(); int LTC2620_D_GetPowerDownValue();
int LTC2620_D_GetMinInput();
int LTC2620_D_GetMaxInput();
/** /**
* Convert voltage to dac units * Convert voltage to dac units

View File

@ -5,8 +5,8 @@
#include <sys/types.h> #include <sys/types.h>
int resetFPGA(char *mess); int resetFPGA(char *mess);
int loadDeviceTree(char *mess, int *adcDeviceIndex, int *dacDeviceIndex); int loadDeviceTree(char *mess);
int checksBeforeCreatingDeviceTree(char *mess); int checksBeforeCreatingDeviceTree(char *mess);
int createDeviceTree(char *mess); int createDeviceTree(char *mess);
int verifyDeviceTree(char *mess, int *adcDeviceIndex, int *dacDeviceIndex); int verifyDeviceTree(char *mess);

View File

@ -184,7 +184,7 @@ uint32_t readRegister16And32(uint32_t offset);
#if defined(XILINX_CHIPTESTBOARDD) #if defined(XILINX_CHIPTESTBOARDD)
void cleanFifos(); void cleanFifos();
void resetFlow(); void resetFlow();
int waitTranseiverReset(char *mess); int waitTransceiverReset(char *mess);
#ifdef VIRTUAL #ifdef VIRTUAL
void setTransceiverAlignment(int align); void setTransceiverAlignment(int align);
#endif #endif
@ -424,6 +424,8 @@ int getPower();
void setPower(enum DACINDEX ind, int val); void setPower(enum DACINDEX ind, int val);
void powerOff(); void powerOff();
#elif XILINX_CHIPTESTBOARDD #elif XILINX_CHIPTESTBOARDD
int isPowerValid(enum DACINDEX ind, int val);
int getPower(); int getPower();
void setPower(enum DACINDEX ind, int val); void setPower(enum DACINDEX ind, int val);
#endif #endif

View File

@ -9,6 +9,7 @@
/* LTC2620 DAC DEFINES */ /* LTC2620 DAC DEFINES */
#define LTC2620_D_PWR_DOWN_VAL (-100) #define LTC2620_D_PWR_DOWN_VAL (-100)
#define LTC2620_D_MIN_DAC_VAL (0)
#define LTC2620_D_MAX_DAC_VAL (4095) // 12 bits #define LTC2620_D_MAX_DAC_VAL (4095) // 12 bits
#define LTC2620_D_MAX_STEPS (LTC2620_D_MAX_DAC_VAL + 1) #define LTC2620_D_MAX_STEPS (LTC2620_D_MAX_DAC_VAL + 1)
@ -18,17 +19,15 @@ int LTC2620_D_HardMaxVoltage = 0;
char LTC2620_D_DriverFileName[MAX_STR_LENGTH]; char LTC2620_D_DriverFileName[MAX_STR_LENGTH];
char LTC2620_D_PowerDownDriverFileName[MAX_STR_LENGTH]; char LTC2620_D_PowerDownDriverFileName[MAX_STR_LENGTH];
int LTC2620_D_NumDacs = 0; int LTC2620_D_NumDacs = 0;
int LTC2620_D_NumDevices = 0; int LTC2620_D_NumDacsOnly = 0;
int LTC2620_D_NumChannelsPerDevice = 0;
int LTC2620_D_DacDriverStartingDeviceIndex = 0;
void LTC2620_D_SetDefines(int hardMinV, int hardMaxV, char *driverfname, void LTC2620_D_SetDefines(int hardMinV, int hardMaxV, char *driverfname,
int numdacs, int numdevices, int startingDeviceIndex, int numdacs, int numpowers,
char *powerdownDriverfname) { char *powerdownDriverfname) {
LOG(logINFOBLUE, LOG(logINFOBLUE,
("Configuring DACs (LTC2620) to %s\n\t (numdacs:%d, hard min:%d, hard " ("Configuring DACs (LTC2620) to %s\n\t (numdacs:%d, hard min:%d, hard "
"max: %dmV, idev:%d)\n", "max: %dmV)\n",
driverfname, numdacs, hardMinV, hardMaxV, startingDeviceIndex)); driverfname, numdacs, hardMinV, hardMaxV));
LTC2620_D_HardMinVoltage = hardMinV; LTC2620_D_HardMinVoltage = hardMinV;
LTC2620_D_HardMaxVoltage = hardMaxV; LTC2620_D_HardMaxVoltage = hardMaxV;
memset(LTC2620_D_DriverFileName, 0, MAX_STR_LENGTH); memset(LTC2620_D_DriverFileName, 0, MAX_STR_LENGTH);
@ -36,15 +35,17 @@ void LTC2620_D_SetDefines(int hardMinV, int hardMaxV, char *driverfname,
memset(LTC2620_D_PowerDownDriverFileName, 0, MAX_STR_LENGTH); memset(LTC2620_D_PowerDownDriverFileName, 0, MAX_STR_LENGTH);
strcpy(LTC2620_D_PowerDownDriverFileName, powerdownDriverfname); strcpy(LTC2620_D_PowerDownDriverFileName, powerdownDriverfname);
LTC2620_D_NumDacs = numdacs; LTC2620_D_NumDacs = numdacs;
LTC2620_D_NumDevices = numdevices; LTC2620_D_NumDacsOnly = numdacs - numpowers;
LTC2620_D_NumChannelsPerDevice = LTC2620_D_NumDacs / LTC2620_D_NumDevices;
LTC2620_D_DacDriverStartingDeviceIndex = startingDeviceIndex;
} }
int LTC2620_D_GetMaxNumSteps() { return LTC2620_D_MAX_STEPS; } int LTC2620_D_GetMaxNumSteps() { return LTC2620_D_MAX_STEPS; }
int LTC2620_D_GetPowerDownValue() { return LTC2620_D_PWR_DOWN_VAL; } int LTC2620_D_GetPowerDownValue() { return LTC2620_D_PWR_DOWN_VAL; }
int LTC2620_D_GetMinInput() { return LTC2620_D_MIN_DAC_VAL; }
int LTC2620_D_GetMaxInput() { return LTC2620_D_MAX_DAC_VAL; }
int LTC2620_D_VoltageToDac(int voltage, int *dacval) { int LTC2620_D_VoltageToDac(int voltage, int *dacval) {
return ConvertToDifferentRange(LTC2620_D_HardMinVoltage, return ConvertToDifferentRange(LTC2620_D_HardMinVoltage,
LTC2620_D_HardMaxVoltage, 0, LTC2620_D_HardMaxVoltage, 0,
@ -94,7 +95,10 @@ int LTC2620_D_SetDACValue(int dacnum, int val, int mV, char *dacname,
int dacmV = val; int dacmV = val;
if (mV) { if (mV) {
ret = LTC2620_D_VoltageToDac(val, dacval); ret = LTC2620_D_VoltageToDac(val, dacval);
} else if (val >= 0) { }
// mV only for print out (dont convert to mV for power regulators)
else if (val >= 0 && dacnum < LTC2620_D_NumDacsOnly) {
// do not convert power down dac val // do not convert power down dac val
ret = LTC2620_D_DacToVoltage(val, &dacmV); ret = LTC2620_D_DacToVoltage(val, &dacmV);
} }
@ -109,8 +113,16 @@ int LTC2620_D_SetDACValue(int dacnum, int val, int mV, char *dacname,
// print and set // print and set
#ifdef XILINX_CHIPTESTBOARDD #ifdef XILINX_CHIPTESTBOARDD
if (*dacval >= 0) { if (*dacval >= 0) {
LOG(logINFO, ("Setting DAC %2d [%-6s] : %d dac (%d mV)\n", dacnum, // also print mV
dacname, *dacval, dacmV)); if (dacnum < LTC2620_D_NumDacsOnly) {
LOG(logINFO, ("Setting DAC %2d [%-6s] : %d dac (%d mV)\n",
dacnum, dacname, *dacval, dacmV));
}
// do not print mV for power regulators
else {
LOG(logINFO, ("Setting Power DAC%2d [%-6s] : %d dac \n", dacnum,
dacname, *dacval));
}
} }
#else #else
if ((*dacval >= 0) || (*dacval == LTC2620_D_PWR_DOWN_VAL)) { if ((*dacval >= 0) || (*dacval == LTC2620_D_PWR_DOWN_VAL)) {
@ -125,10 +137,7 @@ int LTC2620_D_SetDACValue(int dacnum, int val, int mV, char *dacname,
char fname[MAX_STR_LENGTH]; char fname[MAX_STR_LENGTH];
memset(fname, 0, MAX_STR_LENGTH); memset(fname, 0, MAX_STR_LENGTH);
#ifdef XILINX_CHIPTESTBOARDD #ifdef XILINX_CHIPTESTBOARDD
int idev = LTC2620_D_DacDriverStartingDeviceIndex + sprintf(fname, fnameFormat, dacnum);
(dacnum / LTC2620_D_NumChannelsPerDevice);
int idac = dacnum % LTC2620_D_NumChannelsPerDevice;
sprintf(fname, fnameFormat, idev, idac);
#else #else
sprintf(fname, "%s%d", fnameFormat, dacnum); sprintf(fname, "%s%d", fnameFormat, dacnum);
#endif #endif

View File

@ -13,9 +13,9 @@
/* global variables */ /* global variables */
#define CSP0 (0xB0080000) #define CSP0 (0xB0080000)
#define CSP1 (0xB0050000) // udp #define CSP1 (0xB0050000) // udp
#define MEM_SIZE (0x10000) #define MEM_SIZE_CSP0 (0x10000)
//#define MEM_SIZE_CSP0 (4096) #define MEM_SIZE_CSP1 (0x2000) // smaller size for udp
//#define MEM_SIZE_CSP1 (2 * 4096)
u_int32_t *csp0base = 0; u_int32_t *csp0base = 0;
u_int32_t *csp1base = 0; u_int32_t *csp1base = 0;
@ -52,6 +52,7 @@ u_int32_t writeRegister(u_int32_t offset, u_int32_t data) {
int mapCSP0(void) { int mapCSP0(void) {
u_int32_t csps[2] = {CSP0, CSP1}; u_int32_t csps[2] = {CSP0, CSP1};
u_int32_t **cspbases[2] = {&csp0base, &csp1base}; u_int32_t **cspbases[2] = {&csp0base, &csp1base};
u_int32_t memsize[2] = {MEM_SIZE_CSP0, MEM_SIZE_CSP1};
char names[2][10] = {"csp0base", "csp1base"}; char names[2][10] = {"csp0base", "csp1base"};
for (int i = 0; i < 2; ++i) { for (int i = 0; i < 2; ++i) {
@ -59,10 +60,10 @@ int mapCSP0(void) {
if (*cspbases[i] == 0) { if (*cspbases[i] == 0) {
LOG(logINFO, ("Mapping memory for %s\n", names[i])); LOG(logINFO, ("Mapping memory for %s\n", names[i]));
#ifdef VIRTUAL #ifdef VIRTUAL
*cspbases[i] = malloc(MEM_SIZE); *cspbases[i] = malloc(memsize[i]);
if (*cspbases[i] == NULL) { if (*cspbases[i] == NULL) {
LOG(logERROR, LOG(logERROR,
("Could not allocate virtual memory for %s.\n", names[i])); ("Could not allocate virtual memory of size %d for %s.\n", memsize[i], names[i]));
return FAIL; return FAIL;
} }
LOG(logINFO, ("memory allocated for %s\n", names[i])); LOG(logINFO, ("memory allocated for %s\n", names[i]));
@ -75,15 +76,15 @@ int mapCSP0(void) {
LOG(logDEBUG1, LOG(logDEBUG1,
("/dev/mem opened for %s, (CSP:0x%x)\n", names[i], csps[i])); ("/dev/mem opened for %s, (CSP:0x%x)\n", names[i], csps[i]));
*cspbases[i] = *cspbases[i] =
(u_int32_t *)mmap(0, MEM_SIZE, PROT_READ | PROT_WRITE, (u_int32_t *)mmap(0, memsize[i], PROT_READ | PROT_WRITE,
MAP_FILE | MAP_SHARED, fd, csps[i]); MAP_FILE | MAP_SHARED, fd, csps[i]);
if (*cspbases[i] == MAP_FAILED) { if (*cspbases[i] == MAP_FAILED) {
LOG(logERROR, ("Can't map memmory area for %s\n", names[i])); LOG(logERROR, ("Can't map memmory area for %s\n", names[i]));
return FAIL; return FAIL;
} }
#endif #endif
LOG(logINFO, ("%s mapped from %p to %p,(CSP:0x%x) \n", names[i], LOG(logINFO, ("%s mapped of size %d from %p to %p,(CSP:0x%x) \n", names[i], memsize[i],
*cspbases[i], *cspbases[i] + MEM_SIZE, csps[i])); *cspbases[i], *cspbases[i] + memsize[i], csps[i]));
// LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG))); // LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG)));
} else } else
LOG(logINFO, ("Memory %s already mapped before\n", names[i])); LOG(logINFO, ("Memory %s already mapped before\n", names[i]));

View File

@ -35,8 +35,8 @@ int resetFPGA(char *mess) {
return OK; return OK;
} }
int loadDeviceTree(char *mess, int *adcDeviceIndex, int *dacDeviceIndex) { int loadDeviceTree(char *mess) {
if (verifyDeviceTree(mess, adcDeviceIndex, dacDeviceIndex) == OK) if (verifyDeviceTree(mess) == OK)
return OK; return OK;
if (checksBeforeCreatingDeviceTree(mess) == FAIL) if (checksBeforeCreatingDeviceTree(mess) == FAIL)
@ -45,7 +45,7 @@ int loadDeviceTree(char *mess, int *adcDeviceIndex, int *dacDeviceIndex) {
if (createDeviceTree(mess) == FAIL) if (createDeviceTree(mess) == FAIL)
return FAIL; return FAIL;
if (verifyDeviceTree(mess, adcDeviceIndex, dacDeviceIndex) == FAIL) { if (verifyDeviceTree(mess) == FAIL) {
LOG(logERROR, ("Device tree loading failed at verification\n")); LOG(logERROR, ("Device tree loading failed at verification\n"));
return FAIL; return FAIL;
} }
@ -129,10 +129,8 @@ int createDeviceTree(char *mess) {
return OK; return OK;
} }
int verifyDeviceTree(char *mess, int *adcDeviceIndex, int *dacDeviceIndex) { int verifyDeviceTree(char *mess) {
LOG(logINFOBLUE, ("Verifying Device Tree...\n")); LOG(logINFOBLUE, ("Verifying Device Tree...\n"));
*adcDeviceIndex = 1;
*dacDeviceIndex = 2;
#ifndef VIRTUAL #ifndef VIRTUAL
// check if iio:device0-4 exists in device tree destination // check if iio:device0-4 exists in device tree destination
@ -170,8 +168,6 @@ int verifyDeviceTree(char *mess, int *adcDeviceIndex, int *dacDeviceIndex) {
strstr(retvals, deviceNames[hardcodedDeviceIndex + 1]) != strstr(retvals, deviceNames[hardcodedDeviceIndex + 1]) !=
NULL) { NULL) {
++hardcodedDeviceIndex; ++hardcodedDeviceIndex;
*adcDeviceIndex = 4;
*dacDeviceIndex = 1;
} else { } else {
snprintf( snprintf(
mess, MAX_STR_LENGTH, mess, MAX_STR_LENGTH,
@ -188,9 +184,6 @@ int verifyDeviceTree(char *mess, int *adcDeviceIndex, int *dacDeviceIndex) {
hardcodedDeviceIndex = 1; hardcodedDeviceIndex = 1;
} }
#endif #endif
LOG(logINFOBLUE, ("Device tree verified successfully [temp: 0, adc:%d, " LOG(logINFOBLUE, ("Device tree verified successfully\n"));
"dac:%d, %d, %d]\n",
*adcDeviceIndex, *dacDeviceIndex, *dacDeviceIndex + 1,
*dacDeviceIndex + 2));
return OK; return OK;
} }

View File

@ -1297,7 +1297,7 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) {
ind, getVLimit()); ind, getVLimit());
LOG(logERROR, (mess)); LOG(logERROR, (mess));
} }
#ifdef CHIPTESTBOARDD
else if (!isPowerValid(serverDacIndex, val)) { else if (!isPowerValid(serverDacIndex, val)) {
ret = FAIL; ret = FAIL;
sprintf( sprintf(
@ -1306,10 +1306,14 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) {
"should be between %d and %d mV\n", "should be between %d and %d mV\n",
ind, ind,
(serverDacIndex == D_PWR_IO ? VIO_MIN_MV : POWER_RGLTR_MIN), (serverDacIndex == D_PWR_IO ? VIO_MIN_MV : POWER_RGLTR_MIN),
#ifdef CHIPTESTBOARDD
(VCHIP_MAX_MV - VCHIP_POWER_INCRMNT)); (VCHIP_MAX_MV - VCHIP_POWER_INCRMNT));
#else
POWER_RGLTR_MAX);
#endif
LOG(logERROR, (mess)); LOG(logERROR, (mess));
} }
#endif
else { else {
setPower(serverDacIndex, val); setPower(serverDacIndex, val);
} }
@ -2022,105 +2026,101 @@ int acquire(int blocking, int file_des) {
#if defined(JUNGFRAUD) #if defined(JUNGFRAUD)
// chipv1.1 has to be configured before acquisition // chipv1.1 has to be configured before acquisition
if (getChipVersion() == 11 && !isChipConfigured()) { if (getChipVersion() == 11 && !isChipConfigured()) {
ret = FAIL; ret = FAIL;
strcpy(mess, strcpy(mess, "Could not start acquisition. Chip is not configured. "
"Could not start acquisition. Chip is not configured. " "Power it on to configure it.\n");
"Power it on to configure it.\n"); LOG(logERROR, (mess));
LOG(logERROR, (mess)); } else
} else
#endif #endif
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) #if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
if ((getReadoutMode() == ANALOG_AND_DIGITAL || if ((getReadoutMode() == ANALOG_AND_DIGITAL ||
getReadoutMode() == ANALOG_ONLY) && getReadoutMode() == ANALOG_ONLY) &&
(getNumAnalogSamples() <= 0)) { (getNumAnalogSamples() <= 0)) {
ret = FAIL; ret = FAIL;
sprintf(mess, sprintf(mess,
"Could not start acquisition. Invalid number of analog " "Could not start acquisition. Invalid number of analog "
"samples: %d.\n", "samples: %d.\n",
getNumAnalogSamples()); getNumAnalogSamples());
LOG(logERROR, (mess)); LOG(logERROR, (mess));
} else if ((getReadoutMode() == ANALOG_AND_DIGITAL || } else if ((getReadoutMode() == ANALOG_AND_DIGITAL ||
getReadoutMode() == DIGITAL_ONLY || getReadoutMode() == DIGITAL_ONLY ||
getReadoutMode() == DIGITAL_AND_TRANSCEIVER) && getReadoutMode() == DIGITAL_AND_TRANSCEIVER) &&
(getNumDigitalSamples() <= 0)) { (getNumDigitalSamples() <= 0)) {
ret = FAIL; ret = FAIL;
sprintf( sprintf(mess,
mess,
"Could not start acquisition. Invalid number of digital " "Could not start acquisition. Invalid number of digital "
"samples: %d.\n", "samples: %d.\n",
getNumDigitalSamples()); getNumDigitalSamples());
LOG(logERROR, (mess)); LOG(logERROR, (mess));
} else if ((getReadoutMode() == TRANSCEIVER_ONLY || } else if ((getReadoutMode() == TRANSCEIVER_ONLY ||
getReadoutMode() == DIGITAL_AND_TRANSCEIVER) && getReadoutMode() == DIGITAL_AND_TRANSCEIVER) &&
(getNumTransceiverSamples() <= 0)) { (getNumTransceiverSamples() <= 0)) {
ret = FAIL; ret = FAIL;
sprintf(mess, sprintf(mess,
"Could not start acquisition. Invalid number of " "Could not start acquisition. Invalid number of "
"transceiver " "transceiver "
"samples: %d.\n", "samples: %d.\n",
getNumTransceiverSamples()); getNumTransceiverSamples());
LOG(logERROR, (mess)); LOG(logERROR, (mess));
} else } else
#endif #endif
#ifdef EIGERD #ifdef EIGERD
// check for hardware mac and hardware ip // check for hardware mac and hardware ip
if (udpDetails[0].srcmac != getDetectorMAC()) { if (udpDetails[0].srcmac != getDetectorMAC()) {
ret = FAIL; ret = FAIL;
uint64_t sourcemac = getDetectorMAC(); uint64_t sourcemac = getDetectorMAC();
char src_mac[MAC_ADDRESS_SIZE]; char src_mac[MAC_ADDRESS_SIZE];
getMacAddressinString(src_mac, MAC_ADDRESS_SIZE, sourcemac); getMacAddressinString(src_mac, MAC_ADDRESS_SIZE, sourcemac);
sprintf(mess, sprintf(mess,
"Invalid udp source mac address for this detector. " "Invalid udp source mac address for this detector. "
"Must be " "Must be "
"same as hardware detector mac address %s\n", "same as hardware detector mac address %s\n",
src_mac); src_mac);
LOG(logERROR, (mess)); LOG(logERROR, (mess));
} else if (!enableTenGigabitEthernet(GET_FLAG) && } else if (!enableTenGigabitEthernet(GET_FLAG) &&
(udpDetails[0].srcip != getDetectorIP())) { (udpDetails[0].srcip != getDetectorIP())) {
ret = FAIL; ret = FAIL;
uint32_t sourceip = getDetectorIP(); uint32_t sourceip = getDetectorIP();
char src_ip[INET_ADDRSTRLEN]; char src_ip[INET_ADDRSTRLEN];
getIpAddressinString(src_ip, sourceip); getIpAddressinString(src_ip, sourceip);
sprintf( sprintf(mess,
mess, "Invalid udp source ip address for this detector. Must "
"Invalid udp source ip address for this detector. Must " "be "
"be " "same as hardware detector ip address %s in 1G readout "
"same as hardware detector ip address %s in 1G readout " "mode \n",
"mode \n", src_ip);
src_ip); LOG(logERROR, (mess));
LOG(logERROR, (mess)); } else
} else
#endif #endif
if (configured == FAIL) { if (configured == FAIL) {
ret = FAIL; ret = FAIL;
strcpy(mess, "Could not start acquisition because "); strcpy(mess, "Could not start acquisition because ");
strcat(mess, configureMessage); strcat(mess, configureMessage);
LOG(logERROR, (mess)); LOG(logERROR, (mess));
} else if (sharedMemory_getScanStatus() == RUNNING) { } else if (sharedMemory_getScanStatus() == RUNNING) {
ret = FAIL; ret = FAIL;
strcpy(mess, strcpy(mess, "Could not start acquisition because a scan is "
"Could not start acquisition because a scan is " "already running!\n");
"already running!\n"); LOG(logERROR, (mess));
LOG(logERROR, (mess)); } else {
} else { memset(scanErrMessage, 0, MAX_STR_LENGTH);
memset(scanErrMessage, 0, MAX_STR_LENGTH); sharedMemory_setScanStop(0);
sharedMemory_setScanStop(0); sharedMemory_setScanStatus(IDLE); // if it was error
sharedMemory_setScanStatus(IDLE); // if it was error if (pthread_create(&pthread_tid, NULL, &start_state_machine,
if (pthread_create(&pthread_tid, NULL, &start_state_machine, &blocking)) {
&blocking)) { ret = FAIL;
ret = FAIL; strcpy(mess, "Could not start acquisition thread!\n");
strcpy(mess, "Could not start acquisition thread!\n"); LOG(logERROR, (mess));
LOG(logERROR, (mess)); } else {
} else { // wait for blocking always (scan or not)
// wait for blocking always (scan or not) // non blocking-no scan also wait (for error message)
// non blocking-no scan also wait (for error message) // non blcoking-scan dont wait (there is
// non blcoking-scan dont wait (there is // scanErrorMessage)
// scanErrorMessage) if (blocking || !scan) {
if (blocking || !scan) { pthread_join(pthread_tid, NULL);
pthread_join(pthread_tid, NULL);
}
}
} }
}
}
} }
return Server_SendResult(file_des, INT32, NULL, 0); return Server_SendResult(file_des, INT32, NULL, 0);
} }

View File

@ -23,6 +23,10 @@ SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(m
OBJS = $(SRCS:.c=.o) OBJS = $(SRCS:.c=.o)
all: clean $(PROGS) all: clean $(PROGS)
local: CC := gcc
local: clean $(PROGS)
version: clean versioning $(PROGS) version: clean versioning $(PROGS)
boot: $(OBJS) boot: $(OBJS)

View File

@ -39,8 +39,6 @@ char initErrorMessage[MAX_STR_LENGTH];
int detPos[2] = {0, 0}; int detPos[2] = {0, 0};
int adcDeviceIndex = 0;
int dacDeviceIndex = 0;
int chipConfigured = 0; int chipConfigured = 0;
int analogEnable = 0; int analogEnable = 0;
int digitalEnable = 0; int digitalEnable = 0;
@ -75,8 +73,7 @@ void basictests() {
return; return;
} }
initError = initError = loadDeviceTree(initErrorMessage);
loadDeviceTree(initErrorMessage, &adcDeviceIndex, &dacDeviceIndex);
if (initError == FAIL) { if (initError == FAIL) {
return; return;
} }
@ -390,19 +387,18 @@ void setupDetector() {
initializePatternWord(); initializePatternWord();
#endif #endif
// initialization only at start up (restart fpga) // initialization only at start up (restart fpga)
initError = waitTranseiverReset(initErrorMessage); // initError = waitTransceiverReset(initErrorMessage);
if (initError == FAIL) { // if (initError == FAIL) {
return; // return;
} // }
// power off chip // // power off chip
initError = powerChip(0, initErrorMessage); initError = powerChip(0, initErrorMessage);
if (initError == FAIL) { // if (initError == FAIL) {
return; // return;
} // }
LTC2620_D_SetDefines(DAC_MAX_MV, DAC_MIN_MV, DAC_DRIVER_FILE_NAME, NDAC, LTC2620_D_SetDefines(DAC_MIN_MV, DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC,
DAC_DRIVER_NUM_DEVICES, dacDeviceIndex, NPWR, DAC_POWERDOWN_DRIVER_FILE_NAME);
DAC_POWERDOWN_DRIVER_FILE_NAME);
LOG(logINFOBLUE, ("Powering down all dacs\n")); LOG(logINFOBLUE, ("Powering down all dacs\n"));
for (int idac = 0; idac < NDAC; ++idac) { for (int idac = 0; idac < NDAC; ++idac) {
setDAC(idac, LTC2620_D_GetPowerDownValue(), 0); setDAC(idac, LTC2620_D_GetPowerDownValue(), 0);
@ -458,7 +454,7 @@ void resetFlow() {
bus_w(FLOW_CONTROL_REG, bus_r(FLOW_CONTROL_REG) & ~RST_F_MSK); bus_w(FLOW_CONTROL_REG, bus_r(FLOW_CONTROL_REG) & ~RST_F_MSK);
} }
int waitTranseiverReset(char *mess) { int waitTransceiverReset(char *mess) {
#ifndef VIRTUAL #ifndef VIRTUAL
int resetTransceiverDone = (bus_r(TRANSCEIVERSTATUS) & RESETRXDONE_MSK); int resetTransceiverDone = (bus_r(TRANSCEIVERSTATUS) & RESETRXDONE_MSK);
int times = 0; int times = 0;
@ -556,7 +552,7 @@ int powerChip(int on, char *mess) {
POWER_VCC_C_MSK | POWER_VCC_D_MSK; POWER_VCC_C_MSK | POWER_VCC_D_MSK;
if (on) { if (on) {
LOG(logINFOBLUE, ("Powering chip: on\n")); LOG(logINFOBLUE, ("Powering chip: on\n"));
bus_w(addr, bus_r(addr) & ~mask); bus_w(addr, bus_r(addr) | mask);
if (configureChip(mess) == FAIL) if (configureChip(mess) == FAIL)
return FAIL; return FAIL;
@ -566,7 +562,7 @@ int powerChip(int on, char *mess) {
chipConfigured = 1; chipConfigured = 1;
} else { } else {
LOG(logINFOBLUE, ("Powering chip: off\n")); LOG(logINFOBLUE, ("Powering chip: off\n"));
bus_w(addr, bus_r(addr) | mask); bus_w(addr, bus_r(addr) & ~mask);
chipConfigured = 0; chipConfigured = 0;
@ -588,7 +584,7 @@ int getPowerChip() {
uint32_t addr = CTRL_REG; uint32_t addr = CTRL_REG;
uint32_t mask = POWER_VIO_MSK | POWER_VCC_A_MSK | POWER_VCC_B_MSK | uint32_t mask = POWER_VIO_MSK | POWER_VCC_A_MSK | POWER_VCC_B_MSK |
POWER_VCC_C_MSK | POWER_VCC_D_MSK; POWER_VCC_C_MSK | POWER_VCC_D_MSK;
return (((bus_r(addr) & mask) == mask) ? 0 : 1); return (((bus_r(addr) & mask) == mask) ? 1 : 0);
} }
int configureChip(char *mess) { int configureChip(char *mess) {
@ -981,21 +977,8 @@ void setDAC(enum DACINDEX ind, int val, int mV) {
LOG(logDEBUG1, ("Setting dac[%d - %s]: %d %s \n", (int)ind, dacName, val, LOG(logDEBUG1, ("Setting dac[%d - %s]: %d %s \n", (int)ind, dacName, val,
(mV ? "mV" : "dac units"))); (mV ? "mV" : "dac units")));
int dacval = val; int dacval = val;
#ifdef VIRTUAL
LOG(logINFO, ("Setting dac[%d - %s]: %d %s \n", (int)ind, dacName, val,
(mV ? "mV" : "dac units")));
if (!mV) {
dacValues[ind] = val;
}
// convert to dac units
else if (LTC2620_D_VoltageToDac(val, &dacval) == OK) {
dacValues[ind] = dacval;
}
#else
if (LTC2620_D_SetDACValue((int)ind, val, mV, dacName, &dacval) == OK) if (LTC2620_D_SetDACValue((int)ind, val, mV, dacName, &dacval) == OK)
dacValues[ind] = dacval; dacValues[ind] = dacval;
#endif
} }
int getDAC(enum DACINDEX ind, int mV) { int getDAC(enum DACINDEX ind, int mV) {
@ -1045,74 +1028,91 @@ void setVLimit(int l) {
vLimit = l; vLimit = l;
} }
int getPower(enum DACINDEX ind) { int isPowerValid(enum DACINDEX ind, int val) {
// check power enable first char *powerNames[] = {PWR_NAMES};
uint32_t addr = CTRL_REG; int pwrIndex = (int)(ind - D_PWR_D);
uint32_t offset = POWER_VCC_A_OFST + (int)(D_PWR_A - ind);
if (ind == D_PWR_IO) int min = POWER_RGLTR_MIN;
offset = POWER_VIO_OFST; if (!strcmp(powerNames[pwrIndex], "IO")) {
uint32_t mask = (1 << offset); min = VIO_MIN_MV;
if ((bus_r(addr) & mask) != 0) { }
LOG(logINFO, ("Power for dac %d is off\n", ind));
// not power_rgltr_max because it is allowed only upto vchip max - 200
if (val != 0 && (val != LTC2620_D_GetPowerDownValue()) &&
(val < min || val > POWER_RGLTR_MAX)) {
LOG(logERROR,
("Invalid value of %d mV for Power V%s. Is not between %d and "
"%d mV\n",
val, powerNames[pwrIndex], min, POWER_RGLTR_MAX));
return 0; return 0;
} }
return 1;
}
int getPower(enum DACINDEX ind) {
char *powerNames[] = {PWR_NAMES};
int pwrIndex = (int)(ind - D_PWR_D);
// check dac value // check dac value
// not set yet // not set yet
if (dacValues[ind] == -1) { if (dacValues[ind] == -1) {
LOG(logERROR, LOG(logERROR,
("Power enabled, but unknown dac value for power index %d!", ind)); ("Unknown dac value for Power V%s!\n", powerNames[pwrIndex]));
return -1; return -1;
} }
// dac powered off // dac powered off
if (dacValues[ind] == LTC2620_D_GetPowerDownValue()) { if (dacValues[ind] == LTC2620_D_GetPowerDownValue()) {
LOG(logWARNING, LOG(logWARNING, ("Power V%s powered down\n", powerNames[pwrIndex]));
("Power %d enabled, dac value %d, voltage at minimum or 0\n", ind,
LTC2620_D_GetPowerDownValue()));
return LTC2620_D_GetPowerDownValue(); return LTC2620_D_GetPowerDownValue();
} }
// get dac in mV // get dac in mV
// (unless its a different voltage range compared to other dacs) int retval = -1;
return getDAC(ind, 1); ConvertToDifferentRange(LTC2620_D_GetMaxInput(), LTC2620_D_GetMinInput(),
POWER_RGLTR_MIN, POWER_RGLTR_MAX, dacValues[ind],
&retval);
return retval;
} }
void setPower(enum DACINDEX ind, int val) { void setPower(enum DACINDEX ind, int val) {
char *powerNames[] = {PWR_NAMES};
int pwrIndex = (int)(ind - D_PWR_D);
uint32_t addr = CTRL_REG; // power down dac
uint32_t offset = POWER_VCC_A_OFST + (int)(D_PWR_A - ind); if (val == LTC2620_D_GetPowerDownValue()) {
if (ind == D_PWR_IO) LOG(logINFO, ("\tPowering down V%d\n", powerNames[pwrIndex]));
offset = POWER_VIO_OFST;
uint32_t mask = (1 << offset);
if (val >= 0 || val == LTC2620_D_GetPowerDownValue()) {
if (val > 0) {
LOG(logINFO, ("Setting Power to %d mV\n", val));
}
// switch off power enable
LOG(logINFO, ("\tSwitching off enable for P%d (ctrl reg)\n",
(int)(ind - D_PWR_A)));
bus_w(addr, bus_r(addr) | mask);
// power down dac
LOG(logINFO, ("\tPowering down P%d\n", (int)(ind - D_PWR_A)));
setDAC(ind, LTC2620_D_GetPowerDownValue(), 0); setDAC(ind, LTC2620_D_GetPowerDownValue(), 0);
}
// set dac in mV // set dac
if (val > 0) { else if (val >= 0) {
LOG(logINFO, ("\tSetting Power P%d (DAC %d) to %d mV\n", LOG(logINFO,
(int)(ind - D_PWR_A), (int)ind, val)); ("Setting Power V%s to %d mV\n", powerNames[pwrIndex], val));
setDAC(ind, val, 1);
// validate value (already checked at tcp (funcs.c))
if (!isPowerValid(ind, val)) {
return;
} }
// switch on power enable // convert voltage to dac
if (getDAC(ind, 1) == val || val == LTC2620_D_GetPowerDownValue()) { int dacval = -1;
LOG(logINFO, ("\tSwitching on enable for P%d (ctrl reg)\n", if (ConvertToDifferentRange(
(int)(ind - D_PWR_A))); POWER_RGLTR_MIN, POWER_RGLTR_MAX, LTC2620_D_GetMaxInput(),
bus_w(addr, bus_r(addr) & ~mask); LTC2620_D_GetMinInput(), val, &dacval) == FAIL) {
LOG(logERROR,
("\tCannot convert Power V%s to dac value. Invalid value of %d "
"mV. Is not between "
"%d and %d mV\n",
powerNames[pwrIndex], val, POWER_RGLTR_MIN, POWER_RGLTR_MAX));
return;
} }
// set and power on/ update dac
LOG(logINFO, ("Setting Power V%s: %d mV (%d dac)\n",
powerNames[pwrIndex], val, dacval));
setDAC(ind, dacval, 0);
} }
} }
@ -1147,7 +1147,7 @@ int getSlowADC(int ichan, int *retval) {
#ifndef VIRTUAL #ifndef VIRTUAL
char fname[MAX_STR_LENGTH]; char fname[MAX_STR_LENGTH];
memset(fname, 0, MAX_STR_LENGTH); memset(fname, 0, MAX_STR_LENGTH);
sprintf(fname, SLOWADC_DRIVER_FILE_NAME, adcDeviceIndex, ichan); sprintf(fname, SLOWADC_DRIVER_FILE_NAME, ichan);
LOG(logDEBUG1, ("fname %s\n", fname)); LOG(logDEBUG1, ("fname %s\n", fname));
if (readParameterFromFile(fname, "slow adc", retval) == FAIL) { if (readParameterFromFile(fname, "slow adc", retval) == FAIL) {

View File

@ -25,15 +25,13 @@
#define DYNAMIC_RANGE (16) #define DYNAMIC_RANGE (16)
#define NUM_BYTES_PER_PIXEL (DYNAMIC_RANGE / 8) #define NUM_BYTES_PER_PIXEL (DYNAMIC_RANGE / 8)
#define DAC_DRIVER_NUM_DEVICES (3) #define DAC_DRIVER_FILE_NAME ("/root/apps/xilinx-ctb/current_board_links/ao%d")
#define DAC_DRIVER_FILE_NAME \
("/sys/bus/iio/devices/iio:device%d/out_voltage%d_raw")
#define DAC_POWERDOWN_DRIVER_FILE_NAME \ #define DAC_POWERDOWN_DRIVER_FILE_NAME \
("/sys/bus/iio/devices/iio:device%d/out_voltage%d_powerdown") ("/root/apps/xilinx-ctb/current_board_links/ao%d_pd")
#define SLOWADC_DRIVER_FILE_NAME \ #define SLOWADC_DRIVER_FILE_NAME \
("/sys/bus/iio/devices/iio:device%d/in_voltage%d_raw") ("/root/apps/xilinx-ctb/mythenIII_0.2_1.1/links/ai%d")
//#define SLOWDAC_CONVERTION_FACTOR_TO_UV (62.500953) // #define SLOWDAC_CONVERTION_FACTOR_TO_UV (62.500953)
#define TEMP_DRIVER_FILE_NAME \ #define TEMP_DRIVER_FILE_NAME \
("/sys/bus/iio/devices/iio:device0/in_temp7_input") ("/sys/bus/iio/devices/iio:device0/in_temp7_input")
@ -60,8 +58,11 @@
#define MAX_ANALOG_SAMPLES (0x3FFF) #define MAX_ANALOG_SAMPLES (0x3FFF)
#define MAX_DIGITAL_SAMPLES (0x3FFF) #define MAX_DIGITAL_SAMPLES (0x3FFF)
#define DAC_MIN_MV (0) #define DAC_MIN_MV (0)
#define DAC_MAX_MV (2500) #define DAC_MAX_MV (2048)
#define POWER_RGLTR_MIN (1041)
#define POWER_RGLTR_MAX (2661)
#define VIO_MIN_MV (1200) // for fpga to function
#define TICK_CLK (20) // MHz (trig_timeFromStart, frametime, timeFromStart) #define TICK_CLK (20) // MHz (trig_timeFromStart, frametime, timeFromStart)
#define RUN_CLK \ #define RUN_CLK \
@ -117,28 +118,35 @@ enum DACINDEX {
D_PWR_C D_PWR_C
}; };
#define PWR_NAMES "D", "_unknown", "IO", "A", "B", "C"
/* Struct Definitions */ /* Struct Definitions */
// For arm has to be multiple of 16
// We dont byteswap in the upd_gen so the order has to be different
typedef struct udp_header_struct { typedef struct udp_header_struct {
uint32_t udp_destmac_msb;
uint16_t udp_srcmac_msb; uint16_t udp_srcmac_msb;
uint16_t udp_destmac_lsb; uint16_t udp_destmac_lsb;
uint32_t udp_srcmac_lsb; uint32_t udp_destmac_msb;
uint8_t ip_tos; uint8_t ip_tos;
uint8_t ip_ihl : 4, ip_ver : 4; uint8_t ip_ihl : 4, ip_ver : 4;
uint16_t udp_ethertype; uint16_t udp_ethertype;
uint16_t ip_identification; uint32_t udp_srcmac_lsb;
uint16_t ip_totallength;
uint8_t ip_protocol; uint8_t ip_protocol;
uint8_t ip_ttl; uint8_t ip_ttl;
uint16_t ip_fragmentoffset : 13, ip_flags : 3; uint16_t ip_fragmentoffset : 13, ip_flags : 3;
uint16_t ip_srcip_msb; uint16_t ip_identification;
uint16_t ip_checksum; uint16_t ip_totallength;
uint16_t ip_destip_msb; uint16_t ip_destip_msb;
uint16_t ip_srcip_lsb; uint16_t ip_srcip_lsb;
uint16_t udp_srcport; uint16_t ip_srcip_msb;
uint16_t ip_destip_lsb; uint16_t ip_checksum;
uint16_t udp_checksum; uint16_t udp_checksum;
uint16_t udp_destport; uint16_t udp_destport;
uint16_t udp_srcport;
uint16_t ip_destip_lsb;
// padding
uint32_t padding0;
uint32_t padding1;
} udp_header; } udp_header;
#define IP_HEADER_SIZE (20) #define IP_HEADER_SIZE (20)

View File

@ -4,11 +4,11 @@
#define RELEASE "developer" #define RELEASE "developer"
#define APILIB "developer 0x230224" #define APILIB "developer 0x230224"
#define APIRECEIVER "developer 0x230224" #define APIRECEIVER "developer 0x230224"
#define APICTB "developer 0x240725" #define APICTB "developer 0x240820"
#define APIGOTTHARD "developer 0x240725" #define APIGOTTHARD "developer 0x240820"
#define APIJUNGFRAU "developer 0x240725" #define APIGOTTHARD2 "developer 0x240820"
#define APIMYTHEN3 "developer 0x240725" #define APIJUNGFRAU "developer 0x240820"
#define APIMOENCH "developer 0x240725" #define APIMYTHEN3 "developer 0x240820"
#define APIXILINXCTB "developer 0x240725" #define APIMOENCH "developer 0x240820"
#define APIEIGER "developer 0x240725" #define APIEIGER "developer 0x240820"
#define APIGOTTHARD2 "developer 0x240731" #define APIXILINXCTB "developer 0x240820"