PAPB VC Simplification #661
@ -29,6 +29,7 @@ TODO: New firmware package version.
|
|||||||
## Changed
|
## Changed
|
||||||
|
|
||||||
- Removed PTME busy/ready signals. Those were not used anyway because register reads are used now.
|
- Removed PTME busy/ready signals. Those were not used anyway because register reads are used now.
|
||||||
|
- APB bus access busy checking is not done anymore as this is performed by the bus itself now.
|
||||||
|
|
||||||
# [v3.0.0] to be released
|
# [v3.0.0] to be released
|
||||||
|
|
||||||
|
@ -28,56 +28,16 @@ ReturnValue_t PapbVcInterface::write(const uint8_t* data, size_t size) {
|
|||||||
if (size < 4) {
|
if (size < 4) {
|
||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
if (pollInterfaceReadiness(0, true) == returnvalue::OK) {
|
if (pollReadyForPacket()) {
|
||||||
startPacketTransfer(ByteWidthCfg::ONE);
|
startPacketTransfer(ByteWidthCfg::ONE);
|
||||||
} else {
|
} else {
|
||||||
return DirectTmSinkIF::IS_BUSY;
|
return DirectTmSinkIF::IS_BUSY;
|
||||||
}
|
}
|
||||||
// TODO: This should work but does not.. :(
|
|
||||||
// size_t idx = 0;
|
|
||||||
// while (idx < size) {
|
|
||||||
//
|
|
||||||
// nanosleep(&BETWEEN_POLL_DELAY, &remDelay);
|
|
||||||
// if ((size - idx) < 4) {
|
|
||||||
// *vcBaseReg = CONFIG_DATA_INPUT | (size - idx - 1);
|
|
||||||
// usleep(1);
|
|
||||||
// }
|
|
||||||
// if (pollPapbBusySignal(2) == returnvalue::OK) {
|
|
||||||
// // vcBaseReg + DATA_REG_OFFSET + 3 = static_cast<uint8_t>(data + idx);
|
|
||||||
// // vcBaseReg + DATA_REG_OFFSET + 2 = static_cast<uint8_t>(data + idx + 1);
|
|
||||||
// // vcBaseReg + DATA_REG_OFFSET + 1 = static_cast<uint8_t>(data + idx + 2);
|
|
||||||
// // vcBaseReg + DATA_REG_OFFSET = static_cast<uint8_t>(data + idx + 3);
|
|
||||||
//
|
|
||||||
// // std::memcpy((vcBaseReg + DATA_REG_OFFSET), data + idx , nextWriteSize);
|
|
||||||
// *(vcBaseReg + DATA_REG_OFFSET) = *reinterpret_cast<const uint32_t*>(data + idx);
|
|
||||||
// //uint8_t* byteReg = reinterpret_cast<uint8_t*>(vcBaseReg + DATA_REG_OFFSET);
|
|
||||||
//
|
|
||||||
// //byteReg[0] = data[idx];
|
|
||||||
// //byteReg[1] = data[idx];
|
|
||||||
// } else {
|
|
||||||
// abortPacketTransfer();
|
|
||||||
// return returnvalue::FAILED;
|
|
||||||
// }
|
|
||||||
// // TODO: Change this after the bugfix. Right now, the PAPB ignores the content of the byte
|
|
||||||
// // width configuration.5
|
|
||||||
// // It's okay to increment by a larger amount for the last segment here, loop will be over
|
|
||||||
// // in any case.
|
|
||||||
// idx += 4;
|
|
||||||
// }
|
|
||||||
for (size_t idx = 0; idx < size; idx++) {
|
for (size_t idx = 0; idx < size; idx++) {
|
||||||
if (pollInterfaceReadiness(2, false) == returnvalue::OK) {
|
// if (pollInterfaceReadiness(2, false) == returnvalue::OK) {
|
||||||
*(vcBaseReg + DATA_REG_OFFSET) = static_cast<uint32_t>(data[idx]);
|
*(vcBaseReg + DATA_REG_OFFSET) = static_cast<uint32_t>(data[idx]);
|
||||||
} else {
|
|
||||||
abortPacketTransfer();
|
|
||||||
return returnvalue::FAILED;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (pollInterfaceReadiness(2, false) == returnvalue::OK) {
|
|
||||||
completePacketTransfer();
|
completePacketTransfer();
|
||||||
} else {
|
|
||||||
abortPacketTransfer();
|
|
||||||
return returnvalue::FAILED;
|
|
||||||
}
|
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,40 +47,12 @@ void PapbVcInterface::startPacketTransfer(ByteWidthCfg initWidth) {
|
|||||||
|
|
||||||
void PapbVcInterface::completePacketTransfer() { *vcBaseReg = CONFIG_END; }
|
void PapbVcInterface::completePacketTransfer() { *vcBaseReg = CONFIG_END; }
|
||||||
|
|
||||||
ReturnValue_t PapbVcInterface::pollInterfaceReadiness(uint32_t maxPollRetries,
|
bool PapbVcInterface::pollReadyForPacket() const {
|
||||||
bool checkReadyForPacketState) const {
|
|
||||||
uint32_t busyIdx = 0;
|
|
||||||
nextDelay.tv_nsec = FIRST_DELAY_PAPB_POLLING_NS;
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
// Check if PAPB interface is ready to receive data. Use the configuration register for this.
|
// Check if PAPB interface is ready to receive data. Use the configuration register for this.
|
||||||
// Bit 5, see PTME ptme_001_01-0-7-r2 Table 31.
|
// Bit 5, see PTME ptme_001_01-0-7-r2 Table 31.
|
||||||
uint32_t reg = *vcBaseReg;
|
uint32_t reg = *vcBaseReg;
|
||||||
bool busy = (reg >> 5) & 0b1;
|
// bool busy = (reg >> 5) & 0b1;
|
||||||
bool readyForPacket = (reg >> 6) & 0b1;
|
return (reg >> 6) & 0b1;
|
||||||
if (checkReadyForPacketState) {
|
|
||||||
if (not busy and readyForPacket) {
|
|
||||||
return returnvalue::OK;
|
|
||||||
} else if (not busy and not readyForPacket) {
|
|
||||||
return PAPB_BUSY;
|
|
||||||
}
|
|
||||||
} else if (not busy) {
|
|
||||||
return returnvalue::OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
busyIdx++;
|
|
||||||
if (busyIdx >= maxPollRetries) {
|
|
||||||
return PAPB_BUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ignore signal handling here for now.
|
|
||||||
nanosleep(&nextDelay, &remDelay);
|
|
||||||
// Adaptive delay.
|
|
||||||
if (nextDelay.tv_nsec * 2 <= MAX_DELAY_PAPB_POLLING_NS) {
|
|
||||||
nextDelay.tv_nsec *= 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return returnvalue::OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PapbVcInterface::isVcInterfaceBufferEmpty() {
|
bool PapbVcInterface::isVcInterfaceBufferEmpty() {
|
||||||
@ -141,7 +73,7 @@ bool PapbVcInterface::isVcInterfaceBufferEmpty() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PapbVcInterface::isBusy() const { return pollInterfaceReadiness(0, true) == PAPB_BUSY; }
|
bool PapbVcInterface::isBusy() const { return not pollReadyForPacket(); }
|
||||||
|
|
||||||
void PapbVcInterface::cancelTransfer() { abortPacketTransfer(); }
|
void PapbVcInterface::cancelTransfer() { abortPacketTransfer(); }
|
||||||
|
|
||||||
|
@ -116,8 +116,7 @@ class PapbVcInterface : public VirtualChannelIF {
|
|||||||
*
|
*
|
||||||
* @return returnvalue::OK when ready to receive data else PAPB_BUSY.
|
* @return returnvalue::OK when ready to receive data else PAPB_BUSY.
|
||||||
*/
|
*/
|
||||||
inline ReturnValue_t pollInterfaceReadiness(uint32_t maxPollRetries,
|
inline bool pollReadyForPacket() const;
|
||||||
bool checkReadyForPacketState) const;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This function can be used for debugging to check whether there are packets in
|
* @brief This function can be used for debugging to check whether there are packets in
|
||||||
|
Loading…
Reference in New Issue
Block a user