SyterKit 0.4.0.x
SyterKit is a bare-metal framework
Loading...
Searching...
No Matches
Enumerations | Functions | Variables
sys-spi.c File Reference
#include <io.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <types.h>
#include <timer.h>
#include <log.h>
#include <sys-clk.h>
#include <sys-dma.h>
#include <sys-gpio.h>
#include "sys-spi.h"
Include dependency graph for sys-spi.c:

Enumerations

enum  {
  SPI_GCR = 0x04 , SPI_TCR = 0x08 , SPI_IER = 0x10 , SPI_ISR = 0x14 ,
  SPI_FCR = 0x18 , SPI_FSR = 0x1c , SPI_WCR = 0x20 , SPI_CCR = 0x24 ,
  SPI_DLY = 0x28 , SPI_MBC = 0x30 , SPI_MTC = 0x34 , SPI_BCC = 0x38 ,
  SPI_TXD = 0x200 , SPI_RXD = 0x300
}
 
enum  {
  SPI_GCR_SRST_POS = 31 , SPI_GCR_SRST_MSK = (1 << SPI_GCR_SRST_POS) , SPI_GCR_TPEN_POS = 7 , SPI_GCR_TPEN_MSK = (1 << SPI_GCR_TPEN_POS) ,
  SPI_GCR_MODE_POS = 1 , SPI_GCR_MODE_MSK = (1 << SPI_GCR_MODE_POS) , SPI_GCR_EN_POS = 0 , SPI_GCR_EN_MSK = (1 << SPI_GCR_EN_POS)
}
 
enum  {
  SPI_BCC_DUAL_RX = (1 << 28) , SPI_BCC_QUAD_IO = (1 << 29) , SPI_BCC_STC_MSK = (0x00ffffff) , SPI_BCC_DUM_POS = 24 ,
  SPI_BCC_DUM_MSK = (0xf << SPI_BCC_DUM_POS)
}
 
enum  { SPI_MBC_CNT_MSK = (0x00ffffff) }
 
enum  { SPI_MTC_CNT_MSK = (0x00ffffff) }
 
enum  {
  SPI_TCR_SPOL_POS = 2 , SPI_TCR_SPOL_MSK = (1 << SPI_TCR_SPOL_POS) , SPI_TCR_SS_OWNER_POS = 6 , SPI_TCR_SS_OWNER_MSK = (1 << SPI_TCR_SS_OWNER_POS) ,
  SPI_TCR_DHB_POS = 8 , SPI_TCR_DHB_MSK = (1 << SPI_TCR_DHB_POS) , SPI_TCR_SDC_POS = 11 , SPI_TCR_SDC_MSK = (1 << SPI_TCR_SDC_POS) ,
  SPI_TCR_SDM_POS = 13 , SPI_TCR_SDM_MSK = (1 << SPI_TCR_SDM_POS)
}
 
enum  {
  SPI_FCR_RX_LEVEL_POS = 0 , SPI_FCR_RX_LEVEL_MSK = (0xff < SPI_FCR_RX_LEVEL_POS) , SPI_FCR_RX_DRQEN_POS = 8 , SPI_FCR_RX_DRQEN_MSK = (0x1 << SPI_FCR_RX_DRQEN_POS) ,
  SPI_FCR_RX_TESTEN_POS = 14 , SPI_FCR_RX_TESTEN_MSK = (0x1 << SPI_FCR_RX_TESTEN_POS) , SPI_FCR_RX_RST_POS = 15 , SPI_FCR_RX_RST_MSK = (0x1 << SPI_FCR_RX_RST_POS) ,
  SPI_FCR_TX_LEVEL_POS = 16 , SPI_FCR_TX_LEVEL_MSK = (0xff << SPI_FCR_TX_LEVEL_POS) , SPI_FCR_TX_DRQEN_POS = 24 , SPI_FCR_TX_DRQEN_MSK = (0x1 << SPI_FCR_TX_DRQEN_POS) ,
  SPI_FCR_TX_TESTEN_POS = 30 , SPI_FCR_TX_TESTEN_MSK = (0x1 << SPI_FCR_TX_TESTEN_POS) , SPI_FCR_TX_RST_POS = 31 , SPI_FCR_TX_RST_MSK = (0x1 << SPI_FCR_TX_RST_POS)
}
 
