Skip to content

Commit 273b4c6

Browse files
authored
Merge pull request #394 from sy-c/master
v0.39.1
2 parents 16417f1 + 91b3c44 commit 273b4c6

File tree

2 files changed

+29
-10
lines changed

2 files changed

+29
-10
lines changed

doc/releaseNotes.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,6 @@ This file describes the main feature changes for released versions of ReadoutCar
99

1010
## v0.39.0 - 07/10/2022
1111
- Added option --status-report to roc-config, in order to dump roc-status (similar) output to given file name. Can be stdout, infologger, or a file name. The file name can be preceded with + for appending the file. Name can contain special escape sequences %t (timestamp) %T (date/time) or %i (card ID). Infologger reports are set with error code 4805.
12+
13+
## v0.39.1 - 16/11/2022
14+
- Fixed CRORC start-stop-start: fifo ready counters reset, emptying last page if unused, flush order on stop, release of unused pages in internal fifo.

src/Crorc/CrorcDmaChannel.cxx

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -105,17 +105,15 @@ CrorcDmaChannel::~CrorcDmaChannel()
105105

106106
void CrorcDmaChannel::deviceStartDma()
107107
{
108+
// reset fifo ready counters
109+
getSuperpageInfoUser()->size = 0;
110+
getSuperpageInfoUser()->count = 0xff;
111+
mSPAvailCount = 0xff;
112+
108113
deviceResetChannel(ResetLevel::Internal);
109114

110115
startDataReceiving();
111116

112-
while (!mReadyQueue.isEmpty()) {
113-
mReadyQueue.popFront();
114-
}
115-
while (!mTransferQueue.isEmpty()) {
116-
mTransferQueue.popFront();
117-
}
118-
119117
if (mGeneratorEnabled) {
120118
log("Starting data generator", LogInfoDevel_(4301));
121119
startDataGenerator();
@@ -132,14 +130,14 @@ void CrorcDmaChannel::deviceStartDma()
132130
}
133131
}
134132

133+
// needed to wait a bit FEE
135134
std::this_thread::sleep_for(100ms);
136135

137136
log("DMA started", LogInfoOps_(4303));
138137
}
139138

140139
void CrorcDmaChannel::deviceStopDma()
141140
{
142-
getBar()->flushSuperpages();
143141
if (mGeneratorEnabled) {
144142
getBar()->stopDataGenerator();
145143
} else {
@@ -148,10 +146,25 @@ void CrorcDmaChannel::deviceStopDma()
148146
getBar()->stopTrigger();
149147
}
150148
}
149+
getBar()->flushSuperpages();
151150
getBar()->stopDataReceiver();
152151

153-
// Return any filled superpages
154-
fillSuperpages();
152+
153+
// handling of last superpage pushed, being it ready or not
154+
while (!mIntermediateQueue.isEmpty()) {
155+
auto superpage = mIntermediateQueue.frontPtr();
156+
if (isASuperpageAvailable()) {
157+
superpage->setReceived(getSuperpageInfoUser()->size); // length in bytes
158+
superpage->setReady(true);
159+
} else {
160+
superpage->setReceived(0); // page was not used yet
161+
superpage->setReady(false);
162+
}
163+
mReadyQueue.write(*superpage);
164+
mIntermediateQueue.popFront();
165+
//printf("\n*** %04d *** final pop 0x%p : intermediate -> ready (size %d)\n\n", __LINE__, (void*)(superpage->getOffset()), (int)superpage->getReceived());
166+
}
167+
155168

156169
// Return any superpages that have been pushed up in the meantime but won't get filled
157170
while (mTransferQueue.sizeGuess()) {
@@ -160,6 +173,7 @@ void CrorcDmaChannel::deviceStopDma()
160173
superpage->setReady(false);
161174
mReadyQueue.write(*superpage);
162175
mTransferQueue.popFront();
176+
//printf("\n*** %04d *** final pop 0x%p : transfer -> ready\n\n", __LINE__, (void*)(superpage->getOffset()));
163177
}
164178
}
165179

@@ -265,6 +279,7 @@ void CrorcDmaChannel::fillSuperpages()
265279
superpage->setReady(true);
266280
mReadyQueue.write(*superpage);
267281
mIntermediateQueue.popFront();
282+
//printf("\n*** %04d *** pop 0x%p : intermediate -> ready (size %d)\n\n", __LINE__, (void*)(superpage->getOffset()), (int)superpage->getReceived());
268283
}
269284

270285
// Push single Superpage to the firmware when available
@@ -276,6 +291,7 @@ void CrorcDmaChannel::fillSuperpages()
276291
getBar()->pushSuperpageAddressAndSize(busAddress, inSuperpage->getSize());
277292

278293
mIntermediateQueue.write(*inSuperpage);
294+
//printf("\n*** %04d *** push 0x%p : transfer -> intermediate\n\n", __LINE__, (void*)(inSuperpage->getOffset()));
279295
}
280296
}
281297

0 commit comments

Comments
 (0)