From 703eaaa9aa1d7e74ab722974b4131491d8da77ea Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 2 Apr 2023 15:32:04 +0200 Subject: [PATCH] poll threshold param cmd handling --- linux/ipcore/AxiPtmeConfig.cpp | 8 ++-- linux/ipcore/AxiPtmeConfig.h | 2 +- linux/ipcore/PtmeConfig.cpp | 4 ++ linux/ipcore/PtmeConfig.h | 2 + mission/com/CcsdsIpCoreHandler.cpp | 61 ++++++++++++++++++++++-------- mission/com/CcsdsIpCoreHandler.h | 11 ++++-- 6 files changed, 63 insertions(+), 25 deletions(-) diff --git a/linux/ipcore/AxiPtmeConfig.cpp b/linux/ipcore/AxiPtmeConfig.cpp index 0947ffda..81bb7414 100644 --- a/linux/ipcore/AxiPtmeConfig.cpp +++ b/linux/ipcore/AxiPtmeConfig.cpp @@ -89,14 +89,12 @@ AxiPtmeConfig::IdlePollThreshold AxiPtmeConfig::readPollThreshold() { return static_cast((regVal >> 3) & 0b111); } +void AxiPtmeConfig::writeCommonCfgReg(uint32_t value) { writeReg(COMMON_CONFIG_REG, value); } +uint32_t AxiPtmeConfig::readCommonCfgReg() { return readReg(COMMON_CONFIG_REG); } + void AxiPtmeConfig::writeBit(uint32_t regOffset, bool bitVal, BitPos bitPos) { uint32_t readVal = readReg(regOffset); uint32_t writeVal = (readVal & ~(1 << static_cast(bitPos))) | bitVal << static_cast(bitPos); writeReg(regOffset, writeVal); } - -uint32_t AxiPtmeConfig::readCommonCfgReg() { - MutexGuard mg(mutex, timeoutType, mutexTimeout); - return *(baseAddress + COMMON_CONFIG_REG / ADRESS_DIVIDER); -} diff --git a/linux/ipcore/AxiPtmeConfig.h b/linux/ipcore/AxiPtmeConfig.h index 68d32b9a..98188775 100644 --- a/linux/ipcore/AxiPtmeConfig.h +++ b/linux/ipcore/AxiPtmeConfig.h @@ -104,7 +104,7 @@ class AxiPtmeConfig : public SystemObject { uint32_t readReg(uint32_t regOffset); uint32_t readCommonCfgReg(); - uint32_t writeCommonCfgReg(uint32_t value); + void writeCommonCfgReg(uint32_t value); /** * @brief Sets one bit in a register diff --git a/linux/ipcore/PtmeConfig.cpp b/linux/ipcore/PtmeConfig.cpp index b6152e81..5f247b54 100644 --- a/linux/ipcore/PtmeConfig.cpp +++ b/linux/ipcore/PtmeConfig.cpp @@ -49,3 +49,7 @@ void PtmeConfig::enableBatPriorityBit(bool enable) { axiPtmeConfig->disableBatPriorityBit(); } } + +void PtmeConfig::setPollThreshold(AxiPtmeConfig::IdlePollThreshold pollThreshold) { + axiPtmeConfig->writePollThreshold(pollThreshold); +} diff --git a/linux/ipcore/PtmeConfig.h b/linux/ipcore/PtmeConfig.h index 5c31f4b9..87614187 100644 --- a/linux/ipcore/PtmeConfig.h +++ b/linux/ipcore/PtmeConfig.h @@ -64,6 +64,8 @@ class PtmeConfig : public SystemObject { */ void enableBatPriorityBit(bool enable); + void setPollThreshold(AxiPtmeConfig::IdlePollThreshold pollThreshold); + private: static const uint8_t INTERFACE_ID = CLASS_ID::RATE_SETTER; diff --git a/mission/com/CcsdsIpCoreHandler.cpp b/mission/com/CcsdsIpCoreHandler.cpp index d5fa35e6..625c90cd 100644 --- a/mission/com/CcsdsIpCoreHandler.cpp +++ b/mission/com/CcsdsIpCoreHandler.cpp @@ -75,11 +75,9 @@ ReturnValue_t CcsdsIpCoreHandler::initialize() { } // This also pulls the PTME out of reset state. - if (batPriorityParam == 0) { - disablePrioritySelectMode(); - } else { - enablePrioritySelectMode(); - } + updateBatPriorityFromParam(); + ptmeConfig.setPollThreshold( + static_cast(params.pollThresholdParam)); resetPtme(); ptmeLocked = false; @@ -123,7 +121,10 @@ ReturnValue_t CcsdsIpCoreHandler::getParameter(uint8_t domainId, uint8_t uniqueI ParameterWrapper* parameterWrapper, const ParameterWrapper* newValues, uint16_t startAtIndex) { - if ((domainId == 0) and (uniqueIdentifier == ParamId::BAT_PRIORITY)) { + if (domainId != 0) { + return HasParametersIF::INVALID_DOMAIN_ID; + } + if (uniqueIdentifier == ParamId::BAT_PRIORITY) { uint8_t newVal = 0; ReturnValue_t result = newValues->getElement(&newVal); if (result != returnvalue::OK) { @@ -132,8 +133,8 @@ ReturnValue_t CcsdsIpCoreHandler::getParameter(uint8_t domainId, uint8_t uniqueI if (newVal > 1) { return HasParametersIF::INVALID_VALUE; } - parameterWrapper->set(batPriorityParam); - if (newVal != batPriorityParam) { + parameterWrapper->set(params.batPriorityParam); + if (newVal != params.batPriorityParam) { // This ensures that the BAT priority is updated at some point when an update of the PTME is // allowed updateContext.updateBatPrio = true; @@ -144,6 +145,23 @@ ReturnValue_t CcsdsIpCoreHandler::getParameter(uint8_t domainId, uint8_t uniqueI } } return returnvalue::OK; + } else if (uniqueIdentifier == ParamId::POLL_THRESHOLD) { + uint8_t newVal = 0; + ReturnValue_t result = newValues->getElement(&newVal); + if (result != returnvalue::OK) { + return result; + } + if (newVal > static_cast(AxiPtmeConfig::NEVER)) { + return HasParametersIF::INVALID_VALUE; + } + parameterWrapper->set(newVal); + if (newVal != params.pollThresholdParam) { + updateContext.updatePollThreshold = true; + if (mode == MODE_OFF) { + initPtmeUpdateAfterXCycles(); + } + } + return returnvalue::OK; } return HasParametersIF::INVALID_IDENTIFIER_ID; } @@ -158,12 +176,18 @@ MessageQueueId_t CcsdsIpCoreHandler::getRequestQueue() const { ReturnValue_t CcsdsIpCoreHandler::executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, const uint8_t* data, size_t size) { ReturnValue_t result = returnvalue::OK; - // TODO: Update directly when off, otherwise set update context. switch (actionId) { case ARBITRARY_RATE: { uint32_t bitrate = 0; - SerializeAdapter::deSerialize(&bitrate, &data, &size, SerializeIF::Endianness::BIG); - result = ptmeConfig.setRate(bitrate); + result = SerializeAdapter::deSerialize(&bitrate, &data, &size, SerializeIF::Endianness::BIG); + if (result != returnvalue::OK) { + return result; + } + ptmeConfig.setRate(bitrate); + updateContext.updateClockRate = true; + if (mode == MODE_OFF) { + initPtmeUpdateAfterXCycles(); + } break; } case ENABLE_TX_CLK_MANIPULATOR: { @@ -272,7 +296,7 @@ void CcsdsIpCoreHandler::enablePrioritySelectMode() { ptmeConfig.enableBatPriori void CcsdsIpCoreHandler::disablePrioritySelectMode() { ptmeConfig.enableBatPriorityBit(false); } void CcsdsIpCoreHandler::updateBatPriorityFromParam() { - if (batPriorityParam == 0) { + if (params.batPriorityParam == 0) { disablePrioritySelectMode(); } else { enablePrioritySelectMode(); @@ -291,9 +315,17 @@ void CcsdsIpCoreHandler::performPtmeUpdateWhenApplicable() { return; } if (updateContext.ptmeUpdateCycleCount >= 2) { + bool doResetPtme = false; if (updateContext.updateBatPrio) { updateBatPriorityFromParam(); updateContext.updateBatPrio = false; + doResetPtme = true; + } + if (updateContext.updatePollThreshold) { + ptmeConfig.setPollThreshold( + static_cast(params.pollThresholdParam)); + updateContext.updatePollThreshold = false; + doResetPtme = true; } ReturnValue_t result = returnvalue::OK; if (updateContext.updateClockRate) { @@ -313,10 +345,7 @@ void CcsdsIpCoreHandler::performPtmeUpdateWhenApplicable() { sif::error << "CcsdsIpCoreHandler: Setting datarate failed" << std::endl; } updateContext.updateClockRate = false; - } - bool doResetPtme = true; - if (not updateContext.updateBatPrio and not updateContext.updateClockRate) { - doResetPtme = false; + doResetPtme = true; } finishPtmeUpdateAfterXCycles(doResetPtme); return; diff --git a/mission/com/CcsdsIpCoreHandler.h b/mission/com/CcsdsIpCoreHandler.h index 785f84a5..a5d02ad0 100644 --- a/mission/com/CcsdsIpCoreHandler.h +++ b/mission/com/CcsdsIpCoreHandler.h @@ -60,7 +60,7 @@ class CcsdsIpCoreHandler : public SystemObject, public ReceivesParameterMessagesIF, public HasActionsIF { public: - enum ParamId : uint8_t { BAT_PRIORITY = 0 }; + enum ParamId : uint8_t { BAT_PRIORITY = 0, POLL_THRESHOLD = 1 }; static const bool LINK_UP = true; static const bool LINK_DOWN = false; @@ -156,12 +156,17 @@ class CcsdsIpCoreHandler : public SystemObject, PtmeConfig& ptmeConfig; PtmeGpios ptmeGpios; - // BAT priority bit on by default to enable priority selection mode for the PTME. - uint8_t batPriorityParam = 0; + struct Parameters { + // BAT priority bit on by default to enable priority selection mode for the PTME. + uint8_t batPriorityParam = 0; + uint8_t pollThresholdParam = static_cast(AxiPtmeConfig::IdlePollThreshold::POLL_4); + + } params; struct UpdateContext { bool updateBatPrio = false; bool updateClockRate = false; + bool updatePollThreshold = false; bool enableTransmitAfterPtmeUpdate = false; uint8_t ptmeUpdateCycleCount = 0; bool performPtmeUpdateAfterXCycles = false;