enum  { SPI_FSR_RF_CNT_POS = 0 , SPI_FSR_RF_CNT_MSK = (0xff << SPI_FSR_RF_CNT_POS) , SPI_FSR_TF_CNT_POS = 16 , SPI_FSR_TF_CNT_MSK = (0xff << SPI_FSR_TF_CNT_POS) }
 

Functions

static uint32_t sunxi_spi_set_clk (sunxi_spi_t *spi, u32 spi_clk, u32 mclk, u32 cdr2)
 
static int spi_clk_init (sunxi_spi_t *spi, uint32_t mod_clk)
 
static void spi_reset_fifo (sunxi_spi_t *spi)
 
static uint32_t spi_query_txfifo (sunxi_spi_t *spi)
 
static uint32_t spi_query_rxfifo (sunxi_spi_t *spi)
 
static int spi_dma_cfg (void)
 
static int spi_dma_init (void)
 
static void sunxi_spi_gpio_init (sunxi_spi_t *spi)
 
static int sunxi_spi_get_clk (sunxi_spi_t *spi)
 
int sunxi_spi_init (sunxi_spi_t *spi)
 Initializes the SPI interface.
 
void sunxi_spi_disable (sunxi_spi_t *spi)
 Disables the SPI interface.
 
static void spi_set_counters (sunxi_spi_t *spi, int txlen, int rxlen, int stxlen, int dummylen)
 
static void spi_write_tx_fifo (sunxi_spi_t *spi, uint8_t *buf, uint32_t len)
 
static uint32_t spi_read_rx_fifo (sunxi_spi_t *spi, uint8_t *buf, uint32_t len)
 
static void spi_set_io_mode (sunxi_spi_t *spi, spi_io_mode_t mode)
 
int sunxi_spi_transfer (sunxi_spi_t *spi, spi_io_mode_t mode, void *txbuf, uint32_t txlen, void *rxbuf, uint32_t rxlen)
 Performs SPI data transfer.
 

Variables

static sunxi_dma_set_t spi_rx_dma
 
static u32 spi_rx_dma_hd
 

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
SPI_GCR 
SPI_TCR 
SPI_IER 
SPI_ISR 
SPI_FCR 
SPI_FSR 
SPI_WCR 
SPI_CCR 
SPI_DLY 
SPI_MBC 
SPI_MTC 
SPI_BCC 
SPI_TXD 
SPI_RXD 

◆ anonymous enum

anonymous enum
Enumerator
SPI_GCR_SRST_POS 
SPI_GCR_SRST_MSK 
SPI_GCR_TPEN_POS 
SPI_GCR_TPEN_MSK 
SPI_GCR_MODE_POS 
SPI_GCR_MODE_MSK 
SPI_GCR_EN_POS 
SPI_GCR_EN_MSK 

◆ anonymous enum

anonymous enum
Enumerator
SPI_BCC_DUAL_RX 
SPI_BCC_QUAD_IO 
SPI_BCC_STC_MSK 
SPI_BCC_DUM_POS 
SPI_BCC_DUM_MSK 

◆ anonymous enum

anonymous enum
Enumerator
SPI_MBC_CNT_MSK 

◆ anonymous enum

anonymous enum
Enumerator
SPI_MTC_CNT_MSK 

◆ anonymous enum

anonymous enum
Enumerator
SPI_TCR_SPOL_POS 
SPI_TCR_SPOL_MSK 
SPI_TCR_SS_OWNER_POS 
SPI_TCR_SS_OWNER_MSK 
SPI_TCR_DHB_POS 
SPI_TCR_DHB_MSK 
SPI_TCR_SDC_POS 
SPI_TCR_SDC_MSK 
SPI_TCR_SDM_POS 
SPI_TCR_SDM_MSK 

◆ anonymous enum

anonymous enum
Enumerator
SPI_FCR_RX_LEVEL_POS 
SPI_FCR_RX_LEVEL_MSK 
SPI_FCR_RX_DRQEN_POS 
SPI_FCR_RX_DRQEN_MSK 
SPI_FCR_RX_TESTEN_POS 
SPI_FCR_RX_TESTEN_MSK 
SPI_FCR_RX_RST_POS 
SPI_FCR_RX_RST_MSK 
SPI_FCR_TX_LEVEL_POS 
SPI_FCR_TX_LEVEL_MSK 
SPI_FCR_TX_DRQEN_POS 
SPI_FCR_TX_DRQEN_MSK 
SPI_FCR_TX_TESTEN_POS 
SPI_FCR_TX_TESTEN_MSK 
SPI_FCR_TX_RST_POS 
SPI_FCR_TX_RST_MSK 

