Open Model Railroad Network (OpenMRN)
Loading...
Searching...
No Matches
CC32xxSPI Class Reference

Specialization of Serial SPI driver for CC32xx devices. More...

#include <CC32xxSPI.hxx>

Inheritance diagram for CC32xxSPI:
SPI Atomic Node Device FileIO

Public Member Functions

 CC32xxSPI (const char *name, unsigned long base, uint32_t interrupt, ChipSelectMethod cs_assert, ChipSelectMethod cs_deassert, OSMutex *bus_lock=nullptr, size_t dma_threshold=DEFAULT_DMA_THRESHOLD_BYTES, uint32_t dma_channel_index_tx=UDMA_CH7_GSPI_TX, uint32_t dma_channel_index_rx=UDMA_CH6_GSPI_RX)
 Constructor.
 
 ~CC32xxSPI ()
 Destructor.
 
void interrupt_handler ()
 handle an interrupt.
 
OSMutexget_lock ()
 This method provides a reference to the Mutex used by this device driver.
 
- Public Member Functions inherited from SPI
int transfer_with_cs_assert (struct spi_ioc_transfer *msg)
 Method to transmit/receive the data.
 
int transfer_with_cs_assert_polled (struct spi_ioc_transfer *msgs, int num=1)
 Method to transmit/receive the data.
 
int transfer_messages (struct spi_ioc_transfer *msgs, int num)
 Conduct multiple message transfers with one stop at the end.
 
- Public Member Functions inherited from Device
 Device (const char *name)
 Constructor.
 
virtual ~Device ()
 Destructor.
 

Private Member Functions

void enable () override
 Function to enable device.
 
void disable () override
 Function to disable device.
 
int update_configuration () override
 Update the configuration of the bus.
 
int transfer (struct spi_ioc_transfer *msg) override
 Method to transmit/receive the data.
 
template<typename T >
int transfer_polled (struct spi_ioc_transfer *msg)
 Method to transmit/receive the data.
 
int transfer_polled (struct spi_ioc_transfer *msg) override
 Method to transmit/receive the data.
 
void config_dma (struct spi_ioc_transfer *msg)
 Configure a DMA transaction.
 
long data_get_non_blocking (unsigned long *data)
 Receives a word from the specified port.
 
long data_put_non_blocking (unsigned long data)
 Transmits a word on the specified port.
 
void data_put (unsigned long data)
 Waits until the word is transmitted on the specified port.
 
void set_configuration ()
 Set the instance local configuration.
 
 CC32xxSPI ()
 Default constructor.
 
 DISALLOW_COPY_AND_ASSIGN (CC32xxSPI)
 
- Private Member Functions inherited from Atomic
void lock ()
 
void unlock ()
 

Private Attributes

UDMACC32XX_Handle dmaHandle_
 handle to DMA reference
 
OSSemsem_
 reference to the semaphore belonging to this bus
 
unsigned long base_
 base address of this device
 
unsigned long clock_
 clock rate supplied to the module
 
unsigned long interrupt_
 interrupt of this device
 
size_t dmaThreshold_
 threshold in bytes to start using DMA
 
uint32_t dmaChannelIndexTx_
 TX DMA channel index.
 
uint32_t dmaChannelIndexRx_
 RX DMA channel index.
 
uint32_t spiChctrl_
 instance local copy of configuration
 
uint32_t spiChconf_
 instance local copy of configuration
 
uint32_t spiXferlevel_
 instance local copy of configuration
 

Static Private Attributes

static constexpr size_t DEFAULT_DMA_THRESHOLD_BYTES = 64
 
static constexpr size_t MAX_DMA_TRANSFER_AMOUNT = 1024
 Maximum number of bytes transferred in a single DMA transaction.
 
static constexpr uint32_t dmaRxConfig_ []
 This lookup table is used to configure the DMA channels for the appropriate (8bit, 16bit or 32bit) transfer sizes.
 
static constexpr uint32_t dmaTxConfig_ []
 This lookup table is used to configure the DMA channels for the appropriate (8bit, 16bit or 32bit) transfer sizes.
 
static constexpr uint32_t dmaNullConfig_ []
 This lookup table is used to configure the DMA channels for the appropriate (8bit, 16bit or 32bit) transfer sizes when either txBuf or rxBuf are NULL.
 

Additional Inherited Members

- Public Types inherited from SPI
typedef void(* ChipSelectMethod) ()
 Function point for the chip select assert and deassert methods.
 
- Static Public Member Functions inherited from Device
static int open (struct _reent *reent, const char *path, int flags, int mode)
 Open a file or device.
 
static int close (struct _reent *reent, int fd)
 Close a file or device.
 
