#include "AxiPtmeConfig.h" #include "fsfw/serviceinterface/ServiceInterface.h" #include "fsfw_hal/linux/uio/UioMapper.h" AxiPtmeConfig::AxiPtmeConfig(object_id_t objectId, std::string axiUio, int mapNum) : SystemObject(objectId), axiUio(axiUio), mapNum(mapNum) { mutex = MutexFactory::instance()->createMutex(); if (mutex == nullptr) { sif::warning << "Failed to create mutex" << std::endl; } } AxiPtmeConfig::~AxiPtmeConfig() {} ReturnValue_t AxiPtmeConfig::initialize() { ReturnValue_t result = returnvalue::OK; UioMapper uioMapper(axiUio, mapNum); result = uioMapper.getMappedAdress(&baseAddress, UioMapper::Permissions::READ_WRITE); if (result != returnvalue::OK) { return result; } return returnvalue::OK; } ReturnValue_t AxiPtmeConfig::writeCaduRateReg(uint8_t rateVal) { ReturnValue_t result = returnvalue::OK; result = mutex->lockMutex(timeoutType, mutexTimeout); if (result != returnvalue::OK) { sif::warning << "AxiPtmeConfig::writeCaduRateReg: Failed to lock mutex" << std::endl; return returnvalue::FAILED; } *(baseAddress + CADU_BITRATE_REG) = static_cast(rateVal); result = mutex->unlockMutex(); if (result != returnvalue::OK) { sif::warning << "AxiPtmeConfig::writeCaduRateReg: Failed to unlock mutex" << std::endl; return returnvalue::FAILED; } return returnvalue::OK; } ReturnValue_t AxiPtmeConfig::enableTxclockManipulator() { ReturnValue_t result = writeBit(COMMON_CONFIG_REG, true, BitPos::EN_TX_CLK_MANIPULATOR); if (result != returnvalue::OK) { return result; } return returnvalue::OK; } ReturnValue_t AxiPtmeConfig::disableTxclockManipulator() { ReturnValue_t result = writeBit(COMMON_CONFIG_REG, false, BitPos::EN_TX_CLK_MANIPULATOR); if (result != returnvalue::OK) { return result; } return returnvalue::OK; } ReturnValue_t AxiPtmeConfig::enableTxclockInversion() { ReturnValue_t result = writeBit(COMMON_CONFIG_REG, true, BitPos::INVERT_CLOCK); if (result != returnvalue::OK) { return result; } return returnvalue::OK; } ReturnValue_t AxiPtmeConfig::disableTxclockInversion() { ReturnValue_t result = writeBit(COMMON_CONFIG_REG, false, BitPos::INVERT_CLOCK); if (result != returnvalue::OK) { return result; } return returnvalue::OK; } ReturnValue_t AxiPtmeConfig::writeReg(uint32_t regOffset, uint32_t writeVal) { ReturnValue_t result = returnvalue::OK; result = mutex->lockMutex(timeoutType, mutexTimeout); if (result != returnvalue::OK) { sif::warning << "AxiPtmeConfig::readReg: Failed to lock mutex" << std::endl; return returnvalue::FAILED; } *(baseAddress + regOffset / ADRESS_DIVIDER) = writeVal; result = mutex->unlockMutex(); if (result != returnvalue::OK) { sif::warning << "AxiPtmeConfig::readReg: Failed to unlock mutex" << std::endl; return returnvalue::FAILED; } return returnvalue::OK; } ReturnValue_t AxiPtmeConfig::readReg(uint32_t regOffset, uint32_t* readVal) { ReturnValue_t result = returnvalue::OK; result = mutex->lockMutex(timeoutType, mutexTimeout); if (result != returnvalue::OK) { sif::warning << "AxiPtmeConfig::readReg: Failed to lock mutex" << std::endl; return returnvalue::FAILED; } *readVal = *(baseAddress + regOffset / ADRESS_DIVIDER); result = mutex->unlockMutex(); if (result != returnvalue::OK) { sif::warning << "AxiPtmeConfig::readReg: Failed to unlock mutex" << std::endl; return returnvalue::FAILED; } return returnvalue::OK; } ReturnValue_t AxiPtmeConfig::writeBit(uint32_t regOffset, bool bitVal, BitPos bitPos) { uint32_t readVal = 0; ReturnValue_t result = readReg(regOffset, &readVal); if (result != returnvalue::OK) { return result; } uint32_t writeVal = (readVal & ~(1 << static_cast(bitPos))) | bitVal << static_cast(bitPos); result = writeReg(regOffset, writeVal); if (result != returnvalue::OK) { return result; } return returnvalue::OK; }