|
|
@ -15,11 +15,6 @@
|
|
|
|
#include <cerrno>
|
|
|
|
#include <cerrno>
|
|
|
|
#include <cstring>
|
|
|
|
#include <cstring>
|
|
|
|
|
|
|
|
|
|
|
|
/* Can be used for low-level debugging of the SPI bus */
|
|
|
|
|
|
|
|
#ifndef FSFW_HAL_LINUX_SPI_WIRETAPPING
|
|
|
|
|
|
|
|
#define FSFW_HAL_LINUX_SPI_WIRETAPPING 0
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SpiComIF::SpiComIF(object_id_t objectId, GpioIF* gpioComIF):
|
|
|
|
SpiComIF::SpiComIF(object_id_t objectId, GpioIF* gpioComIF):
|
|
|
|
SystemObject(objectId), gpioComIF(gpioComIF) {
|
|
|
|
SystemObject(objectId), gpioComIF(gpioComIF) {
|
|
|
|
if(gpioComIF == nullptr) {
|
|
|
|
if(gpioComIF == nullptr) {
|
|
|
@ -146,8 +141,8 @@ ReturnValue_t SpiComIF::sendMessage(CookieIF *cookie, const uint8_t *sendData, s
|
|
|
|
if(sendLen > spiCookie->getMaxBufferSize()) {
|
|
|
|
if(sendLen > spiCookie->getMaxBufferSize()) {
|
|
|
|
#if FSFW_VERBOSE_LEVEL >= 1
|
|
|
|
#if FSFW_VERBOSE_LEVEL >= 1
|
|
|
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
|
|
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
|
|
|
sif::warning << "SpiComIF::sendMessage: Too much data sent, send length" << sendLen <<
|
|
|
|
sif::warning << "SpiComIF::sendMessage: Too much data sent, send length " << sendLen <<
|
|
|
|
"larger than maximum buffer length" << spiCookie->getMaxBufferSize() << std::endl;
|
|
|
|
"larger than maximum buffer length " << spiCookie->getMaxBufferSize() << std::endl;
|
|
|
|
#else
|
|
|
|
#else
|
|
|
|
sif::printWarning("SpiComIF::sendMessage: Too much data sent, send length %lu larger "
|
|
|
|
sif::printWarning("SpiComIF::sendMessage: Too much data sent, send length %lu larger "
|
|
|
|
"than maximum buffer length %lu!\n", static_cast<unsigned long>(sendLen),
|
|
|
|
"than maximum buffer length %lu!\n", static_cast<unsigned long>(sendLen),
|
|
|
@ -193,7 +188,7 @@ ReturnValue_t SpiComIF::performRegularSendOperation(SpiCookie *spiCookie, const
|
|
|
|
spiCookie->getSpiParameters(spiMode, spiSpeed, nullptr);
|
|
|
|
spiCookie->getSpiParameters(spiMode, spiSpeed, nullptr);
|
|
|
|
setSpiSpeedAndMode(fileDescriptor, spiMode, spiSpeed);
|
|
|
|
setSpiSpeedAndMode(fileDescriptor, spiMode, spiSpeed);
|
|
|
|
spiCookie->assignWriteBuffer(sendData);
|
|
|
|
spiCookie->assignWriteBuffer(sendData);
|
|
|
|
spiCookie->assignTransferSize(sendLen);
|
|
|
|
spiCookie->setTransferSize(sendLen);
|
|
|
|
|
|
|
|
|
|
|
|
bool fullDuplex = spiCookie->isFullDuplex();
|
|
|
|
bool fullDuplex = spiCookie->isFullDuplex();
|
|
|
|
gpioId_t gpioId = spiCookie->getChipSelectPin();
|
|
|
|
gpioId_t gpioId = spiCookie->getChipSelectPin();
|
|
|
@ -202,12 +197,26 @@ ReturnValue_t SpiComIF::performRegularSendOperation(SpiCookie *spiCookie, const
|
|
|
|
if(gpioId != gpio::NO_GPIO) {
|
|
|
|
if(gpioId != gpio::NO_GPIO) {
|
|
|
|
result = spiMutex->lockMutex(timeoutType, timeoutMs);
|
|
|
|
result = spiMutex->lockMutex(timeoutType, timeoutMs);
|
|
|
|
if (result != RETURN_OK) {
|
|
|
|
if (result != RETURN_OK) {
|
|
|
|
|
|
|
|
#if FSFW_VERBOSE_LEVEL >= 1
|
|
|
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
|
|
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
|
|
|
sif::error << "SpiComIF::sendMessage: Failed to lock mutex" << std::endl;
|
|
|
|
sif::error << "SpiComIF::sendMessage: Failed to lock mutex" << std::endl;
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
sif::printError("SpiComIF::sendMessage: Failed to lock mutex\n");
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
ReturnValue_t result = gpioComIF->pullLow(gpioId);
|
|
|
|
|
|
|
|
if(result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
|
|
|
|
#if FSFW_VERBOSE_LEVEL >= 1
|
|
|
|
|
|
|
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
|
|
|
|
|
|
|
sif::warning << "SpiComIF::sendMessage: Pulling low CS pin failed" << std::endl;
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
sif::printWarning("SpiComIF::sendMessage: Pulling low CS pin failed");
|
|
|
|
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
return result;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
gpioComIF->pullLow(gpioId);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Execute transfer */
|
|
|
|
/* Execute transfer */
|
|
|
@ -218,7 +227,7 @@ ReturnValue_t SpiComIF::performRegularSendOperation(SpiCookie *spiCookie, const
|
|
|
|
utility::handleIoctlError("SpiComIF::sendMessage: ioctl error.");
|
|
|
|
utility::handleIoctlError("SpiComIF::sendMessage: ioctl error.");
|
|
|
|
result = FULL_DUPLEX_TRANSFER_FAILED;
|
|
|
|
result = FULL_DUPLEX_TRANSFER_FAILED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#if FSFW_HAL_LINUX_SPI_WIRETAPPING == 1
|
|
|
|
#if FSFW_HAL_SPI_WIRETAPPING == 1
|
|
|
|
performSpiWiretapping(spiCookie);
|
|
|
|
performSpiWiretapping(spiCookie);
|
|
|
|
#endif /* FSFW_LINUX_SPI_WIRETAPPING == 1 */
|
|
|
|
#endif /* FSFW_LINUX_SPI_WIRETAPPING == 1 */
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -335,6 +344,7 @@ ReturnValue_t SpiComIF::readReceivedMessage(CookieIF *cookie, uint8_t **buffer,
|
|
|
|
|
|
|
|
|
|
|
|
*buffer = rxBuf;
|
|
|
|
*buffer = rxBuf;
|
|
|
|
*size = spiCookie->getCurrentTransferSize();
|
|
|
|
*size = spiCookie->getCurrentTransferSize();
|
|
|
|
|
|
|
|
spiCookie->setTransferSize(0);
|
|
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -388,11 +398,11 @@ GpioIF* SpiComIF::getGpioInterface() {
|
|
|
|
void SpiComIF::setSpiSpeedAndMode(int spiFd, spi::SpiModes mode, uint32_t speed) {
|
|
|
|
void SpiComIF::setSpiSpeedAndMode(int spiFd, spi::SpiModes mode, uint32_t speed) {
|
|
|
|
int retval = ioctl(spiFd, SPI_IOC_WR_MODE, reinterpret_cast<uint8_t*>(&mode));
|
|
|
|
int retval = ioctl(spiFd, SPI_IOC_WR_MODE, reinterpret_cast<uint8_t*>(&mode));
|
|
|
|
if(retval != 0) {
|
|
|
|
if(retval != 0) {
|
|
|
|
utility::handleIoctlError("SpiTestClass::performRm3100Test: Setting SPI mode failed!");
|
|
|
|
utility::handleIoctlError("SpiComIF::setSpiSpeedAndMode: Setting SPI mode failed");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
retval = ioctl(spiFd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
|
|
|
|
retval = ioctl(spiFd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
|
|
|
|
if(retval != 0) {
|
|
|
|
if(retval != 0) {
|
|
|
|
utility::handleIoctlError("SpiTestClass::performRm3100Test: Setting SPI speed failed!");
|
|
|
|
utility::handleIoctlError("SpiComIF::setSpiSpeedAndMode: Setting SPI speed failed");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|