static int stat (struct _reent *reent, const char *path, struct stat *stat)
 Get the status information of a file or device.
 
static int select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, long long timeout)
 POSIX select().
 
static void select_clear ()
 Clears the current thread's select bits.
 
- Static Public Member Functions inherited from FileIO
static ssize_t read (struct _reent *reent, int fd, void *buf, size_t count)
 Read from a file or device.
 
static ssize_t write (struct _reent *reent, int fd, const void *buf, size_t count)
 Write to a file or device.
 
static _off_t lseek (struct _reent *reent, int fd, _off_t offset, int whence)
 Change the offset index of a file or device.
 
static int fstat (struct _reent *reent, int fd, struct stat *stat)
 Get the status information of a file or device.
 
static int ioctl (int fd, unsigned long int key, unsigned long data)
 Request and ioctl transaction.
 
static int fcntl (int fd, int cmd, unsigned long data)
 Manipulate a file descriptor.
 
static bool is_device (int fd)
 Test if the file descriptor belongs to a device.
 
- Protected Member Functions inherited from SPI
 SPI (const char *name, ChipSelectMethod cs_assert, ChipSelectMethod cs_deassert, OSMutex *bus_lock=nullptr)
 Constructor.
 
 ~SPI ()
 Destructor.
 
void bus_lock ()
 Lock the bus shared by many chip selects.
 
void bus_unlock ()
 Unlock the bus shared by many chip selects.
 
int ioctl (File *file, unsigned long int key, unsigned long data) override
 Request an ioctl transaction.
 
- Protected Member Functions inherited from Node
 Node (const char *name)
 Constructor.
 
virtual ~Node ()
 Destructor.
 
int open (File *, const char *, int, int) OVERRIDE
 Open method.
 
int close (File *) OVERRIDE
 Close method.
 
virtual int fstat (File *file, struct stat *stat) override
 Get the status information of a file or device.
 
- Protected Member Functions inherited from FileIO
 FileIO (const char *name)
 Constructor.
 
virtual ~FileIO ()
 Destructor.
 
virtual off_t lseek (File *f, off_t offset, int whence)
 Seek method.
 
virtual int fcntl (File *file, int cmd, unsigned long data)
 Manipulate a file descriptor.
 
virtual bool select (File *file, int mode)
 Device select method.
 
- Static Protected Member Functions inherited from Device
static void select_insert (SelectInfo *info)
 Add client to list of clients needing woken.
 
static void select_wakeup (SelectInfo *info)
 Wakeup the list of clients needing woken.
 
static void select_wakeup_from_isr (SelectInfo *info, int *woken)
 Wakeup the list of clients needing woken.
 
- Static Protected Member Functions inherited from FileIO
static int fd_alloc (void)
 Allocate a free file descriptor.
 
static void fd_free (int fd)
 Free up a file descriptor.
 
static Filefile_lookup (int fd)
 Looks up a reference to a File corresponding to a given file descriptor.
 
static int fd_lookup (File *file)
 Looks up a file descriptor corresponding to a given File reference.
 
- Protected Attributes inherited from SPI
ChipSelectMethod csAssert
 function pointer to a method that asserts chip select.
 
ChipSelectMethod csDeassert
 function pointer to a method that deasserts chip select.
 
uint32_t speedHz
 Max default speed in Hz.
 
uint8_t bitsPerWord
 number of bits per word transaction
 
uint8_t mode
 one of four SPI modes
 
bool lsbFirst
 transmit LSB first if true
 
- Protected Attributes inherited from Node
OSMutex lock_
 protects internal structures.
 
mode_t mode_
 File open mode, such as O_NONBLOCK.
 
unsigned int references_
 number of open references
 
- Protected Attributes inherited from FileIO
const char * name
 device name
 
- Static Protected Attributes inherited from FileIO
static const unsigned int numOpenFiles = 20
 
static File files []
 File descriptor pool.
 
static OSMutex mutex
 mutual exclusion for fileio
 

Detailed Description

Specialization of Serial SPI driver for CC32xx devices.

Definition at line 53 of file CC32xxSPI.hxx.

Constructor & Destructor Documentation

◆ CC32xxSPI()

CC32xxSPI::CC32xxSPI ( const char *  name,
unsigned long  base,
uint32_t  interrupt,
ChipSelectMethod  cs_assert,
ChipSelectMethod  cs_deassert,
OSMutex bus_lock = nullptr,
size_t  dma_threshold = DEFAULT_DMA_THRESHOLD_BYTES,
uint32_t  dma_channel_index_tx = UDMA_CH7_GSPI_TX,
uint32_t  dma_channel_index_rx = UDMA_CH6_GSPI_RX 
)

