Skip to content

Commit 976d51c

Browse files
Add support for CRU without data generator
1 parent cb6de90 commit 976d51c

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

include/ReadoutCard/Parameters.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,9 @@ class Parameters
149149
/// Controls the routing of the generated data.
150150
/// Supported loopback modes:
151151
/// * C-RORC: all modes
152-
/// * CRU: internal loopback only
152+
/// * CRU: internal, none (=external)
153153
///
154-
/// If not set, the driver will default to internal loopback (LoopbackMode::Rorc).
154+
/// If not set, the driver will default to internal loopback.
155155
///
156156
/// \param value The value to set
157157
/// \return Reference to this object for chaining calls

src/Cru/CruDmaChannel.cxx

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,9 @@ CruDmaChannel::CruDmaChannel(const Parameters& parameters)
3939
}
4040
}
4141

42-
if (auto enabled = parameters.getGeneratorEnabled()) {
43-
if (enabled.get() == false) {
44-
BOOST_THROW_EXCEPTION(CruException()
45-
<< ErrorInfo::Message("CRU currently only supports operation with data generator"));
46-
}
42+
if (mLoopbackMode == LoopbackMode::Diu || mLoopbackMode == LoopbackMode::Siu) {
43+
BOOST_THROW_EXCEPTION(CruException() << ErrorInfo::Message("CRU does not support given loopback mode")
44+
<< ErrorInfo::LoopbackMode(mLoopbackMode));
4745
}
4846

4947
if (mFeatures.standalone) {
@@ -89,9 +87,28 @@ void CruDmaChannel::deviceStartDma()
8987
initCru();
9088
setBufferReady();
9189

92-
if ((mLoopbackMode == LoopbackMode::Internal) && mFeatures.dataSelection) {
93-
// Something with selecting the data source... [insert link to documentation here]
94-
getBar().setDataSource(Cru::Registers::DATA_SOURCE_SELECT_INTERNAL);
90+
if (mGeneratorEnabled) {
91+
if (mLoopbackMode == LoopbackMode::Internal) {
92+
if (mFeatures.dataSelection) {
93+
getBar().setDataSource(Cru::Registers::DATA_SOURCE_SELECT_INTERNAL);
94+
} else {
95+
log("Did not set internal data source, feature not supported by firmware", InfoLogger::InfoLogger::Warning);
96+
}
97+
} else {
98+
BOOST_THROW_EXCEPTION(CruException()
99+
<< ErrorInfo::Message("CRU only supports 'Internal' loopback for data generator"));
100+
}
101+
} else {
102+
if (mLoopbackMode == LoopbackMode::None) {
103+
if (mFeatures.dataSelection) {
104+
getBar().setDataSource(Cru::Registers::DATA_SOURCE_SELECT_GBT);
105+
} else {
106+
log("Did not set GBT data source, feature not supported by firmware", InfoLogger::InfoLogger::Warning);
107+
}
108+
} else {
109+
BOOST_THROW_EXCEPTION(CruException()
110+
<< ErrorInfo::Message("CRU only supports 'None' loopback when operating without data generator"));
111+
}
95112
}
96113

97114
for (auto &link : mLinks) {

0 commit comments

Comments
 (0)