120 lines
4.3 KiB
C++
120 lines
4.3 KiB
C++
#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 = HasReturnvaluesIF::RETURN_OK;
|
|
UioMapper uioMapper(axiUio, mapNum);
|
|
result = uioMapper.getMappedAdress(&baseAddress, UioMapper::Permissions::READ_WRITE);
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
return result;
|
|
}
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
}
|
|
|
|
ReturnValue_t AxiPtmeConfig::writeCaduRateReg(uint8_t rateVal) {
|
|
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
|
|
result = mutex->lockMutex(timeoutType, mutexTimeout);
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
sif::warning << "AxiPtmeConfig::writeCaduRateReg: Failed to lock mutex" << std::endl;
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
}
|
|
*(baseAddress + CADU_BITRATE_REG) = static_cast<uint32_t>(rateVal);
|
|
result = mutex->unlockMutex();
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
sif::warning << "AxiPtmeConfig::writeCaduRateReg: Failed to unlock mutex" << std::endl;
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
}
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
}
|
|
|
|
ReturnValue_t AxiPtmeConfig::enableTxclockManipulator() {
|
|
ReturnValue_t result = writeBit(COMMON_CONFIG_REG, true, BitPos::EN_TX_CLK_MANIPULATOR);
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
return result;
|
|
}
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
}
|
|
|
|
ReturnValue_t AxiPtmeConfig::disableTxclockManipulator() {
|
|
ReturnValue_t result = writeBit(COMMON_CONFIG_REG, false, BitPos::EN_TX_CLK_MANIPULATOR);
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
return result;
|
|
}
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
}
|
|
|
|
ReturnValue_t AxiPtmeConfig::enableTxclockInversion() {
|
|
ReturnValue_t result = writeBit(COMMON_CONFIG_REG, true, BitPos::INVERT_CLOCK);
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
return result;
|
|
}
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
}
|
|
|
|
ReturnValue_t AxiPtmeConfig::disableTxclockInversion() {
|
|
ReturnValue_t result = writeBit(COMMON_CONFIG_REG, false, BitPos::INVERT_CLOCK);
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
return result;
|
|
}
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
}
|
|
|
|
ReturnValue_t AxiPtmeConfig::writeReg(uint32_t regOffset, uint32_t writeVal) {
|
|
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
|
|
result = mutex->lockMutex(timeoutType, mutexTimeout);
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
sif::warning << "AxiPtmeConfig::readReg: Failed to lock mutex" << std::endl;
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
}
|
|
*(baseAddress + regOffset / ADRESS_DIVIDER) = writeVal;
|
|
result = mutex->unlockMutex();
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
sif::warning << "AxiPtmeConfig::readReg: Failed to unlock mutex" << std::endl;
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
}
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
}
|
|
|
|
ReturnValue_t AxiPtmeConfig::readReg(uint32_t regOffset, uint32_t* readVal) {
|
|
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
|
|
result = mutex->lockMutex(timeoutType, mutexTimeout);
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
sif::warning << "AxiPtmeConfig::readReg: Failed to lock mutex" << std::endl;
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
}
|
|
*readVal = *(baseAddress + regOffset / ADRESS_DIVIDER);
|
|
result = mutex->unlockMutex();
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
sif::warning << "AxiPtmeConfig::readReg: Failed to unlock mutex" << std::endl;
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
}
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
}
|
|
|
|
ReturnValue_t AxiPtmeConfig::writeBit(uint32_t regOffset, bool bitVal, BitPos bitPos) {
|
|
uint32_t readVal = 0;
|
|
ReturnValue_t result = readReg(regOffset, &readVal);
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
return result;
|
|
}
|
|
uint32_t writeVal =
|
|
(readVal & ~(1 << static_cast<uint32_t>(bitPos))) | bitVal << static_cast<uint32_t>(bitPos);
|
|
result = writeReg(regOffset, writeVal);
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
return result;
|
|
}
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
}
|