Constructor.

Parameters
namename of this device instance in the file system
basebase address of this device
interruptinterrupt number of this device
cs_assertfunction pointer to a method that asserts chip select
cs_deassertfunction pointer to a method that deasserts chip select
bus_lockthe user must provide a shared mutex if the device instance represents more than one chip select on the same bus interface.
dma_thresholdthe threshold in bytes to use a DMA transaction, 0 = DMA always disabled
dma_channel_index_txUDMA_CH7_GSPI_TX or UDMA_CH31_GSPI_TX
dma_channel_index_rxUDMA_CH6_GSPI_RX or UDMA_CH30_GSPI_RX
namename of this device instance in the file system
basebase address of this device
interruptinterrupt number of this device
cs_assertfunction pointer to a method that asserts chip select
cs_deassertfunction pointer to a method that deasserts chip select
bus_lockthe user must provide a shared mutex if the device instance represents more than one chip select on the same bus interface.

Definition at line 72 of file CC32xxSPI.cxx.

◆ ~CC32xxSPI()

CC32xxSPI::~CC32xxSPI ( )
inline

Destructor.

Definition at line 80 of file CC32xxSPI.hxx.

Member Function Documentation

◆ config_dma()

void CC32xxSPI::config_dma ( struct spi_ioc_transfer *  msg)
private

Configure a DMA transaction.

Parameters
msgmessage to transact.
Todo:
We could potentially perform the first daata write immediately and only use DMA for n-1 words of TX. This would reduce the latency of the transaction slightly.
Todo:
support longer SPI transactions

Definition at line 183 of file CC32xxSPI.cxx.

◆ data_get_non_blocking()

long CC32xxSPI::data_get_non_blocking ( unsigned long *  data)
inlineprivate

Receives a word from the specified port.

This function gets a SPI word from the receive FIFO for the specified port.

Parameters
datais pointer to receive data variable.
Returns
Returns the number of elements read from the receive FIFO.

Definition at line 271 of file CC32xxSPI.hxx.

◆ data_put()

void CC32xxSPI::data_put ( unsigned long  data)
inlineprivate

Waits until the word is transmitted on the specified port.

This function transmits a SPI word on the transmit FIFO for the specified port. This function waits until the space is available on transmit FIFO.

Parameters
datais data to be transmitted.

Definition at line 304 of file CC32xxSPI.hxx.

◆ data_put_non_blocking()

long CC32xxSPI::data_put_non_blocking ( unsigned long  data)
inlineprivate

Transmits a word on the specified port.

This function transmits a SPI word on the transmit FIFO for the specified port.

Parameters
datais data to be transmitted.
Returns
Returns the number of elements written to the transmit FIFO.

Definition at line 288 of file CC32xxSPI.hxx.

◆ disable()

void CC32xxSPI::disable ( )
inlineoverrideprivatevirtual

Function to disable device.

Implements Node.

Definition at line 151 of file CC32xxSPI.hxx.

◆ enable()

void CC32xxSPI::enable ( )
inlineoverrideprivatevirtual

Function to enable device.

Implements Node.

Definition at line 144 of file CC32xxSPI.hxx.

◆ get_lock()

OSMutex * CC32xxSPI::get_lock ( )
inline

This method provides a reference to the Mutex used by this device driver.

It can be passed into another SPI driver instance as a bus wide lock such that a SPI bus can be shared between this driver and another use case with another chip select.

Returns
a reference to this device driver instance lock

Definition at line 95 of file CC32xxSPI.hxx.

◆ interrupt_handler()

void CC32xxSPI::interrupt_handler ( )

handle an interrupt.

Common interrupt handler for all SPI devices.

Todo:
(Stuart Baker) this should be made private

Definition at line 292 of file CC32xxSPI.cxx.

◆ set_configuration()

void CC32xxSPI::set_configuration ( )
inlineprivate

Set the instance local configuration.

Definition at line 313 of file CC32xxSPI.hxx.

◆ transfer()

int CC32xxSPI::transfer ( struct spi_ioc_transfer *  msg)
inlineoverrideprivatevirtual

Method to transmit/receive the data.

Parameters
msgmessage to transact.

Implements SPI.

Definition at line 165 of file CC32xxSPI.hxx.

◆ transfer_polled() [1/2]

template<typename T >
int CC32xxSPI::transfer_polled ( struct spi_ioc_transfer *  msg)
inlineprivatevirtual

Method to transmit/receive the data.

This is a template in order to preserve execution speed on type specific pointer math.

Parameters
msgmessage to transact.

Implements SPI.

Definition at line 186 of file CC32xxSPI.hxx.

◆ transfer_polled() [2/2]

