mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-22 17:47:59 +02:00
Dev/xilinx acq (#901)
* period and exptime(patternwaittime level 0) * added new regsieterdefs and updated api version and fixedpattern reg * autogenerate commands * formatting * minor * wip resetflow, readout mode, transceiver mask, transceiver enable * acquisition, but streaming done bit and busy (exposing + read chip to fifo) not known yet from fw * programming fpga and device tree done * most configuration done, need to connect configuretransceiver to client * stuck at resetting transciever timed out * minor * fixed virtual, added chip busyto fifo, streaming busy, set/getnext framenumber * configuretransceiver from client, added help in client * make formatt and command generation * tests for xilinx ctb works * command generation * dacs added and tested, power not done * power added * added temp_fpga * binaries in * ctrlreg is 0 to enable chip=fixed, high dac val = min val= fixed, power regulators in weird order=fixed, device tree could be loaded with dacs before adcs=fixed * start works * virtual server sends * receiver works * tests * python function and enum generation, commands generatorn and autocomplete, formatting, tests * tests fail at start(transceiver not aligned) * tests passed * all binaries compiled * eiger binary in * added --nomodule cehck for xilinx
This commit is contained in:
@ -4,18 +4,11 @@
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
/**
|
||||
* Set Defines
|
||||
* @param hardMaxV maximum hardware limit
|
||||
* @param driverfname driver file name
|
||||
* @param numdacs number of dacs
|
||||
*/
|
||||
void LTC2620_D_SetDefines(int hardMaxV, char *driverfname, int numdacs);
|
||||
|
||||
/**
|
||||
* Get max number of steps
|
||||
*/
|
||||
void LTC2620_D_SetDefines(int hardMinV, int hardMaxV, char *driverfname,
|
||||
int numdacs, int numdevices, int startingDeviceIndex,
|
||||
char *powerdownDriverfname);
|
||||
int LTC2620_D_GetMaxNumSteps();
|
||||
int LTC2620_D_GetPowerDownValue();
|
||||
|
||||
/**
|
||||
* Convert voltage to dac units
|
||||
|
@ -9,4 +9,7 @@ void bus_w(u_int32_t offset, u_int32_t data);
|
||||
u_int32_t bus_r(u_int32_t offset);
|
||||
uint64_t getU64BitReg(int aLSB, int aMSB);
|
||||
void setU64BitReg(uint64_t value, int aLSB, int aMSB);
|
||||
u_int32_t readRegister(u_int32_t offset);
|
||||
u_int32_t writeRegister(u_int32_t offset, u_int32_t data);
|
||||
int mapCSP0(void);
|
||||
u_int32_t *Arm_getUDPBaseAddress();
|
||||
|
@ -11,7 +11,7 @@ void initializePatternAddresses();
|
||||
void initializePatternWord();
|
||||
#endif
|
||||
#endif
|
||||
#if defined(CHIPTESTBOARDD) // TODO || defined(XILINX_CHIPTESTBOARDD)
|
||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
||||
uint64_t validate_readPatternIOControl();
|
||||
int validate_writePatternIOControl(char *message, uint64_t arg);
|
||||
void writePatternIOControl(uint64_t word);
|
||||
|
12
slsDetectorServers/slsDetectorServer/include/programViaArm.h
Normal file
12
slsDetectorServers/slsDetectorServer/include/programViaArm.h
Normal file
@ -0,0 +1,12 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
#pragma once
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
int resetFPGA(char *mess);
|
||||
int loadDeviceTree(char *mess, int *adcDeviceIndex, int *dacDeviceIndex);
|
||||
|
||||
int checksBeforeCreatingDeviceTree(char *mess);
|
||||
int createDeviceTree(char *mess);
|
||||
int verifyDeviceTree(char *mess, int *adcDeviceIndex, int *dacDeviceIndex);
|
@ -27,6 +27,7 @@
|
||||
|
||||
#ifdef ARMPROCESSOR
|
||||
#include "arm64.h"
|
||||
#include "programViaArm.h"
|
||||
#endif
|
||||
|
||||
#ifdef MYTHEN3D
|
||||
@ -68,8 +69,12 @@ void basictests();
|
||||
#if !defined(EIGERD)
|
||||
int checkType();
|
||||
int testFpga();
|
||||
#ifdef XILINX_CHIPTESTBOARDD
|
||||
int testFixedFPGAPattern();
|
||||
#else
|
||||
int testBus();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(GOTTHARDD) || \
|
||||
((defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD)) && \
|
||||
@ -84,9 +89,7 @@ u_int64_t getFirmwareVersion();
|
||||
#ifdef EIGERD
|
||||
uint64_t getFrontEndFirmwareVersion(enum fpgaPosition fpgaPosition);
|
||||
#endif
|
||||
#ifndef XILINX_CHIPTESTBOARDD
|
||||
u_int64_t getFirmwareAPIVersion();
|
||||
#endif
|
||||
void getHardwareVersion(char *version);
|
||||
#ifdef EIGERD
|
||||
int getHardwareVersionNumber();
|
||||
@ -178,6 +181,22 @@ uint32_t readRegister16And32(uint32_t offset);
|
||||
#endif
|
||||
|
||||
// firmware functions (resets)
|
||||
#if defined(XILINX_CHIPTESTBOARDD)
|
||||
void cleanFifos();
|
||||
void resetFlow();
|
||||
int waitTranseiverReset(char *mess);
|
||||
#ifdef VIRTUAL
|
||||
void setTransceiverAlignment(int align);
|
||||
#endif
|
||||
int isTransceiverAligned();
|
||||
int waitTransceiverAligned(char *mess);
|
||||
int configureTransceiver(char *mess);
|
||||
int isChipConfigured();
|
||||
int powerChip(int on, char *mess);
|
||||
int getPowerChip();
|
||||
int configureChip(char *mess);
|
||||
void startPeriphery();
|
||||
#endif
|
||||
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) || \
|
||||
defined(MYTHEN3D) || defined(GOTTHARD2D)
|
||||
void cleanFifos();
|
||||
@ -217,6 +236,12 @@ uint32_t getTransceiverEnableMask();
|
||||
void setADCInvertRegister(uint32_t val);
|
||||
uint32_t getADCInvertRegister();
|
||||
#endif
|
||||
#ifdef XILINX_CHIPTESTBOARDD
|
||||
void setADCEnableMask_10G(uint32_t mask);
|
||||
uint32_t getADCEnableMask_10G();
|
||||
int setTransceiverEnableMask(uint32_t mask);
|
||||
uint32_t getTransceiverEnableMask();
|
||||
#endif
|
||||
#if defined(CHIPTESTBOARDD)
|
||||
int setExternalSamplingSource(int val);
|
||||
int setExternalSampling(int val);
|
||||
@ -232,7 +257,7 @@ int getParallelMode();
|
||||
int setOverFlowMode(int mode);
|
||||
int getOverFlowMode();
|
||||
#endif
|
||||
#ifdef CHIPTESTBOARDD
|
||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
||||
int setReadoutMode(enum readoutMode mode);
|
||||
int getReadoutMode();
|
||||
#endif
|
||||
@ -243,7 +268,7 @@ int selectStoragecellStart(int pos);
|
||||
int getMaxStoragecellStart();
|
||||
#endif
|
||||
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(EIGERD) || \
|
||||
defined(CHIPTESTBOARDD)
|
||||
defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
||||
int setNextFrameNumber(uint64_t value);
|
||||
int getNextFrameNumber(uint64_t *value);
|
||||
#endif
|
||||
@ -251,14 +276,12 @@ void setNumFrames(int64_t val);
|
||||
int64_t getNumFrames();
|
||||
void setNumTriggers(int64_t val);
|
||||
int64_t getNumTriggers();
|
||||
#ifndef XILINX_CHIPTESTBOARDD
|
||||
#ifndef MYTHEN3D
|
||||
int setExpTime(int64_t val);
|
||||
int64_t getExpTime();
|
||||
#endif
|
||||
int setPeriod(int64_t val);
|
||||
int64_t getPeriod();
|
||||
#endif
|
||||
#ifdef MYTHEN3D
|
||||
void setNumIntGates(int val);
|
||||
void setNumGates(int val);
|
||||
@ -290,11 +313,9 @@ int getNumAdditionalStorageCells();
|
||||
int setStorageCellDelay(int64_t val);
|
||||
int64_t getStorageCellDelay();
|
||||
#endif
|
||||
#if defined(CHIPTESTBOARDD)
|
||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
||||
int setNumAnalogSamples(int val);
|
||||
int getNumAnalogSamples();
|
||||
#endif
|
||||
#ifdef CHIPTESTBOARDD
|
||||
int setNumDigitalSamples(int val);
|
||||
int getNumDigitalSamples();
|
||||
int setNumTransceiverSamples(int val);
|
||||
@ -312,10 +333,10 @@ int64_t getNumFramesLeft();
|
||||
int64_t getNumTriggersLeft();
|
||||
#endif
|
||||
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARDD) || \
|
||||
defined(CHIPTESTBOARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D)
|
||||
defined(CHIPTESTBOARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D) || \
|
||||
defined(XILINX_CHIPTESTBOARDD)
|
||||
int setDelayAfterTrigger(int64_t val);
|
||||
int64_t getDelayAfterTrigger();
|
||||
|
||||
int64_t getDelayAfterTriggerLeft();
|
||||
int64_t getPeriodLeft();
|
||||
#endif
|
||||
@ -326,7 +347,7 @@ int64_t getNumBurstsLeft();
|
||||
int64_t getExpTimeLeft();
|
||||
#endif
|
||||
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) || \
|
||||
defined(MYTHEN3D) || defined(GOTTHARD2D)
|
||||
defined(MYTHEN3D) || defined(GOTTHARD2D) || defined(XILINX_CHIPTESTBOARDD)
|
||||
int64_t getFramesFromStart();
|
||||
int64_t getActualTime();
|
||||
int64_t getMeasurementTime();
|
||||
@ -379,15 +400,11 @@ void setDAC(enum DACINDEX ind, int val, int mV, int counterEnableCheck);
|
||||
void setGeneralDAC(enum DACINDEX ind, int val, int mV);
|
||||
void setVthDac(int index, int enable);
|
||||
#else
|
||||
#ifndef XILINX_CHIPTESTBOARDD
|
||||
void setDAC(enum DACINDEX ind, int val, int mV);
|
||||
#endif
|
||||
#endif
|
||||
#ifndef XILINX_CHIPTESTBOARDD
|
||||
int getDAC(enum DACINDEX ind, int mV);
|
||||
int getMaxDacSteps();
|
||||
#endif
|
||||
#if defined(CHIPTESTBOARDD)
|
||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
||||
int dacToVoltage(int dac);
|
||||
int checkVLimitCompliant(int mV);
|
||||
int checkVLimitDacCompliant(int dac);
|
||||
@ -406,20 +423,24 @@ int isPowerValid(enum DACINDEX ind, int val);
|
||||
int getPower();
|
||||
void setPower(enum DACINDEX ind, int val);
|
||||
void powerOff();
|
||||
#elif XILINX_CHIPTESTBOARDD
|
||||
int getPower();
|
||||
void setPower(enum DACINDEX ind, int val);
|
||||
#endif
|
||||
|
||||
#if defined(MYTHEN3D) || defined(GOTTHARD2D)
|
||||
#if defined(MYTHEN3D) || defined(GOTTHARD2D) || defined(XILINX_CHIPTESTBOARDD)
|
||||
int getADC(enum ADCINDEX ind, int *value);
|
||||
#else
|
||||
#ifndef XILINX_CHIPTESTBOARDD
|
||||
int getADC(enum ADCINDEX ind);
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CHIPTESTBOARDD
|
||||
int getSlowADC(int ichan);
|
||||
int getSlowADCTemperature();
|
||||
#endif
|
||||
#ifndef XILINX_CHIPTESTBOARDD
|
||||
#ifdef XILINX_CHIPTESTBOARDD
|
||||
int getSlowADC(int ichan, int *retval);
|
||||
int getTemperature(int *retval);
|
||||
#else
|
||||
int setHighVoltage(int val);
|
||||
#endif
|
||||
|
||||
@ -491,7 +512,8 @@ void setupHeader(int iRxEntry, enum interfaceType type, uint32_t destip,
|
||||
uint32_t sourceip, uint16_t sourceport);
|
||||
#endif
|
||||
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARD2D) || \
|
||||
defined(MYTHEN3D) || defined(CHIPTESTBOARDD)
|
||||
defined(MYTHEN3D) || defined(CHIPTESTBOARDD) || \
|
||||
defined(XILINX_CHIPTESTBOARDD)
|
||||
void calcChecksum(udp_header *udp);
|
||||
#endif
|
||||
#ifdef GOTTHARDD
|
||||
@ -694,30 +716,27 @@ int setTransmissionDelayRight(int value);
|
||||
#endif
|
||||
|
||||
// aquisition
|
||||
#ifndef XILINX_CHIPTESTBOARDD
|
||||
int startStateMachine();
|
||||
#ifdef VIRTUAL
|
||||
void *start_timer(void *arg);
|
||||
#endif
|
||||
int stopStateMachine();
|
||||
#endif
|
||||
#ifdef MYTHEN3D
|
||||
#if defined(MYTHEN3D) || defined(XILINX_CHIPTESTBOARDD)
|
||||
int softwareTrigger();
|
||||
#endif
|
||||
#if defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD)
|
||||
int softwareTrigger(int block);
|
||||
#endif
|
||||
#if defined(EIGERD) || defined(MYTHEN3D) || defined(CHIPTESTBOARDD)
|
||||
#if defined(EIGERD) || defined(MYTHEN3D) || defined(CHIPTESTBOARDD) || \
|
||||
defined(XILINX_CHIPTESTBOARDD)
|
||||
int startReadOut();
|
||||
#endif
|
||||
enum runStatus getRunStatus();
|
||||
#ifdef EIGERD
|
||||
void waitForAcquisitionEnd(int *ret, char *mess);
|
||||
#else
|
||||
#ifndef XILINX_CHIPTESTBOARDD
|
||||
void waitForAcquisitionEnd();
|
||||
#endif
|
||||
#endif
|
||||
#if defined(CHIPTESTBOARDD)
|
||||
int validateUDPSocket();
|
||||
void readandSendUDPFrames();
|
||||
@ -729,7 +748,8 @@ int readFrameFromFifo();
|
||||
#endif
|
||||
|
||||
#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \
|
||||
defined(CHIPTESTBOARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D)
|
||||
defined(CHIPTESTBOARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D) || \
|
||||
defined(XILINX_CHIPTESTBOARDD)
|
||||
u_int32_t runBusy();
|
||||
#endif
|
||||
|
||||
@ -738,15 +758,11 @@ u_int32_t runState(enum TLogLevel lev);
|
||||
#endif
|
||||
|
||||
// common
|
||||
#ifndef XILINX_CHIPTESTBOARDD
|
||||
int calculateDataBytes();
|
||||
int getTotalNumberOfChannels();
|
||||
#endif
|
||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
||||
void getNumberOfChannels(int *nchanx, int *nchany);
|
||||
#endif
|
||||
#ifndef XILINX_CHIPTESTBOARDD
|
||||
int getNumberOfChips();
|
||||
int getNumberOfDACs();
|
||||
int getNumberOfChannelsPerChip();
|
||||
#endif
|
||||
int getNumberOfChannelsPerChip();
|
@ -329,3 +329,4 @@ int getColumn();
|
||||
int setColumn(int);
|
||||
int get_pedestal_mode(int);
|
||||
int set_pedestal_mode(int);
|
||||
int config_transceiver(int);
|
||||
|
@ -13,35 +13,54 @@
|
||||
#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_NumDevices = 0;
|
||||
int LTC2620_D_NumChannelsPerDevice = 0;
|
||||
int LTC2620_D_DacDriverStartingDeviceIndex = 0;
|
||||
|
||||
void LTC2620_D_SetDefines(int hardMaxV, char *driverfname, int numdacs) {
|
||||
void LTC2620_D_SetDefines(int hardMinV, int hardMaxV, char *driverfname,
|
||||
int numdacs, int numdevices, int startingDeviceIndex,
|
||||
char *powerdownDriverfname) {
|
||||
LOG(logINFOBLUE,
|
||||
("Configuring DACs (LTC2620) to %s (numdacs:%d, hard max: %dmV)\n",
|
||||
driverfname, numdacs, hardMaxV));
|
||||
("Configuring DACs (LTC2620) to %s\n\t (numdacs:%d, hard min:%d, hard "
|
||||
"max: %dmV, idev:%d)\n",
|
||||
driverfname, numdacs, hardMinV, hardMaxV, startingDeviceIndex));
|
||||
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_NumDevices = numdevices;
|
||||
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_GetPowerDownValue() { return LTC2620_D_PWR_DOWN_VAL; }
|
||||
|
||||
int LTC2620_D_VoltageToDac(int voltage, int *dacval) {
|
||||
return ConvertToDifferentRange(0, LTC2620_D_HardMaxVoltage, 0,
|
||||
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, 0,
|
||||
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,
|
||||
@ -49,53 +68,90 @@ int LTC2620_D_SetDACValue(int dacnum, int val, int mV, char *dacname,
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
// get
|
||||
// validate set
|
||||
if (val < 0 && val != LTC2620_D_PWR_DOWN_VAL)
|
||||
return FAIL;
|
||||
|
||||
// convert to dac or get mV value
|
||||
*dacval = val;
|
||||
int dacmV = val;
|
||||
int ret = OK;
|
||||
if (mV) {
|
||||
ret = LTC2620_D_VoltageToDac(val, dacval);
|
||||
} else if (val >= 0) {
|
||||
// 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;
|
||||
}
|
||||
|
||||
// set
|
||||
if ((*dacval >= 0) || (*dacval == LTC2620_D_PWR_DOWN_VAL)) {
|
||||
LOG(logINFO, ("Setting DAC %2d [%-12s] : %d dac (%d mV)\n", dacnum,
|
||||
dacname, *dacval, dacmV));
|
||||
|
||||
*dacval = val;
|
||||
#ifndef VIRTUAL
|
||||
char fname[MAX_STR_LENGTH];
|
||||
strcpy(fname, LTC2620_D_DriverFileName);
|
||||
char temp[20];
|
||||
memset(temp, 0, sizeof(temp));
|
||||
sprintf(temp, "%d", dacnum);
|
||||
strcat(fname, temp);
|
||||
LOG(logDEBUG1, ("fname %s\n", fname));
|
||||
char fnameFormat[MAX_STR_LENGTH];
|
||||
memset(fnameFormat, 0, MAX_STR_LENGTH);
|
||||
strcpy(fnameFormat, LTC2620_D_DriverFileName);
|
||||
#endif
|
||||
|
||||
// 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
|
||||
fprintf(fd, "%d\n", *dacval);
|
||||
fclose(fd);
|
||||
// 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);
|
||||
} else if (val >= 0) {
|
||||
// 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) {
|
||||
LOG(logINFO, ("Setting DAC %2d [%-6s] : %d dac (%d mV)\n", dacnum,
|
||||
dacname, *dacval, dacmV));
|
||||
}
|
||||
#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
|
||||
int idev = LTC2620_D_DacDriverStartingDeviceIndex +
|
||||
(dacnum / LTC2620_D_NumChannelsPerDevice);
|
||||
int idac = dacnum % LTC2620_D_NumChannelsPerDevice;
|
||||
sprintf(fname, fnameFormat, idev, idac);
|
||||
#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;
|
||||
}
|
||||
|
@ -11,10 +11,13 @@
|
||||
#include <sys/mman.h> // mmap
|
||||
|
||||
/* global variables */
|
||||
#define CSP0 (0xB0010000)
|
||||
#define MEM_SIZE 0x100000
|
||||
|
||||
#define CSP0 (0xB0080000)
|
||||
#define CSP1 (0xB0050000) // udp
|
||||
#define MEM_SIZE (0x10000)
|
||||
//#define MEM_SIZE_CSP0 (4096)
|
||||
//#define MEM_SIZE_CSP1 (2 * 4096)
|
||||
u_int32_t *csp0base = 0;
|
||||
u_int32_t *csp1base = 0;
|
||||
|
||||
void bus_w(u_int32_t offset, u_int32_t data) {
|
||||
volatile u_int32_t *ptr1;
|
||||
@ -39,35 +42,53 @@ void setU64BitReg(uint64_t value, int aLSB, int aMSB) {
|
||||
bus_w(aMSB, (value >> 32) & (0xffffffff));
|
||||
}
|
||||
|
||||
u_int32_t readRegister(u_int32_t offset) { return bus_r(offset); }
|
||||
|
||||
u_int32_t writeRegister(u_int32_t offset, u_int32_t data) {
|
||||
bus_w(offset, data);
|
||||
return readRegister(offset);
|
||||
}
|
||||
|
||||
int mapCSP0(void) {
|
||||
// if not mapped
|
||||
if (csp0base == 0) {
|
||||
LOG(logINFO, ("Mapping memory\n"));
|
||||
u_int32_t csps[2] = {CSP0, CSP1};
|
||||
u_int32_t **cspbases[2] = {&csp0base, &csp1base};
|
||||
char names[2][10] = {"csp0base", "csp1base"};
|
||||
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
// if not mapped
|
||||
if (*cspbases[i] == 0) {
|
||||
LOG(logINFO, ("Mapping memory for %s\n", names[i]));
|
||||
#ifdef VIRTUAL
|
||||
csp0base = malloc(MEM_SIZE);
|
||||
if (csp0base == NULL) {
|
||||
LOG(logERROR, ("Could not allocate virtual memory.\n"));
|
||||
return FAIL;
|
||||
}
|
||||
LOG(logINFO, ("memory allocated\n"));
|
||||
*cspbases[i] = malloc(MEM_SIZE);
|
||||
if (*cspbases[i] == NULL) {
|
||||
LOG(logERROR,
|
||||
("Could not allocate virtual memory for %s.\n", names[i]));
|
||||
return FAIL;
|
||||
}
|
||||
LOG(logINFO, ("memory allocated for %s\n", names[i]));
|
||||
#else
|
||||
int fd;
|
||||
fd = open("/dev/mem", O_RDWR | O_SYNC, 0);
|
||||
if (fd == -1) {
|
||||
LOG(logERROR, ("Can't find /dev/mem\n"));
|
||||
return FAIL;
|
||||
}
|
||||
LOG(logDEBUG1, ("/dev/mem opened\n"));
|
||||
csp0base = (u_int32_t *)mmap(0, MEM_SIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_FILE | MAP_SHARED, fd, CSP0);
|
||||
if (csp0base == MAP_FAILED) {
|
||||
LOG(logERROR, ("Can't map memmory area\n"));
|
||||
return FAIL;
|
||||
}
|
||||
int fd = open("/dev/mem", O_RDWR | O_SYNC, 0);
|
||||
if (fd == -1) {
|
||||
LOG(logERROR, ("Can't find /dev/mem for %s\n", names[i]));
|
||||
return FAIL;
|
||||
}
|
||||
LOG(logDEBUG1,
|
||||
("/dev/mem opened for %s, (CSP:0x%x)\n", names[i], csps[i]));
|
||||
*cspbases[i] =
|
||||
(u_int32_t *)mmap(0, MEM_SIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_FILE | MAP_SHARED, fd, csps[i]);
|
||||
if (*cspbases[i] == MAP_FAILED) {
|
||||
LOG(logERROR, ("Can't map memmory area for %s\n", names[i]));
|
||||
return FAIL;
|
||||
}
|
||||
#endif
|
||||
LOG(logINFO, ("csp0base mapped from %p to %p\n", csp0base,
|
||||
(csp0base + MEM_SIZE)));
|
||||
} else
|
||||
LOG(logINFO, ("Memory already mapped before\n"));
|
||||
LOG(logINFO, ("%s mapped from %p to %p,(CSP:0x%x) \n", names[i],
|
||||
*cspbases[i], *cspbases[i] + MEM_SIZE, csps[i]));
|
||||
// LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG)));
|
||||
} else
|
||||
LOG(logINFO, ("Memory %s already mapped before\n", names[i]));
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
u_int32_t *Arm_getUDPBaseAddress() { return csp1base; }
|
||||
|
@ -752,13 +752,17 @@ int readADCFromFile(char *fname, int *value) {
|
||||
|
||||
*value = -1;
|
||||
if (sscanf(line, "%d", value) != 1) {
|
||||
#ifdef XILINX_CHIPTESTBOARDD
|
||||
LOG(logERROR, ("Could not scan adc from %s\n", line));
|
||||
#else
|
||||
LOG(logERROR, ("Could not scan temperature from %s\n", line));
|
||||
#endif
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
#ifdef EIGERD
|
||||
*value /= 10;
|
||||
#else
|
||||
#elif !defined(XILINX_CHIPTESTBOARDD)
|
||||
LOG(logINFO, ("Temperature: %.2f °C\n", (double)(*value) / 1000.00));
|
||||
#endif
|
||||
|
||||
|
@ -52,12 +52,26 @@ void initializePatternWord() {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(CHIPTESTBOARDD) // TODO || defined(XILINX_CHIPTESTBOARDD)
|
||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
||||
uint64_t validate_readPatternIOControl() {
|
||||
#if defined(CHIPTESTBOARDD)
|
||||
return getU64BitReg(PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG);
|
||||
#elif defined(XILINX_CHIPTESTBOARDD)
|
||||
return (uint64_t)(bus_r(PINIOCTRLREG));
|
||||
#endif
|
||||
}
|
||||
|
||||
int validate_writePatternIOControl(char *message, uint64_t arg) {
|
||||
// validate input
|
||||
#ifdef XILINX_CHIPTESTBOARDD
|
||||
if (arg > BIT32_MSK) {
|
||||
strcpy(message, "Could not set pattern IO Control. Must be 32 bit for "
|
||||
"this detector\n");
|
||||
LOG(logERROR, (message));
|
||||
return FAIL;
|
||||
}
|
||||
#endif
|
||||
|
||||
writePatternIOControl(arg);
|
||||
|
||||
// validate result
|
||||
@ -77,9 +91,15 @@ int validate_writePatternIOControl(char *message, uint64_t arg) {
|
||||
}
|
||||
|
||||
void writePatternIOControl(uint64_t word) {
|
||||
#ifdef CHIPTESTBOARDD
|
||||
LOG(logINFO,
|
||||
("Setting Pattern I/O Control: 0x%llx\n", (long long int)word));
|
||||
setU64BitReg(word, PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG);
|
||||
#elif defined(XILINX_CHIPTESTBOARDD)
|
||||
uint32_t val = (uint32_t)word;
|
||||
LOG(logINFO, ("Setting Pattern I/O Control: 0x%x\n", val));
|
||||
bus_w(PINIOCTRLREG, val);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
196
slsDetectorServers/slsDetectorServer/src/programViaArm.c
Normal file
196
slsDetectorServers/slsDetectorServer/src/programViaArm.c
Normal file
@ -0,0 +1,196 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
#include "programViaArm.h"
|
||||
#include "clogger.h"
|
||||
#include "sls/sls_detector_defs.h"
|
||||
|
||||
#include <string.h> //memset
|
||||
#include <unistd.h> // access
|
||||
|
||||
#define CMD_ARM_LOAD_BIT_FILE \
|
||||
"~/fpgautil/fpgautil -b /root/apps/xilinx-ctb/XilinxCTB.bit -f Full"
|
||||
#define CMD_ARM_DEVICE_TREE_API_FOLDER \
|
||||
"/sys/kernel/config/device-tree/overlays/spidr"
|
||||
#define CMD_ARM_DEVICE_TREE_OVERLAY_FILE "/root/apps/xilinx-ctb/pl.dtbo"
|
||||
#define CMD_ARM_LOAD_DEVICE_TREE_FORMAT "cat %s > %s/dtbo"
|
||||
#define CMD_ARM_DEVICE_TREE_DST "/sys/bus/iio/devices/iio:device"
|
||||
#define CMD_ARM_DEVICE_NAME "xilinx-ams", "ad7689", "dac@0", "dac@1", "dac@2"
|
||||
#define TIME_LOAD_DEVICE_TREE_MS (500)
|
||||
|
||||
extern int executeCommand(char *command, char *result, enum TLogLevel level);
|
||||
|
||||
int resetFPGA(char *mess) {
|
||||
LOG(logINFOBLUE, ("Reseting FPGA...\n"));
|
||||
#ifndef VIRTUAL
|
||||
char retvals[MAX_STR_LENGTH] = {0};
|
||||
if (executeCommand(CMD_ARM_LOAD_BIT_FILE, retvals, logDEBUG1) == FAIL) {
|
||||
snprintf(mess, MAX_STR_LENGTH,
|
||||
"Could not reset fpga. Command to load bit file failed (%s)\n",
|
||||
retvals);
|
||||
LOG(logERROR, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
#endif
|
||||
LOG(logINFOBLUE, ("FPGA reset successfully\n"))
|
||||
return OK;
|
||||
}
|
||||
|
||||
int loadDeviceTree(char *mess, int *adcDeviceIndex, int *dacDeviceIndex) {
|
||||
if (verifyDeviceTree(mess, adcDeviceIndex, dacDeviceIndex) == OK)
|
||||
return OK;
|
||||
|
||||
if (checksBeforeCreatingDeviceTree(mess) == FAIL)
|
||||
return FAIL;
|
||||
|
||||
if (createDeviceTree(mess) == FAIL)
|
||||
return FAIL;
|
||||
|
||||
if (verifyDeviceTree(mess, adcDeviceIndex, dacDeviceIndex) == FAIL) {
|
||||
LOG(logERROR, ("Device tree loading failed at verification\n"));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
LOG(logINFOBLUE, ("Device tree loaded successfully\n"))
|
||||
return OK;
|
||||
}
|
||||
|
||||
int checksBeforeCreatingDeviceTree(char *mess) {
|
||||
// check if device tree overlay file exists
|
||||
if (access(CMD_ARM_DEVICE_TREE_OVERLAY_FILE, F_OK) != 0) {
|
||||
snprintf(mess, MAX_STR_LENGTH,
|
||||
"Device tree overlay file (%s) does not exist\n",
|
||||
CMD_ARM_DEVICE_TREE_OVERLAY_FILE);
|
||||
LOG(logERROR, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
LOG(logINFO, ("\tDevice tree overlay file exists (%s)\n",
|
||||
CMD_ARM_DEVICE_TREE_OVERLAY_FILE));
|
||||
|
||||
// check if device tree folder exists. If it does, remove it
|
||||
if (access(CMD_ARM_DEVICE_TREE_API_FOLDER, F_OK) == 0) {
|
||||
// remove it
|
||||
char cmd[MAX_STR_LENGTH] = {0};
|
||||
memset(cmd, 0, MAX_STR_LENGTH);
|
||||
sprintf(cmd, "rmdir %s", CMD_ARM_DEVICE_TREE_API_FOLDER);
|
||||
char retvals[MAX_STR_LENGTH] = {0};
|
||||
memset(retvals, 0, MAX_STR_LENGTH);
|
||||
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
|
||||
snprintf(mess, MAX_STR_LENGTH,
|
||||
"Could not unload device tree overlay api with %s (%s)\n",
|
||||
cmd, retvals);
|
||||
LOG(logWARNING, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
LOG(logINFO, ("\tUnloaded existing device tree overlay api (%s)\n",
|
||||
CMD_ARM_DEVICE_TREE_API_FOLDER));
|
||||
} else {
|
||||
LOG(logINFO, ("\tNo existing device tree overlay api found(%s)\n",
|
||||
CMD_ARM_DEVICE_TREE_API_FOLDER));
|
||||
}
|
||||
|
||||
// create device tree overlay folder
|
||||
{
|
||||
char cmd[MAX_STR_LENGTH] = {0};
|
||||
memset(cmd, 0, MAX_STR_LENGTH);
|
||||
sprintf(cmd, "mkdir %s", CMD_ARM_DEVICE_TREE_API_FOLDER);
|
||||
char retvals[MAX_STR_LENGTH] = {0};
|
||||
memset(retvals, 0, MAX_STR_LENGTH);
|
||||
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
|
||||
snprintf(mess, MAX_STR_LENGTH,
|
||||
"Could not create device tree overlay api with %s (%s)\n",
|
||||
cmd, retvals);
|
||||
LOG(logWARNING, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
LOG(logINFO, ("\tDevice tree overlay api created (%s)\n",
|
||||
CMD_ARM_DEVICE_TREE_API_FOLDER));
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
int createDeviceTree(char *mess) {
|
||||
char cmd[MAX_STR_LENGTH] = {0};
|
||||
memset(cmd, 0, MAX_STR_LENGTH);
|
||||
sprintf(cmd, CMD_ARM_LOAD_DEVICE_TREE_FORMAT,
|
||||
CMD_ARM_DEVICE_TREE_OVERLAY_FILE, CMD_ARM_DEVICE_TREE_API_FOLDER);
|
||||
char retvals[MAX_STR_LENGTH] = {0};
|
||||
memset(retvals, 0, MAX_STR_LENGTH);
|
||||
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
|
||||
snprintf(mess, MAX_STR_LENGTH,
|
||||
"Could not load device tree overlay with %s (%s)\n", cmd,
|
||||
retvals);
|
||||
LOG(logWARNING, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
LOG(logINFO, ("\tDevice tree overlay created (cmd: %s)\n", cmd));
|
||||
|
||||
usleep(TIME_LOAD_DEVICE_TREE_MS * 1000);
|
||||
return OK;
|
||||
}
|
||||
|
||||
int verifyDeviceTree(char *mess, int *adcDeviceIndex, int *dacDeviceIndex) {
|
||||
LOG(logINFOBLUE, ("Verifying Device Tree...\n"));
|
||||
*adcDeviceIndex = 1;
|
||||
*dacDeviceIndex = 2;
|
||||
#ifndef VIRTUAL
|
||||
|
||||
// check if iio:device0-4 exists in device tree destination
|
||||
int hardcodedDeviceIndex = 0;
|
||||
for (int i = 0; i != 5; ++i) {
|
||||
char deviceName[MAX_STR_LENGTH] = {0};
|
||||
memset(deviceName, 0, MAX_STR_LENGTH);
|
||||
sprintf(deviceName, "%s%d/name", CMD_ARM_DEVICE_TREE_DST, i);
|
||||
// check if device exist
|
||||
if (access(deviceName, F_OK) != 0) {
|
||||
snprintf(mess, MAX_STR_LENGTH,
|
||||
"Could not verify device tree. Device %s does not exist\n",
|
||||
deviceName);
|
||||
LOG(logWARNING, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
// find name
|
||||
char cmd[MAX_STR_LENGTH] = {0};
|
||||
memset(cmd, 0, MAX_STR_LENGTH);
|
||||
sprintf(cmd, "cat %s", deviceName);
|
||||
char retvals[MAX_STR_LENGTH] = {0};
|
||||
memset(retvals, 0, MAX_STR_LENGTH);
|
||||
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
|
||||
snprintf(mess, MAX_STR_LENGTH,
|
||||
"Could not retrieve device name from device %s (%s)\n",
|
||||
deviceName, retvals);
|
||||
LOG(logWARNING, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
// verify name
|
||||
char *deviceNames[] = {CMD_ARM_DEVICE_NAME};
|
||||
if (strstr(retvals, deviceNames[hardcodedDeviceIndex]) == NULL) {
|
||||
// dacs got loaded first
|
||||
if (i == 1 &&
|
||||
strstr(retvals, deviceNames[hardcodedDeviceIndex + 1]) !=
|
||||
NULL) {
|
||||
++hardcodedDeviceIndex;
|
||||
*adcDeviceIndex = 4;
|
||||
*dacDeviceIndex = 1;
|
||||
} else {
|
||||
snprintf(
|
||||
mess, MAX_STR_LENGTH,
|
||||
"Could not verify device tree. Device %s expected %s but "
|
||||
"got %s\n",
|
||||
deviceName, deviceNames[i], retvals);
|
||||
LOG(logWARNING, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
}
|
||||
++hardcodedDeviceIndex;
|
||||
// in case dacs were loaded first
|
||||
if (hardcodedDeviceIndex == 5)
|
||||
hardcodedDeviceIndex = 1;
|
||||
}
|
||||
#endif
|
||||
LOG(logINFOBLUE, ("Device tree verified successfully [temp: 0, adc:%d, "
|
||||
"dac:%d, %d, %d]\n",
|
||||
*adcDeviceIndex, *dacDeviceIndex, *dacDeviceIndex + 1,
|
||||
*dacDeviceIndex + 2));
|
||||
return OK;
|
||||
}
|
@ -79,7 +79,7 @@ int main(int argc, char *argv[]) {
|
||||
"\t-v, --version : Software version\n"
|
||||
"\t-p, --port <port> : TCP communication port with client. "
|
||||
"\n"
|
||||
"\t-g, --nomodule : [Mythen3][Gotthard2] \n"
|
||||
"\t-g, --nomodule : [Mythen3][Gotthard2][Xilinx Ctb] \n"
|
||||
"\t Generic or No Module mode. Skips "
|
||||
"detector type checks. \n"
|
||||
"\t-f, --phaseshift <value> : [Gotthard] only. Sets phase shift. \n"
|
||||
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user