mirror of
https://github.com/nasa/fprime.git
synced 2025-12-11 13:04:17 -06:00
* Update Spi component to return a status on device access * Format LinuxSpiDriver files and update comments from TODO to DEPRECATED * Add assertions to LinuxSpiDriver * Add assertions to LinuxSpiDriver --------- Co-authored-by: djbyrne <djbyrne@jpl.nasa.gov>
101 lines
3.4 KiB
C++
101 lines
3.4 KiB
C++
// ======================================================================
|
|
// \title LinuxSpiDriverImpl.hpp
|
|
// \author tcanham
|
|
// \brief hpp file for LinuxSpiDriver component implementation class
|
|
//
|
|
// \copyright
|
|
// Copyright 2009-2015, by the California Institute of Technology.
|
|
// ALL RIGHTS RESERVED. United States Government Sponsorship
|
|
// acknowledged.
|
|
//
|
|
// ======================================================================
|
|
|
|
#ifndef LinuxSpiDriver_HPP
|
|
#define LinuxSpiDriver_HPP
|
|
|
|
#include "Drv/LinuxSpiDriver/LinuxSpiDriverComponentAc.hpp"
|
|
|
|
namespace Drv {
|
|
|
|
/**
|
|
* This was taken from the dspal_tester example
|
|
*
|
|
* Supported SPI frequency to talk to MPU9x50 slave device
|
|
* MPU9x50 SPI interface supports upto 20MHz frequency. However 20MHz is not
|
|
* reliable in our test and corrupted data is observed.
|
|
*/
|
|
enum SpiFrequency {
|
|
SPI_FREQUENCY_1MHZ = 1000000UL,
|
|
SPI_FREQUENCY_5MHZ = 5000000UL,
|
|
SPI_FREQUENCY_10MHZ = 10000000UL,
|
|
SPI_FREQUENCY_15MHZ = 15000000UL,
|
|
SPI_FREQUENCY_20MHZ = 20000000UL,
|
|
};
|
|
|
|
/**
|
|
* SPI Mode Select
|
|
*
|
|
* Defines the SPI Clock Polarity and Phase for each SPI Transaction.
|
|
*
|
|
* SPI Clock Polarity(CPOL): Defines clock polarity as idle low (CPOL = 0) or idle high(CPOL = 1)
|
|
* SPI Clock Phase(CPHA): Defines if data is shifted out on the rising clock edge and sampled
|
|
* on the falling clock edge(CPHA = 0) or if data is shifted out on the
|
|
* falling clock edge and sampled on the rising clock edge(CPHA=1)
|
|
*
|
|
*/
|
|
enum SpiMode {
|
|
SPI_MODE_CPOL_LOW_CPHA_LOW, ///< (CPOL = 0, CPHA = 0)
|
|
SPI_MODE_CPOL_LOW_CPHA_HIGH, ///< (CPOL = 0, CPHA = 1)
|
|
SPI_MODE_CPOL_HIGH_CPHA_LOW, ///< (CPOL = 1, CPHA = 0)
|
|
SPI_MODE_CPOL_HIGH_CPHA_HIGH, ///< (CPOL = 1, CPHA = 1)
|
|
};
|
|
|
|
class LinuxSpiDriverComponentImpl final : public LinuxSpiDriverComponentBase {
|
|
public:
|
|
// ----------------------------------------------------------------------
|
|
// Construction, initialization, and destruction
|
|
// ----------------------------------------------------------------------
|
|
|
|
//! Construct object LinuxSpiDriver
|
|
//!
|
|
LinuxSpiDriverComponentImpl(const char* const compName /*!< The component name*/
|
|
);
|
|
|
|
//! Destroy object LinuxSpiDriver
|
|
//!
|
|
~LinuxSpiDriverComponentImpl();
|
|
|
|
//! Open device
|
|
bool open(FwIndexType device,
|
|
FwIndexType select,
|
|
SpiFrequency clock,
|
|
SpiMode spiMode = SpiMode::SPI_MODE_CPOL_LOW_CPHA_LOW);
|
|
|
|
private:
|
|
// ----------------------------------------------------------------------
|
|
// Handler implementations for user-defined typed input ports
|
|
// ----------------------------------------------------------------------
|
|
|
|
//! Handler implementation for SpiWriteRead
|
|
//!
|
|
SpiStatus SpiWriteRead_handler(const FwIndexType portNum, /*!< The port number*/
|
|
Fw::Buffer& WriteBuffer,
|
|
Fw::Buffer& readBuffer);
|
|
|
|
// @ DEPRECATED: Use SpiWriteRead port instead (same operation with a return value)
|
|
//! Handler implementation for SpiReadWrite
|
|
//!
|
|
void SpiReadWrite_handler(const FwIndexType portNum, /*!< The port number*/
|
|
Fw::Buffer& WriteBuffer,
|
|
Fw::Buffer& readBuffer);
|
|
|
|
int m_fd;
|
|
FwIndexType m_device;
|
|
FwIndexType m_select;
|
|
FwSizeType m_bytes;
|
|
};
|
|
|
|
} // end namespace Drv
|
|
|
|
#endif
|