more bugfixes
This commit is contained in:
@ -28,6 +28,10 @@ ReturnValue_t PapbVcInterface::write(const uint8_t* data, size_t size, size_t& w
|
||||
if (size < 4) {
|
||||
return returnvalue::FAILED;
|
||||
}
|
||||
// The user must call finishWrite before starting a new packet transfer.
|
||||
if (partialWriteActive) {
|
||||
return INCOMPLETE_PARTIAL_WRITE;
|
||||
}
|
||||
if (pollReadyForPacket()) {
|
||||
startPacketTransfer(ByteWidthCfg::ONE);
|
||||
} else {
|
||||
@ -37,7 +41,7 @@ ReturnValue_t PapbVcInterface::write(const uint8_t* data, size_t size, size_t& w
|
||||
abortPacketTransfer();
|
||||
return returnvalue::FAILED;
|
||||
}
|
||||
return finishWriteInternal(data, size, writtenSize);
|
||||
return finishWriteInternal(data, 0, size, writtenSize, false);
|
||||
}
|
||||
|
||||
void PapbVcInterface::startPacketTransfer(ByteWidthCfg initWidth) {
|
||||
@ -53,26 +57,34 @@ bool PapbVcInterface::pollReadyForPacket() const {
|
||||
return (reg >> 6) & 0b1;
|
||||
}
|
||||
|
||||
ReturnValue_t PapbVcInterface::finishWrite(const uint8_t* data, size_t remainingSize) {
|
||||
ReturnValue_t PapbVcInterface::finishWrite(const uint8_t* data, size_t start,
|
||||
size_t remainingSize) {
|
||||
if (not pollReadyForPacket()) {
|
||||
return returnvalue::FAILED;
|
||||
}
|
||||
size_t dummy = 0;
|
||||
return finishWriteInternal(data, remainingSize, dummy);
|
||||
return finishWriteInternal(data, start, remainingSize, dummy, true);
|
||||
}
|
||||
|
||||
ReturnValue_t PapbVcInterface::finishWriteInternal(const uint8_t* data, size_t remainingSize,
|
||||
size_t& writtenSize) {
|
||||
ReturnValue_t PapbVcInterface::finishWriteInternal(const uint8_t* data, size_t start,
|
||||
size_t remainingSize, size_t& writtenSize,
|
||||
bool abortOnPartialWrite) {
|
||||
for (size_t idx = 0; idx < remainingSize; idx++) {
|
||||
if (not pollReadyForOctet(MAX_BUSY_POLLS)) {
|
||||
if (not pollReadyForPacket()) {
|
||||
writtenSize = idx;
|
||||
writtenSize = start + idx;
|
||||
partialWriteActive = true;
|
||||
if (abortOnPartialWrite) {
|
||||
abortPacketTransfer();
|
||||
partialWriteActive = false;
|
||||
return returnvalue::FAILED;
|
||||
}
|
||||
return PARTIALLY_WRITTEN;
|
||||
}
|
||||
abortPacketTransfer();
|
||||
return returnvalue::FAILED;
|
||||
}
|
||||
*(vcBaseReg + DATA_REG_OFFSET) = static_cast<uint32_t>(data[idx]);
|
||||
*(vcBaseReg + DATA_REG_OFFSET) = static_cast<uint32_t>(data[start + idx]);
|
||||
}
|
||||
if (not pollReadyForOctet(MAX_BUSY_POLLS)) {
|
||||
abortPacketTransfer();
|
||||
|
@ -42,8 +42,9 @@ class PapbVcInterface : public VirtualChannelIF {
|
||||
*/
|
||||
ReturnValue_t write(const uint8_t* data, size_t size, size_t& writtenSize) override;
|
||||
|
||||
ReturnValue_t finishWrite(const uint8_t* data, size_t remainingSize) override;
|
||||
ReturnValue_t finishWriteInternal(const uint8_t* data, size_t remainingSize, size_t& writtenSize);
|
||||
ReturnValue_t finishWrite(const uint8_t* data, size_t start, size_t remainingSize) override;
|
||||
ReturnValue_t finishWriteInternal(const uint8_t* data, size_t start, size_t remainingSize,
|
||||
size_t& writtenSize, bool abortOnPartialWrite);
|
||||
|
||||
void cancelTransfer() override;
|
||||
|
||||
@ -91,6 +92,7 @@ class PapbVcInterface : public VirtualChannelIF {
|
||||
|
||||
std::string uioFile;
|
||||
int mapNum = 0;
|
||||
bool partialWriteActive = false;
|
||||
mutable struct timespec nextDelay = {.tv_sec = 0, .tv_nsec = 0};
|
||||
const struct timespec BETWEEN_POLL_DELAY = {.tv_sec = 0, .tv_nsec = 10};
|
||||
mutable struct timespec remDelay;
|
||||
|
Reference in New Issue
Block a user