mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-05-03 03:10:04 +02:00
* 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>
167 lines
5.4 KiB
C
167 lines
5.4 KiB
C
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
#include "LTC2620_Driver.h"
|
|
#include "clogger.h"
|
|
#include "common.h"
|
|
#include "sls/sls_detector_defs.h"
|
|
|
|
#include <string.h>
|
|
|
|
/* LTC2620 DAC DEFINES */
|
|
#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_STEPS (LTC2620_D_MAX_DAC_VAL + 1)
|
|
|
|
// defines from the fpga
|
|
int LTC2620_D_HardMinVoltage = 0;
|
|
int LTC2620_D_HardMaxVoltage = 0;
|
|
char LTC2620_D_DriverFileName[MAX_STR_LENGTH];
|
|
char LTC2620_D_PowerDownDriverFileName[MAX_STR_LENGTH];
|
|
int LTC2620_D_NumDacs = 0;
|
|
int LTC2620_D_NumDacsOnly = 0;
|
|
|
|
void LTC2620_D_SetDefines(int hardMinV, int hardMaxV, char *driverfname,
|
|
int numdacs, int numpowers,
|
|
char *powerdownDriverfname) {
|
|
LOG(logINFOBLUE,
|
|
("Configuring DACs (LTC2620) to %s\n\t (numdacs:%d, hard min:%d, hard "
|
|
"max: %dmV)\n",
|
|
driverfname, numdacs, hardMinV, hardMaxV));
|
|
LTC2620_D_HardMinVoltage = hardMinV;
|
|
LTC2620_D_HardMaxVoltage = hardMaxV;
|
|
memset(LTC2620_D_DriverFileName, 0, MAX_STR_LENGTH);
|
|
strcpy(LTC2620_D_DriverFileName, driverfname);
|
|
memset(LTC2620_D_PowerDownDriverFileName, 0, MAX_STR_LENGTH);
|
|
strcpy(LTC2620_D_PowerDownDriverFileName, powerdownDriverfname);
|
|
LTC2620_D_NumDacs = numdacs;
|
|
LTC2620_D_NumDacsOnly = numdacs - numpowers;
|
|
}
|
|
|
|
int LTC2620_D_GetMaxNumSteps() { return LTC2620_D_MAX_STEPS; }
|
|
|
|
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) {
|
|
return ConvertToDifferentRange(LTC2620_D_HardMinVoltage,
|
|
LTC2620_D_HardMaxVoltage, 0,
|
|
LTC2620_D_MAX_DAC_VAL, voltage, dacval);
|
|
}
|
|
|
|
int LTC2620_D_DacToVoltage(int dacval, int *voltage) {
|
|
return ConvertToDifferentRange(0, LTC2620_D_MAX_DAC_VAL,
|
|
LTC2620_D_HardMinVoltage,
|
|
LTC2620_D_HardMaxVoltage, dacval, voltage);
|
|
}
|
|
|
|
int LTC2620_D_SetDACValue(int dacnum, int val, int mV, char *dacname,
|
|
int *dacval) {
|
|
LOG(logDEBUG1, ("dacnum:%d, val:%d, ismV:%d\n", dacnum, val, mV));
|
|
|
|
// validate index
|
|
if (dacnum < 0 || dacnum >= LTC2620_D_NumDacs) {
|
|
LOG(logERROR, ("Dac index %d is out of bounds (0 to %d)\n", dacnum,
|
|
LTC2620_D_NumDacs - 1));
|
|
return FAIL;
|
|
}
|
|
|
|
// validate set
|
|
if (val < 0 && val != LTC2620_D_PWR_DOWN_VAL)
|
|
return FAIL;
|
|
|
|
int ret = OK;
|
|
*dacval = val;
|
|
#ifndef VIRTUAL
|
|
char fnameFormat[MAX_STR_LENGTH];
|
|
memset(fnameFormat, 0, MAX_STR_LENGTH);
|
|
strcpy(fnameFormat, LTC2620_D_DriverFileName);
|
|
#endif
|
|
|
|
// power down dac (different file name)
|
|
if (val == LTC2620_D_PWR_DOWN_VAL) {
|
|
#if defined(XILINX_CHIPTESTBOARDD) && !defined(VIRTUAL)
|
|
LOG(logINFO, ("Powering down DAC %2d [%-6s] \n", dacnum, dacname));
|
|
strcpy(fnameFormat, LTC2620_D_PowerDownDriverFileName);
|
|
#endif
|
|
}
|
|
|
|
// proper value to set
|
|
else {
|
|
// convert to dac or get mV value
|
|
int dacmV = val;
|
|
if (mV) {
|
|
ret = LTC2620_D_VoltageToDac(val, dacval);
|
|
}
|
|
|
|
// 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
|
|
ret = LTC2620_D_DacToVoltage(val, &dacmV);
|
|
}
|
|
|
|
// conversion out of bounds
|
|
if (ret == FAIL) {
|
|
LOG(logERROR, ("Setting Dac %d %s is out of bounds\n", dacnum,
|
|
(mV ? "mV" : "dac units")));
|
|
return FAIL;
|
|
}
|
|
|
|
// print and set
|
|
#ifdef XILINX_CHIPTESTBOARDD
|
|
if (*dacval >= 0) {
|
|
// also print mV
|
|
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
|
|
if ((*dacval >= 0) || (*dacval == LTC2620_D_PWR_DOWN_VAL)) {
|
|
LOG(logINFO, ("Setting DAC %2d [%-12s] : %d dac (%d mV)\n", dacnum,
|
|
dacname, *dacval, dacmV));
|
|
}
|
|
#endif
|
|
}
|
|
|
|
// set in file
|
|
#ifndef VIRTUAL
|
|
char fname[MAX_STR_LENGTH];
|
|
memset(fname, 0, MAX_STR_LENGTH);
|
|
#ifdef XILINX_CHIPTESTBOARDD
|
|
sprintf(fname, fnameFormat, dacnum);
|
|
#else
|
|
sprintf(fname, "%s%d", fnameFormat, dacnum);
|
|
#endif
|
|
LOG(logDEBUG1, ("fname %s\n", fname));
|
|
|
|
// open file
|
|
FILE *fd = fopen(fname, "w");
|
|
if (fd == NULL) {
|
|
LOG(logERROR, ("Could not open file %s for writing to set dac %d\n",
|
|
fname, dacnum));
|
|
return FAIL;
|
|
}
|
|
// convert to string, add 0 and write to file
|
|
#ifdef XILINX_CHIPTESTBOARDD
|
|
// not changing *dacval from -100 (cant write -100 to file: invalid arg)
|
|
int writeValue = *dacval;
|
|
if (writeValue == LTC2620_D_PWR_DOWN_VAL)
|
|
writeValue = 1;
|
|
fprintf(fd, "%d\n", writeValue);
|
|
#else
|
|
fprintf(fd, "%d\n", *dacval);
|
|
#endif
|
|
fclose(fd);
|
|
#endif
|
|
return OK;
|
|
}
|