mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-21 03:10:02 +02:00
m3: update deserializers except for deserializer reg
This commit is contained in:
parent
8631f5e2b0
commit
0514f00552
@ -552,6 +552,7 @@ int setDynamicRange(int dr) {
|
|||||||
// set it
|
// set it
|
||||||
bus_w(CONFIG_REG, bus_r(CONFIG_REG) & ~CONFIG_DYNAMIC_RANGE_MSK);
|
bus_w(CONFIG_REG, bus_r(CONFIG_REG) & ~CONFIG_DYNAMIC_RANGE_MSK);
|
||||||
bus_w(CONFIG_REG, bus_r(CONFIG_REG) | regval);
|
bus_w(CONFIG_REG, bus_r(CONFIG_REG) | regval);
|
||||||
|
updateNumberOfDeserializers();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t regval = bus_r(CONFIG_REG) & CONFIG_DYNAMIC_RANGE_MSK;
|
uint32_t regval = bus_r(CONFIG_REG) & CONFIG_DYNAMIC_RANGE_MSK;
|
||||||
@ -1032,6 +1033,7 @@ void setCounterMask(uint32_t arg) {
|
|||||||
CONFIG_COUNTERS_ENA_MSK));
|
CONFIG_COUNTERS_ENA_MSK));
|
||||||
LOG(logDEBUG, ("Config Reg: 0x%x\n", bus_r(addr)));
|
LOG(logDEBUG, ("Config Reg: 0x%x\n", bus_r(addr)));
|
||||||
|
|
||||||
|
updateNumberOfDeserializers();
|
||||||
updateGatePeriod();
|
updateGatePeriod();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1040,6 +1042,34 @@ uint32_t getCounterMask() {
|
|||||||
CONFIG_COUNTERS_ENA_OFST);
|
CONFIG_COUNTERS_ENA_OFST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateNumberOfDeserializers() {
|
||||||
|
const uint32_t counterMask = getCounterMask();
|
||||||
|
const int ncounters = __builtin_popcount(counterMask);
|
||||||
|
const int dr = setDynamicRange(-1);
|
||||||
|
const int tgEnable = enableTenGigabitEthernet(-1);
|
||||||
|
int packetsPerFrame = 0;
|
||||||
|
|
||||||
|
// 10g
|
||||||
|
if (tgEnable) {
|
||||||
|
packetsPerFrame = 1;
|
||||||
|
if (dr == 32 && n > 1) {
|
||||||
|
packetsPerFrame = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 1g
|
||||||
|
else {
|
||||||
|
int datasize = 1280;
|
||||||
|
if (n == 3) {
|
||||||
|
dataSize = 768;
|
||||||
|
}
|
||||||
|
packetsPerFrame = imageSize / dataSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
int numDeserializers = MAX_NUM_DESERIALIZERS / packetsPerFrame;
|
||||||
|
// bus_w()
|
||||||
|
LOG(logINFO, ("Number of Deserializers: %d\n", numDeserializers));
|
||||||
|
}
|
||||||
|
|
||||||
int setDelayAfterTrigger(int64_t val) {
|
int setDelayAfterTrigger(int64_t val) {
|
||||||
if (val < 0) {
|
if (val < 0) {
|
||||||
LOG(logERROR,
|
LOG(logERROR,
|
||||||
@ -1509,6 +1539,7 @@ int enableTenGigabitEthernet(int val) {
|
|||||||
else {
|
else {
|
||||||
bus_w(addr, bus_r(addr) & (~PKT_CONFIG_1G_INTERFACE_MSK));
|
bus_w(addr, bus_r(addr) & (~PKT_CONFIG_1G_INTERFACE_MSK));
|
||||||
}
|
}
|
||||||
|
updateNumberOfDeserializers();
|
||||||
}
|
}
|
||||||
int oneG = ((bus_r(addr) & PKT_CONFIG_1G_INTERFACE_MSK) >>
|
int oneG = ((bus_r(addr) & PKT_CONFIG_1G_INTERFACE_MSK) >>
|
||||||
PKT_CONFIG_1G_INTERFACE_OFST);
|
PKT_CONFIG_1G_INTERFACE_OFST);
|
||||||
|
@ -49,6 +49,7 @@
|
|||||||
#define FIXED_PLL_FREQUENCY (020000000) // 20MHz
|
#define FIXED_PLL_FREQUENCY (020000000) // 20MHz
|
||||||
#define READOUT_PLL_VCO_FREQ_HZ (1250000000) // 1.25GHz
|
#define READOUT_PLL_VCO_FREQ_HZ (1250000000) // 1.25GHz
|
||||||
#define SYSTEM_PLL_VCO_FREQ_HZ (1000000000) // 1GHz
|
#define SYSTEM_PLL_VCO_FREQ_HZ (1000000000) // 1GHz
|
||||||
|
#define MAX_NUM_DESERIALIZERS (40)
|
||||||
|
|
||||||
/** Other Definitions */
|
/** Other Definitions */
|
||||||
#define BIT16_MASK (0xFFFF)
|
#define BIT16_MASK (0xFFFF)
|
||||||
|
@ -250,6 +250,7 @@ int getNumDigitalSamples();
|
|||||||
#ifdef MYTHEN3D
|
#ifdef MYTHEN3D
|
||||||
void setCounterMask(uint32_t arg);
|
void setCounterMask(uint32_t arg);
|
||||||
uint32_t getCounterMask();
|
uint32_t getCounterMask();
|
||||||
|
void updateNumberOfDeserializers();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(CHIPTESTBOARDD) || \
|
#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(CHIPTESTBOARDD) || \
|
||||||
|
@ -157,8 +157,9 @@ class GeneralData {
|
|||||||
* set number of counters (mythen3)
|
* set number of counters (mythen3)
|
||||||
* @param n number of counters
|
* @param n number of counters
|
||||||
* @param dr dynamic range
|
* @param dr dynamic range
|
||||||
|
* @param tgEnable ten giga enable
|
||||||
*/
|
*/
|
||||||
virtual void SetNumberofCounters(const int n, const int dr) {
|
virtual void SetNumberofCounters(const int n, const int dr, bool tgEnable) {
|
||||||
LOG(logERROR) << "SetNumberofCounters is a generic function that "
|
LOG(logERROR) << "SetNumberofCounters is a generic function that "
|
||||||
"should be overloaded by a derived class";
|
"should be overloaded by a derived class";
|
||||||
}
|
}
|
||||||
@ -440,8 +441,9 @@ class Mythen3Data : public GeneralData {
|
|||||||
* set number of counters (mythen3)
|
* set number of counters (mythen3)
|
||||||
* @param n number of counters
|
* @param n number of counters
|
||||||
* @param dr dynamic range
|
* @param dr dynamic range
|
||||||
|
* @param tgEnable ten giga enable
|
||||||
*/
|
*/
|
||||||
virtual void SetNumberofCounters(const int n, const int dr) {
|
virtual void SetNumberofCounters(const int n, const int dr, bool tgEnable) {
|
||||||
if (n < 1 || n > 3) {
|
if (n < 1 || n > 3) {
|
||||||
throw sls::RuntimeError("Invalid number of counters " +
|
throw sls::RuntimeError("Invalid number of counters " +
|
||||||
std::to_string(n));
|
std::to_string(n));
|
||||||
@ -450,7 +452,26 @@ class Mythen3Data : public GeneralData {
|
|||||||
nPixelsX = NCHAN * ncounters;
|
nPixelsX = NCHAN * ncounters;
|
||||||
LOG(logINFO) << "nPixelsX: " << nPixelsX;
|
LOG(logINFO) << "nPixelsX: " << nPixelsX;
|
||||||
imageSize = nPixelsX * nPixelsY * ((double)dr / 8.00);
|
imageSize = nPixelsX * nPixelsY * ((double)dr / 8.00);
|
||||||
dataSize = imageSize / packetsPerFrame;
|
// 10g
|
||||||
|
if (tgEnable) {
|
||||||
|
if (dr == 32 && n > 1) {
|
||||||
|
packetsPerFrame = 2;
|
||||||
|
} else {
|
||||||
|
packetsPerFrame = 1;
|
||||||
|
}
|
||||||
|
dataSize = imageSize / packetsPerFrame;
|
||||||
|
}
|
||||||
|
// 1g
|
||||||
|
else {
|
||||||
|
if (n == 3) {
|
||||||
|
dataSize = 768;
|
||||||
|
} else {
|
||||||
|
dataSize = 1280;
|
||||||
|
}
|
||||||
|
packetsPerFrame = imageSize / dataSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG(logINFO) << "Packets Per Frame: " << packetsPerFrame;
|
||||||
packetSize = headerSizeinPacket + dataSize;
|
packetSize = headerSizeinPacket + dataSize;
|
||||||
LOG(logINFO) << "PacketSize: " << packetSize;
|
LOG(logINFO) << "PacketSize: " << packetSize;
|
||||||
}
|
}
|
||||||
@ -462,6 +483,7 @@ class Mythen3Data : public GeneralData {
|
|||||||
*/
|
*/
|
||||||
void SetDynamicRange(int dr, bool tgEnable) {
|
void SetDynamicRange(int dr, bool tgEnable) {
|
||||||
imageSize = nPixelsX * nPixelsY * ((double)dr / 8.00);
|
imageSize = nPixelsX * nPixelsY * ((double)dr / 8.00);
|
||||||
|
|
||||||
packetsPerFrame = tgEnable ? 2 : 20;
|
packetsPerFrame = tgEnable ? 2 : 20;
|
||||||
dataSize = imageSize / packetsPerFrame;
|
dataSize = imageSize / packetsPerFrame;
|
||||||
packetSize = headerSizeinPacket + dataSize;
|
packetSize = headerSizeinPacket + dataSize;
|
||||||
|
@ -1628,7 +1628,8 @@ void Implementation::setCounterMask(const uint32_t i) {
|
|||||||
|
|
||||||
if (myDetectorType == MYTHEN3) {
|
if (myDetectorType == MYTHEN3) {
|
||||||
int ncounters = __builtin_popcount(i);
|
int ncounters = __builtin_popcount(i);
|
||||||
generalData->SetNumberofCounters(ncounters, dynamicRange);
|
generalData->SetNumberofCounters(ncounters, dynamicRange,
|
||||||
|
tengigaEnable);
|
||||||
// to update npixelsx, npixelsy in file writer
|
// to update npixelsx, npixelsy in file writer
|
||||||
for (const auto &it : dataProcessor)
|
for (const auto &it : dataProcessor)
|
||||||
it->SetPixelDimension();
|
it->SetPixelDimension();
|
||||||
@ -1651,7 +1652,14 @@ void Implementation::setDynamicRange(const uint32_t i) {
|
|||||||
dynamicRange = i;
|
dynamicRange = i;
|
||||||
|
|
||||||
if (myDetectorType == EIGER || myDetectorType == MYTHEN3) {
|
if (myDetectorType == EIGER || myDetectorType == MYTHEN3) {
|
||||||
generalData->SetDynamicRange(i, tengigaEnable);
|
|
||||||
|
if (myDetectorType == EIGER) {
|
||||||
|
generalData->SetDynamicRange(i, tengigaEnable);
|
||||||
|
} else {
|
||||||
|
int ncounters = __builtin_popcount(counterMask);
|
||||||
|
generalData->SetNumberofCounters(ncounters, i, tengigaEnable);
|
||||||
|
}
|
||||||
|
|
||||||
// to update npixelsx, npixelsy in file writer
|
// to update npixelsx, npixelsy in file writer
|
||||||
for (const auto &it : dataProcessor)
|
for (const auto &it : dataProcessor)
|
||||||
it->SetPixelDimension();
|
it->SetPixelDimension();
|
||||||
@ -1693,13 +1701,14 @@ bool Implementation::getTenGigaEnable() const {
|
|||||||
void Implementation::setTenGigaEnable(const bool b) {
|
void Implementation::setTenGigaEnable(const bool b) {
|
||||||
if (tengigaEnable != b) {
|
if (tengigaEnable != b) {
|
||||||
tengigaEnable = b;
|
tengigaEnable = b;
|
||||||
|
int ncounters = __builtin_popcount(counterMask);
|
||||||
// side effects
|
// side effects
|
||||||
switch (myDetectorType) {
|
switch (myDetectorType) {
|
||||||
case EIGER:
|
case EIGER:
|
||||||
generalData->SetTenGigaEnable(b, dynamicRange);
|
generalData->SetTenGigaEnable(b, dynamicRange);
|
||||||
break;
|
break;
|
||||||
case MYTHEN3:
|
case MYTHEN3:
|
||||||
generalData->SetDynamicRange(dynamicRange, b);
|
generalData->SetNumberofCounters(ncounters, dynamicRange, b);
|
||||||
break;
|
break;
|
||||||
case MOENCH:
|
case MOENCH:
|
||||||
case CHIPTESTBOARD:
|
case CHIPTESTBOARD:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user