mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2026-01-22 04:27:40 +01:00
fixed warnings, LTC2620 driver: removed power down file name as it is only for xilinx and must be combined to create it, refactored its setDAC to be maintainable, xilinx:setDAC andsetPower returns ret and calls LTC2620 directly (setDAC in xilinx is only for dac and not power regualtors anymore), validate vlimit again before calling LTC2620 setdac, fixed transceiveralignment with xilinx ctb, changed file names to not include %d because its only allowed in macros and not variables
This commit is contained in:
@@ -472,8 +472,7 @@ 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, 0,
|
LTC2620_D_SetDefines(DAC_MIN_MV, DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC, 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);
|
||||||
|
|||||||
@@ -485,8 +485,7 @@ 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, 0,
|
LTC2620_D_SetDefines(DAC_MIN_MV, DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC, 0);
|
||||||
"");
|
|
||||||
|
|
||||||
resetCore();
|
resetCore();
|
||||||
resetPeripheral();
|
resetPeripheral();
|
||||||
|
|||||||
@@ -5,8 +5,7 @@
|
|||||||
#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 numpowers,
|
int numdacs, int numpowers);
|
||||||
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_GetMinInput();
|
||||||
@@ -28,14 +27,12 @@ int LTC2620_D_VoltageToDac(int voltage, int *dacval);
|
|||||||
*/
|
*/
|
||||||
int LTC2620_D_DacToVoltage(int dacval, int *voltage);
|
int LTC2620_D_DacToVoltage(int dacval, int *voltage);
|
||||||
|
|
||||||
|
/** for all dacs including power regulators to write dac value to file */
|
||||||
|
int LTC2620_D_WriteDACValue(int dacnum, int dacvalue, char *dacname);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set value
|
* Set value for dac only
|
||||||
* @param dacnum dac index
|
* @param dacval if val is in mV, returns dac units set
|
||||||
* @param val value to set
|
|
||||||
* @param mV 1 for mv, else 0
|
|
||||||
* @paam dacname dac name
|
|
||||||
* @param dacval pointer to dac value
|
|
||||||
* @return OK or FAIL
|
|
||||||
*/
|
*/
|
||||||
int LTC2620_D_SetDACValue(int dacnum, int val, int mV, char *dacname,
|
int LTC2620_D_SetDACValue(int dacnum, int val, int mV, char *dacname,
|
||||||
int *dacval);
|
int *dacval);
|
||||||
@@ -3,7 +3,13 @@
|
|||||||
#include "LTC2620_Driver.h"
|
#include "LTC2620_Driver.h"
|
||||||
#include "clogger.h"
|
#include "clogger.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
// to include power down file name suffix
|
||||||
|
#ifdef XILINX_CHIPTESTBOARDD
|
||||||
|
#include "slsDetectorServer_defs.h"
|
||||||
|
#else
|
||||||
#include "sls/sls_detector_defs.h"
|
#include "sls/sls_detector_defs.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@@ -17,13 +23,11 @@
|
|||||||
int LTC2620_D_HardMinVoltage = 0;
|
int LTC2620_D_HardMinVoltage = 0;
|
||||||
int LTC2620_D_HardMaxVoltage = 0;
|
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];
|
|
||||||
int LTC2620_D_NumDacs = 0;
|
int LTC2620_D_NumDacs = 0;
|
||||||
int LTC2620_D_NumDacsOnly = 0;
|
int LTC2620_D_NumDacsOnly = 0;
|
||||||
|
|
||||||
void LTC2620_D_SetDefines(int hardMinV, int hardMaxV, char *driverfname,
|
void LTC2620_D_SetDefines(int hardMinV, int hardMaxV, char *driverfname,
|
||||||
int numdacs, int numpowers,
|
int numdacs, int numpowers) {
|
||||||
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)\n",
|
"max: %dmV)\n",
|
||||||
@@ -32,8 +36,6 @@ void LTC2620_D_SetDefines(int hardMinV, int hardMaxV, char *driverfname,
|
|||||||
LTC2620_D_HardMaxVoltage = hardMaxV;
|
LTC2620_D_HardMaxVoltage = hardMaxV;
|
||||||
memset(LTC2620_D_DriverFileName, 0, MAX_STR_LENGTH);
|
memset(LTC2620_D_DriverFileName, 0, MAX_STR_LENGTH);
|
||||||
strcpy(LTC2620_D_DriverFileName, driverfname);
|
strcpy(LTC2620_D_DriverFileName, driverfname);
|
||||||
memset(LTC2620_D_PowerDownDriverFileName, 0, MAX_STR_LENGTH);
|
|
||||||
strcpy(LTC2620_D_PowerDownDriverFileName, powerdownDriverfname);
|
|
||||||
LTC2620_D_NumDacs = numdacs;
|
LTC2620_D_NumDacs = numdacs;
|
||||||
LTC2620_D_NumDacsOnly = numdacs - numpowers;
|
LTC2620_D_NumDacsOnly = numdacs - numpowers;
|
||||||
}
|
}
|
||||||
@@ -58,9 +60,8 @@ int LTC2620_D_DacToVoltage(int dacval, int *voltage) {
|
|||||||
LTC2620_D_HardMaxVoltage, dacval, voltage);
|
LTC2620_D_HardMaxVoltage, dacval, voltage);
|
||||||
}
|
}
|
||||||
|
|
||||||
int LTC2620_D_SetDACValue(int dacnum, int val, int mV, char *dacname,
|
int LTC2620_D_WriteDACValue(int dacnum, int dacvalue, char *dacname) {
|
||||||
int *dacval) {
|
LOG(logDEBUG1, ("dacnum:%d, val:%d\n", dacnum, dacvalue));
|
||||||
LOG(logDEBUG1, ("dacnum:%d, val:%d, ismV:%d\n", dacnum, val, mV));
|
|
||||||
|
|
||||||
// validate index
|
// validate index
|
||||||
if (dacnum < 0 || dacnum >= LTC2620_D_NumDacs) {
|
if (dacnum < 0 || dacnum >= LTC2620_D_NumDacs) {
|
||||||
@@ -69,98 +70,114 @@ int LTC2620_D_SetDACValue(int dacnum, int val, int mV, char *dacname,
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// validate set
|
// validate value
|
||||||
if (val < 0 && val != LTC2620_D_PWR_DOWN_VAL)
|
if ((dacvalue < 0 && dacvalue != LTC2620_D_PWR_DOWN_VAL) ||
|
||||||
|
(dacvalue > LTC2620_D_MAX_DAC_VAL)) {
|
||||||
|
LOG(logERROR,
|
||||||
|
("Dac %d %s: Invalid dac value %d\n", dacnum, dacname, dacvalue));
|
||||||
return FAIL;
|
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
|
// print info
|
||||||
else {
|
if (dacvalue == LTC2620_D_PWR_DOWN_VAL) {
|
||||||
// convert to dac or get mV value
|
LOG(logDEBUG, ("\tPowering down DAC %2d [%-6s] \n", dacnum, dacname));
|
||||||
int dacmV = val;
|
} else {
|
||||||
if (mV) {
|
LOG(logINFO, ("\tSetting DAC %2d [%-6s] to %d dac units\n", dacnum,
|
||||||
ret = LTC2620_D_VoltageToDac(val, dacval);
|
dacname, dacvalue));
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
#ifdef VIRTUAL
|
||||||
#ifndef VIRTUAL
|
return OK;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// file name
|
||||||
char fname[MAX_STR_LENGTH];
|
char fname[MAX_STR_LENGTH];
|
||||||
memset(fname, 0, MAX_STR_LENGTH);
|
memset(fname, 0, MAX_STR_LENGTH);
|
||||||
|
snprintf(fname, MAX_STR_LENGTH, "%s%d", LTC2620_D_DriverFileName, dacnum);
|
||||||
#ifdef XILINX_CHIPTESTBOARDD
|
#ifdef XILINX_CHIPTESTBOARDD
|
||||||
sprintf(fname, fnameFormat, dacnum);
|
// different file for power down
|
||||||
#else
|
if (dacvalue == LTC2620_D_PWR_DOWN_VAL) {
|
||||||
sprintf(fname, "%s%d", fnameFormat, dacnum);
|
snprintf(fname, MAX_STR_LENGTH, "%s%d%s", LTC2620_D_DriverFileName,
|
||||||
|
dacnum, DAC_POWERDOWN_DRIVER_FILE_SUFFIX);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
LOG(logDEBUG1, ("fname %s\n", fname));
|
LOG(logDEBUG1, ("fname %s\n", fname));
|
||||||
|
|
||||||
// open file
|
// open file
|
||||||
FILE *fd = fopen(fname, "w");
|
FILE *fd = fopen(fname, "w");
|
||||||
if (fd == NULL) {
|
if (fd == NULL) {
|
||||||
LOG(logERROR, ("Could not open file %s for writing to set dac %d\n",
|
LOG(logERROR,
|
||||||
fname, dacnum));
|
("Could not open file %s for writing to set dac %d [%s] \n", fname,
|
||||||
|
dacnum, dacname));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
// convert to string, add 0 and write to file
|
|
||||||
#ifdef XILINX_CHIPTESTBOARDD
|
// write to file
|
||||||
// not changing *dacval from -100 (cant write -100 to file: invalid arg)
|
#ifndef XILINX_CHIPTESTBOARDD
|
||||||
int writeValue = *dacval;
|
fprintf(fd, "%d\n", dacvalue);
|
||||||
if (writeValue == LTC2620_D_PWR_DOWN_VAL)
|
|
||||||
writeValue = 1;
|
|
||||||
fprintf(fd, "%d\n", writeValue);
|
|
||||||
#else
|
#else
|
||||||
fprintf(fd, "%d\n", *dacval);
|
// cant write -100 to file: invalid arg
|
||||||
|
if (dacvalue == LTC2620_D_PWR_DOWN_VAL) {
|
||||||
|
fprintf(fd, "1\n");
|
||||||
|
} else {
|
||||||
|
fprintf(fd, "%d\n", dacvalue);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
fclose(fd);
|
fclose(fd);
|
||||||
#endif
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int LTC2620_D_SetDACValue(int dacnum, int val, int mV, char *dacname,
|
||||||
|
int *dacval) {
|
||||||
|
LOG(logDEBUG1,
|
||||||
|
("dacnum:%d (%s), val:%d, ismV:%d\n", dacnum, dacname, val, mV));
|
||||||
|
|
||||||
|
// invalid index
|
||||||
|
if (dacnum >= LTC2620_D_NumDacs) {
|
||||||
|
LOG(logERROR, ("Dac index %d is out of bounds (0 to %d)\n", dacnum,
|
||||||
|
LTC2620_D_NumDacs - 1));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mV && dacnum >= LTC2620_D_NumDacsOnly) {
|
||||||
|
LOG(logERROR, ("Cannot convert to dac units for power regulator %d %s "
|
||||||
|
"here. Expecting dac units here.\n",
|
||||||
|
dacnum, dacname));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*dacval = val;
|
||||||
|
if (val == LTC2620_D_GetPowerDownValue()) {
|
||||||
|
LOG(logINFO, ("\tPowering down DAC %2d [%-6s] \n", dacnum, dacname));
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// invalid negative value
|
||||||
|
if (val < 0) {
|
||||||
|
LOG(logERROR, ("Invalid value %d for dac[%d - %s]\n", val,
|
||||||
|
(int)dacnum, dacname));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert to dac units or mV (print)
|
||||||
|
if (dacnum < LTC2620_D_NumDacsOnly) {
|
||||||
|
int dacmV = val;
|
||||||
|
int ret = OK;
|
||||||
|
if (mV) {
|
||||||
|
ret = LTC2620_D_VoltageToDac(val, dacval);
|
||||||
|
} else {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
LOG(logINFO, ("Setting DAC %2d [%-6s] : %d dac (%d mV)\n", dacnum,
|
||||||
|
dacname, *dacval, dacmV));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return LTC2620_D_WriteDACValue(dacnum, *dacval, dacname);
|
||||||
|
}
|
||||||
|
|||||||
@@ -1405,11 +1405,13 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) {
|
|||||||
setDAC(serverDacIndex, val, mV, 0);
|
setDAC(serverDacIndex, val, mV, 0);
|
||||||
#elif defined(XILINX_CHIPTESTBOARDD)
|
#elif defined(XILINX_CHIPTESTBOARDD)
|
||||||
{
|
{
|
||||||
ret = setDAC(serverDacIndex, val, mV);
|
if (val != GET_FLAG) {
|
||||||
if (ret == FAIL) {
|
ret = setDAC(serverDacIndex, val, mV);
|
||||||
sprintf(mess, "Setting dac %d to value %d failed.\n",
|
if (ret == FAIL) {
|
||||||
serverDacIndex, val);
|
sprintf(mess, "Setting dac %d to value %d failed.\n",
|
||||||
LOG(logERROR, (mess));
|
serverDacIndex, val);
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|||||||
Binary file not shown.
@@ -404,7 +404,7 @@ void setupDetector() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
LTC2620_D_SetDefines(DAC_MIN_MV, DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC,
|
LTC2620_D_SetDefines(DAC_MIN_MV, DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC,
|
||||||
NPWR, DAC_POWERDOWN_DRIVER_FILE_NAME);
|
NPWR);
|
||||||
|
|
||||||
// power LTC2620 before talking to it:
|
// power LTC2620 before talking to it:
|
||||||
initError = XILINX_FMC_enable_all(initErrorMessage, MAX_STR_LENGTH);
|
initError = XILINX_FMC_enable_all(initErrorMessage, MAX_STR_LENGTH);
|
||||||
@@ -418,7 +418,7 @@ void setupDetector() {
|
|||||||
}
|
}
|
||||||
LOG(logINFOBLUE, ("Defaulting all power regulators to 0 mV.\n"));
|
LOG(logINFOBLUE, ("Defaulting all power regulators to 0 mV.\n"));
|
||||||
for (int idac = NDAC_ONLY; idac < NDAC; ++idac) {
|
for (int idac = NDAC_ONLY; idac < NDAC; ++idac) {
|
||||||
setDAC(idac, 0, 0);
|
setPower(idac, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
resetFlow();
|
resetFlow();
|
||||||
@@ -503,11 +503,9 @@ int waitTransceiverReset(char *mess) {
|
|||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
void setTransceiverAlignment(int align) {
|
void setTransceiverAlignment(int align) {
|
||||||
if (align) {
|
if (align) {
|
||||||
bus_w(TRANSCEIVERSTATUS,
|
bus_w(TRANSCEIVERSTATUS2, (bus_r(TRANSCEIVERSTATUS2) | RXLOCKED_MSK));
|
||||||
(bus_r(TRANSCEIVERSTATUS) | RXBYTEISALIGNED_MSK));
|
|
||||||
} else {
|
} else {
|
||||||
bus_w(TRANSCEIVERSTATUS,
|
bus_w(TRANSCEIVERSTATUS2, (bus_r(TRANSCEIVERSTATUS2) & ~RXLOCKED_MSK));
|
||||||
(bus_r(TRANSCEIVERSTATUS) & ~RXBYTEISALIGNED_MSK));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -515,14 +513,14 @@ void setTransceiverAlignment(int align) {
|
|||||||
int isTransceiverAligned() {
|
int isTransceiverAligned() {
|
||||||
int times = 0;
|
int times = 0;
|
||||||
int retval = bus_r(TRANSCEIVERSTATUS2) & RXLOCKED_MSK;
|
int retval = bus_r(TRANSCEIVERSTATUS2) & RXLOCKED_MSK;
|
||||||
while (retval) {
|
while (retval == 0u) {
|
||||||
retval = bus_r(TRANSCEIVERSTATUS2) & RXLOCKED_MSK;
|
|
||||||
times++;
|
times++;
|
||||||
usleep(10);
|
usleep(10);
|
||||||
if (times == 5)
|
if (times == 5)
|
||||||
return 1;
|
return 0;
|
||||||
|
retval = bus_r(TRANSCEIVERSTATUS2) & RXLOCKED_MSK;
|
||||||
}
|
}
|
||||||
return retval;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int waitTransceiverAligned(char *mess) {
|
int waitTransceiverAligned(char *mess) {
|
||||||
@@ -1153,40 +1151,43 @@ int64_t getMeasurementTime() {
|
|||||||
/* parameters - dac, adc, hv */
|
/* parameters - dac, adc, hv */
|
||||||
|
|
||||||
int setDAC(enum DACINDEX ind, int val, int mV) {
|
int setDAC(enum DACINDEX ind, int val, int mV) {
|
||||||
|
|
||||||
// Cannot use power down value for power regulators
|
|
||||||
if (val == LTC2620_D_GetPowerDownValue()) {
|
|
||||||
switch (ind) {
|
|
||||||
case D_PWR_D:
|
|
||||||
case D_PWR_EMPTY:
|
|
||||||
case D_PWR_IO:
|
|
||||||
case D_PWR_A:
|
|
||||||
case D_PWR_B:
|
|
||||||
case D_PWR_C:
|
|
||||||
LOG(logERROR, ("Cannot power down Power regulators.\n"));
|
|
||||||
return FAIL;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char dacName[MAX_STR_LENGTH] = {0};
|
char dacName[MAX_STR_LENGTH] = {0};
|
||||||
memset(dacName, 0, MAX_STR_LENGTH);
|
memset(dacName, 0, MAX_STR_LENGTH);
|
||||||
sprintf(dacName, "dac%d", (int)ind);
|
sprintf(dacName, "dac%d", (int)ind);
|
||||||
|
LOG(logDEBUG1, ("Setting dac[%d - %s]: %d %s \n", (int)ind, dacName, val,
|
||||||
|
(mV ? "mV" : "dac units")));
|
||||||
|
|
||||||
if (val < 0 && val != LTC2620_D_GetPowerDownValue()) {
|
// invalid index (only dacs, no power regulators)
|
||||||
LOG(logERROR,
|
if (ind >= NDAC_ONLY) {
|
||||||
("Invalid value %d for dac[%d - %s]\n", val, (int)ind, dacName));
|
LOG(logERROR, ("Invalid DAC index: %d\n", ind));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG(logDEBUG1, ("Setting dac[%d - %s]: %d %s \n", (int)ind, dacName, val,
|
// ensure vlimit compliance
|
||||||
(mV ? "mV" : "dac units")));
|
{
|
||||||
int dacval = val;
|
int dacmV = val;
|
||||||
|
if (!mV) {
|
||||||
|
// convert dac units to mV
|
||||||
|
if (LTC2620_D_DacToVoltage(val, &dacmV) == FAIL) {
|
||||||
|
LOG(logERROR, ("Could not convert %d dac units to mV for %s\n",
|
||||||
|
val, dacName));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (checkVLimitCompliant(dacmV) == FAIL) {
|
||||||
|
LOG(logERROR, ("Value %d mV exceeds vLimit of %d mV for "
|
||||||
|
"%s\n",
|
||||||
|
dacmV, vLimit, dacName));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set dac
|
||||||
|
int dacval = -1;
|
||||||
if (LTC2620_D_SetDACValue((int)ind, val, mV, dacName, &dacval) == FAIL)
|
if (LTC2620_D_SetDACValue((int)ind, val, mV, dacName, &dacval) == FAIL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
dacValues[ind] = dacval;
|
dacValues[ind] = dacval;
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1266,8 +1267,16 @@ int isPowerValid(enum DACINDEX ind, int val) {
|
|||||||
min = VIO_MIN_MV;
|
min = VIO_MIN_MV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check vlimit (already checked at funcs.c)
|
||||||
|
if (checkVLimitCompliant(val) == FAIL) {
|
||||||
|
LOG(logERROR,
|
||||||
|
("Invalid value of %d mV for Power V%s. Exceeds vLimit of %d mV\n",
|
||||||
|
val, powerNames[pwrIndex], vLimit));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// not power_rgltr_max because it is allowed only upto vchip max - 200
|
// not power_rgltr_max because it is allowed only upto vchip max - 200
|
||||||
if (val != 0 && (val < min || val > POWER_RGLTR_MAX)) {
|
if ((val != 0 && val < min) || val > POWER_RGLTR_MAX) {
|
||||||
LOG(logERROR,
|
LOG(logERROR,
|
||||||
("Invalid value of %d mV for Power V%s. Is not between %d and "
|
("Invalid value of %d mV for Power V%s. Is not between %d and "
|
||||||
"%d mV\n",
|
"%d mV\n",
|
||||||
@@ -1319,6 +1328,9 @@ int getPower(enum DACINDEX ind) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int setPower(enum DACINDEX ind, int val) {
|
int setPower(enum DACINDEX ind, int val) {
|
||||||
|
if (!isPowerValid(ind, val)) {
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
// validate index and get bit offset in ctrl register
|
// validate index and get bit offset in ctrl register
|
||||||
int bitOffset = getBitOffsetFromDACIndex(ind);
|
int bitOffset = getBitOffsetFromDACIndex(ind);
|
||||||
@@ -1332,22 +1344,17 @@ int setPower(enum DACINDEX ind, int val) {
|
|||||||
int pwrIndex = (int)(ind - D_PWR_D);
|
int pwrIndex = (int)(ind - D_PWR_D);
|
||||||
LOG(logINFO, ("Setting Power V%s to %d mV\n", powerNames[pwrIndex], val));
|
LOG(logINFO, ("Setting Power V%s to %d mV\n", powerNames[pwrIndex], val));
|
||||||
|
|
||||||
// validate value (already checked at tcp (funcs.c))
|
|
||||||
if (!isPowerValid(ind, val)) {
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Switch off power enable
|
// Switch off power enable
|
||||||
LOG(logDEBUG1, ("\tSwitching off power enable\n"));
|
LOG(logDEBUG1, ("\tSwitching off power enable\n"));
|
||||||
bus_w(addr, bus_r(addr) & ~(mask));
|
bus_w(addr, bus_r(addr) & ~(mask));
|
||||||
|
|
||||||
// power down dac (Cannot use power down value for power regulators)
|
// set dac value to 0
|
||||||
if (setDAC(ind, 0, 0) == FAIL) {
|
if (LTC2620_D_WriteDACValue((int)ind, 0, powerNames[pwrIndex]) == FAIL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
dacValues[ind] = 0;
|
||||||
|
|
||||||
// convert voltage to dac
|
if (val > 0) {
|
||||||
if (val != 0) {
|
// convert voltage to dac
|
||||||
int dacval = -1;
|
int dacval = -1;
|
||||||
if (ConvertToDifferentRange(
|
if (ConvertToDifferentRange(
|
||||||
POWER_RGLTR_MIN, POWER_RGLTR_MAX, LTC2620_D_GetMaxInput(),
|
POWER_RGLTR_MIN, POWER_RGLTR_MAX, LTC2620_D_GetMaxInput(),
|
||||||
@@ -1360,14 +1367,15 @@ int setPower(enum DACINDEX ind, int val) {
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set dac value
|
||||||
LOG(logINFO, ("\tSetting DAC V%s: %d mV (%d dac)\n",
|
LOG(logINFO, ("\tSetting DAC V%s: %d mV (%d dac)\n",
|
||||||
powerNames[pwrIndex], val, dacval));
|
powerNames[pwrIndex], val, dacval));
|
||||||
if (setDAC(ind, dacval, 0) == FAIL) {
|
if (LTC2620_D_WriteDACValue((int)ind, dacval, powerNames[pwrIndex]) ==
|
||||||
LOG(logERROR,
|
FAIL)
|
||||||
("Could not set dac for Power V%s\n", powerNames[pwrIndex]));
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
dacValues[ind] = dacval;
|
||||||
|
|
||||||
|
// Switch on power enable
|
||||||
LOG(logDEBUG1, ("\tSwitching on power enable for Power V%s\n",
|
LOG(logDEBUG1, ("\tSwitching on power enable for Power V%s\n",
|
||||||
powerNames[pwrIndex]));
|
powerNames[pwrIndex]));
|
||||||
bus_w(addr, bus_r(addr) | mask);
|
bus_w(addr, bus_r(addr) | mask);
|
||||||
@@ -1407,7 +1415,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, ichan);
|
sprintf(fname, "%s%d", 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) {
|
||||||
|
|||||||
@@ -35,10 +35,10 @@
|
|||||||
#define DEVICE_NAME_LIST "xilinx-ams", "ad7689", "dac@0", "dac@1", "dac@2"
|
#define DEVICE_NAME_LIST "xilinx-ams", "ad7689", "dac@0", "dac@1", "dac@2"
|
||||||
#define DEVICE_TREE_API_FOLDER "/sys/kernel/config/device-tree/overlays/spidr"
|
#define DEVICE_TREE_API_FOLDER "/sys/kernel/config/device-tree/overlays/spidr"
|
||||||
|
|
||||||
#define DAC_DRIVER_FILE_NAME CURRENT_BOARD_LINKS_FOLDER "/ao%d"
|
#define DAC_DRIVER_FILE_NAME CURRENT_BOARD_LINKS_FOLDER "/ao"
|
||||||
#define DAC_POWERDOWN_DRIVER_FILE_NAME CURRENT_BOARD_LINKS_FOLDER "/ao%d_pd"
|
#define DAC_POWERDOWN_DRIVER_FILE_SUFFIX "_pd"
|
||||||
#define SLOWADC_DRIVER_FILE_NAME CURRENT_BOARD_LINKS_FOLDER "/ai%d"
|
#define SLOWADC_DRIVER_FILE_NAME CURRENT_BOARD_LINKS_FOLDER "/ai"
|
||||||
#define TEMP_DRIVER_FILE_NAME DEVICE_TREE_DST "0/in_temp7_input"
|
#define TEMP_DRIVER_FILE_NAME DEVICE_TREE_DST "0/in_temp7_input"
|
||||||
|
|
||||||
#define CONFIG_CHIP_FILE "chip_config_xilinx.txt"
|
#define CONFIG_CHIP_FILE "chip_config_xilinx.txt"
|
||||||
#define RESET_CHIP_FILE "reset_chip_xilinx.txt"
|
#define RESET_CHIP_FILE "reset_chip_xilinx.txt"
|
||||||
|
|||||||
@@ -7,6 +7,6 @@
|
|||||||
#define APIGOTTHARD2 "0.0.0 0x250909"
|
#define APIGOTTHARD2 "0.0.0 0x250909"
|
||||||
#define APIMOENCH "0.0.0 0x250909"
|
#define APIMOENCH "0.0.0 0x250909"
|
||||||
#define APIEIGER "0.0.0 0x250909"
|
#define APIEIGER "0.0.0 0x250909"
|
||||||
#define APIXILINXCTB "0.0.0 0x260113"
|
#define APIXILINXCTB "0.0.0 0x260114"
|
||||||
#define APIJUNGFRAU "0.0.0 0x250909"
|
#define APIJUNGFRAU "0.0.0 0x250909"
|
||||||
#define APIMYTHEN3 "0.0.0 0x250922"
|
#define APIMYTHEN3 "0.0.0 0x250922"
|
||||||
|
|||||||
Reference in New Issue
Block a user