14 #include <linux/spi/spidev.h> 15 #include <linux/types.h> 16 #include <sys/ioctl.h> 30 "Cannot use SPI driver without full string formatting");
39 void LinuxSpiDriverComponentImpl::SpiReadWrite_handler(
const FwIndexType portNum,
42 FW_ASSERT(portNum >= 0, static_cast<FwAssertArgType>(portNum));
45 (void)SpiWriteRead_handler(portNum, writeBuffer, readBuffer);
48 SpiStatus LinuxSpiDriverComponentImpl::SpiWriteRead_handler(
const FwIndexType portNum,
51 FW_ASSERT(portNum >= 0, static_cast<FwAssertArgType>(portNum));
56 if (this->m_fd == -1) {
62 memset(&tr, 0,
sizeof(tr));
63 tr.tx_buf =
reinterpret_cast<__u64
>(writeBuffer.
getData());
64 tr.rx_buf =
reinterpret_cast<__u64
>(readBuffer.
getData());
66 tr.len =
static_cast<__u32
>(writeBuffer.
getSize());
77 int stat = ioctl(this->m_fd, SPI_IOC_MESSAGE(1), &tr);
83 this->m_bytes += readBuffer.
getSize();
90 FW_ASSERT(device >= 0, static_cast<FwAssertArgType>(device));
91 FW_ASSERT(select >= 0, static_cast<FwAssertArgType>(select));
93 this->m_device = device;
94 this->m_select = select;
137 ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
144 ret = ioctl(fd, SPI_IOC_RD_MODE, &read_mode);
150 if (mode != read_mode) {
158 ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
165 ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &read_bits);
171 if (bits != read_bits) {
178 ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &clock);
185 ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &read_clock);
191 if (clock != read_clock) {
199 (void)close(this->m_fd);
bool open(FwIndexType device, FwIndexType select, SpiFrequency clock, SpiMode spiMode=SpiMode::SPI_MODE_CPOL_LOW_CPHA_LOW)
Open device.
void log_WARNING_HI_SPI_ConfigError(I32 device, I32 select, I32 error) const
void log_WARNING_HI_SPI_WriteError(I32 device, I32 select, I32 error)
void log_WARNING_LO_SPI_ConfigMismatch(I32 device, I32 select, const Fw::StringBase ¶meter, U32 write_value, U32 read_value) const
#define FW_USE_PRINTF_FAMILY_FUNCTIONS_IN_STRING_FORMATTING
void tlmWrite_SPI_Bytes(FwSizeType arg, Fw::Time _tlmTime=Fw::Time()) const
Other errors that do not fit.
const char * toChar() const
Convert to a C-style char*.
FormatStatus format(const CHAR *formatString,...)
write formatted string to buffer
void log_WARNING_HI_SPI_OpenError(I32 device, I32 select, I32 error) const
~LinuxSpiDriverComponentImpl()
uint8_t U8
8-bit unsigned integer
FwSizeType getSize() const
PlatformIndexType FwIndexType
#define FW_ASSERT_NO_OVERFLOW(value, T)
SPI driver failed to open device.
FormatStatus
status of string format calls