◆ anonymous enum

anonymous enum
Enumerator
SPI_FSR_RF_CNT_POS 
SPI_FSR_RF_CNT_MSK 
SPI_FSR_TF_CNT_POS 
SPI_FSR_TF_CNT_MSK 

Function Documentation

◆ spi_clk_init()

static int spi_clk_init ( sunxi_spi_t spi,
uint32_t  mod_clk 
)
static

◆ spi_dma_cfg()

static int spi_dma_cfg ( void  )
static

◆ spi_dma_init()

static int spi_dma_init ( void  )
static

◆ spi_query_rxfifo()

static uint32_t spi_query_rxfifo ( sunxi_spi_t spi)
inlinestatic

◆ spi_query_txfifo()

static uint32_t spi_query_txfifo ( sunxi_spi_t spi)
inlinestatic

◆ spi_read_rx_fifo()

static uint32_t spi_read_rx_fifo ( sunxi_spi_t spi,
uint8_t buf,
uint32_t  len 
)
static

◆ spi_reset_fifo()

static void spi_reset_fifo ( sunxi_spi_t spi)
static

◆ spi_set_counters()

static void spi_set_counters ( sunxi_spi_t spi,
int  txlen,
int  rxlen,
int  stxlen,
int  dummylen 
)
static

◆ spi_set_io_mode()

static void spi_set_io_mode ( sunxi_spi_t spi,
spi_io_mode_t  mode 
)
static

◆ spi_write_tx_fifo()

static void spi_write_tx_fifo ( sunxi_spi_t spi,
uint8_t buf,
uint32_t  len 
)
static

◆ sunxi_spi_disable()

void sunxi_spi_disable ( sunxi_spi_t spi)

Disables the SPI interface.

This function disables the SPI bus, deinitializes DMA (if used), and deinitializes the SPI clock. It is called when the SPI interface is no longer needed or when performing cleanup operations.

Parameters
spiPointer to the SPI structure containing configuration and register information.

◆ sunxi_spi_get_clk()

static int sunxi_spi_get_clk ( sunxi_spi_t spi)
static

◆ sunxi_spi_gpio_init()

static void sunxi_spi_gpio_init ( sunxi_spi_t spi)
static

◆ sunxi_spi_init()

int sunxi_spi_init ( sunxi_spi_t spi)

Initializes the SPI interface.

This function initializes the SPI interface by configuring the GPIO pins, clock, bus, and counters. If a DMA handle is set, DMA mode is used for data transfers. The function calls several other SPI initialization functions to set up the SPI hardware.

Parameters
spiPointer to the SPI structure containing configuration and register information.
Returns
0 on success.

◆ sunxi_spi_set_clk()

static uint32_t sunxi_spi_set_clk ( sunxi_spi_t spi,
u32  spi_clk,
u32  mclk,
u32  cdr2 
)
static

◆ sunxi_spi_transfer()

int sunxi_spi_transfer ( sunxi_spi_t spi,
spi_io_mode_t  mode,
void *  txbuf,
uint32_t  txlen,
void *  rxbuf,
uint32_t  rxlen 
)

Performs SPI data transfer.

This function initiates a data transfer on the SPI bus. The transfer can be either full-duplex (both transmission and reception) or half-duplex (only transmission or reception). The transfer is done based on the specified SPI I/O mode. The function handles both transmit and receive operations, including the use of DMA if required for large transfers.

Parameters
spiPointer to the SPI structure containing configuration and register information.
modeThe I/O mode to use for the transfer (e.g., single, dual, quad).
txbufPointer to the transmission buffer.
txlenLength of the transmission data in bytes.
rxbufPointer to the reception buffer.
rxlenLength of the reception data in bytes.
Returns
The total number of bytes transferred (txlen + rxlen).

Variable Documentation

◆ spi_rx_dma

sunxi_dma_set_t spi_rx_dma
static

◆ spi_rx_dma_hd

u32 spi_rx_dma_hd
static