int CC32xxSPI::transfer_polled ( struct spi_ioc_transfer *  msg)
inlineoverrideprivatevirtual

Method to transmit/receive the data.

Parameters
msgmessage to transact.

Implements SPI.

Definition at line 243 of file CC32xxSPI.hxx.

◆ update_configuration()

int CC32xxSPI::update_configuration ( )
overrideprivatevirtual

Update the configuration of the bus.

Returns
>= 0 upon success, -errno upon failure

Implements SPI.

Definition at line 105 of file CC32xxSPI.cxx.

Member Data Documentation

◆ base_

unsigned long CC32xxSPI::base_
private

base address of this device

Definition at line 322 of file CC32xxSPI.hxx.

◆ clock_

unsigned long CC32xxSPI::clock_
private

clock rate supplied to the module

Definition at line 323 of file CC32xxSPI.hxx.

◆ DEFAULT_DMA_THRESHOLD_BYTES

constexpr size_t CC32xxSPI::DEFAULT_DMA_THRESHOLD_BYTES = 64
staticconstexprprivate

Definition at line 101 of file CC32xxSPI.hxx.

◆ dmaChannelIndexRx_

uint32_t CC32xxSPI::dmaChannelIndexRx_
private

RX DMA channel index.

Definition at line 327 of file CC32xxSPI.hxx.

◆ dmaChannelIndexTx_

uint32_t CC32xxSPI::dmaChannelIndexTx_
private

TX DMA channel index.

Definition at line 326 of file CC32xxSPI.hxx.

◆ dmaHandle_

UDMACC32XX_Handle CC32xxSPI::dmaHandle_
private

handle to DMA reference

Definition at line 320 of file CC32xxSPI.hxx.

◆ dmaNullConfig_

constexpr uint32_t CC32xxSPI::dmaNullConfig_
staticconstexprprivate
Initial value:
=
{
UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_NONE | UDMA_ARB_1,
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_NONE | UDMA_ARB_1,
UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_NONE | UDMA_ARB_1
}

This lookup table is used to configure the DMA channels for the appropriate (8bit, 16bit or 32bit) transfer sizes when either txBuf or rxBuf are NULL.

Definition at line 135 of file CC32xxSPI.hxx.

◆ dmaRxConfig_

constexpr uint32_t CC32xxSPI::dmaRxConfig_
staticconstexprprivate
Initial value:
=
{
UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_1,
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1,
UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_ARB_1
}

This lookup table is used to configure the DMA channels for the appropriate (8bit, 16bit or 32bit) transfer sizes.

Table for an SPI DMA RX channel.

Definition at line 111 of file CC32xxSPI.hxx.

◆ dmaThreshold_

size_t CC32xxSPI::dmaThreshold_
private

threshold in bytes to start using DMA

Definition at line 325 of file CC32xxSPI.hxx.

◆ dmaTxConfig_

constexpr uint32_t CC32xxSPI::dmaTxConfig_
staticconstexprprivate
Initial value:
=
{
UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1,
UDMA_SIZE_16 | UDMA_SRC_INC_16 | UDMA_DST_INC_NONE | UDMA_ARB_1,
UDMA_SIZE_32 | UDMA_SRC_INC_32 | UDMA_DST_INC_NONE | UDMA_ARB_1
}

This lookup table is used to configure the DMA channels for the appropriate (8bit, 16bit or 32bit) transfer sizes.

Table for an SPI DMA TX channel

Definition at line 123 of file CC32xxSPI.hxx.

◆ interrupt_

unsigned long CC32xxSPI::interrupt_
private

interrupt of this device

Definition at line 324 of file CC32xxSPI.hxx.

◆ MAX_DMA_TRANSFER_AMOUNT

constexpr size_t CC32xxSPI::MAX_DMA_TRANSFER_AMOUNT = 1024
staticconstexprprivate

Maximum number of bytes transferred in a single DMA transaction.

Definition at line 104 of file CC32xxSPI.hxx.

◆ sem_

OSSem* CC32xxSPI::sem_
private

reference to the semaphore belonging to this bus

Definition at line 321 of file CC32xxSPI.hxx.

◆ spiChconf_

uint32_t CC32xxSPI::spiChconf_
private

instance local copy of configuration

Definition at line 329 of file CC32xxSPI.hxx.

◆ spiChctrl_

uint32_t CC32xxSPI::spiChctrl_
private

instance local copy of configuration

Definition at line 328 of file CC32xxSPI.hxx.

◆ spiXferlevel_

uint32_t CC32xxSPI::spiXferlevel_
private

instance local copy of configuration

Definition at line 330 of file CC32xxSPI.hxx.


The documentation for this class was generated from the following files: