/* SPDX-License-Identifier: BSD-3-Clause */
|
/*
|
* Copyright (c) 2020-2021 Rockchip Electronics Co., Ltd.
|
*/
|
|
#ifndef __RK_SPI_H
|
#define __RK_SPI_H
|
|
#define HAL_SPI_MASTER_MAX_SCLK_OUT 50000000 /**< Max io clock in master mode */
|
#define HAL_SPI_SLAVE_MAX_SCLK_OUT 20000000 /**< Max io in clock in slave mode */
|
|
#define CR0_DATA_FRAME_SIZE_4BIT (0x00 << SPI_CTRLR0_DFS_SHIFT)
|
#define CR0_DATA_FRAME_SIZE_8BIT (0x01 << SPI_CTRLR0_DFS_SHIFT)
|
#define CR0_DATA_FRAME_SIZE_16BIT (0x02 << SPI_CTRLR0_DFS_SHIFT)
|
|
/* serial clock toggles in middle of first data bit */
|
#define CR0_PHASE_1EDGE (0x00 << SPI_CTRLR0_SCPH_SHIFT)
|
/* serial clock toggles at start of first data bit */
|
#define CR0_PHASE_2EDGE (0x01 << SPI_CTRLR0_SCPH_SHIFT)
|
|
#define CR0_POLARITY_LOW (0x00 << SPI_CTRLR0_SCPOL_SHIFT)
|
#define CR0_POLARITY_HIGH (0x01 << SPI_CTRLR0_SCPOL_SHIFT)
|
|
/*
|
* The period between ss_n active and
|
* sclk_out active is half sclk_out cycles
|
*/
|
#define CR0_SSD_HALF (0x00 << SPI_CTRLR0_SSD_SHIFT)
|
/*
|
* The period between ss_n active and
|
* sclk_out active is one sclk_out cycle
|
*/
|
#define CR0_SSD_ONE (0x01 << SPI_CTRLR0_SSD_SHIFT)
|
|
#define CR0_EM_LITTLE (0x0 << SPI_CTRLR0_EM_SHIFT)
|
#define CR0_EM_BIG (0x1 << SPI_CTRLR0_EM_SHIFT)
|
|
#define CR0_FIRSTBIT_MSB (0x0 << SPI_CTRLR0_FBM_SHIFT)
|
#define CR0_FIRSTBIT_LSB (0x1 << SPI_CTRLR0_FBM_SHIFT)
|
|
#define CR0_BHT_16BIT (0x0 << SPI_CTRLR0_BHT_SHIFT)
|
#define CR0_BHT_8BIT (0x1 << SPI_CTRLR0_BHT_SHIFT)
|
|
#define CR0_XFM_TR (0x00 << SPI_CTRLR0_XFM_SHIFT)
|
#define CR0_XFM_TO (0x01 << SPI_CTRLR0_XFM_SHIFT)
|
#define CR0_XFM_RO (0x02 << SPI_CTRLR0_XFM_SHIFT)
|
|
#define CR0_OPM_MASTER (0x00 << SPI_CTRLR0_OPM_SHIFT)
|
#define CR0_OPM_SLAVE (0x01 << SPI_CTRLR0_OPM_SHIFT)
|
|
#define CR0_CSM(nCycles) (((nCycles) << SPI_CTRLR0_CSM_SHIFT) & SPI_CTRLR0_CSM_MASK)
|
#define CR0_CSM_0CYCLE CR0_CSM(0)
|
#define CR0_CSM_1CYCLE CR0_CSM(1)
|
#define CR0_CSM_2CYCLES CR0_CSM(2)
|
#define CR0_CSM_3CYCLES CR0_CSM(3)
|
|
/***************************** Structure Definition **************************/
|
|
/** @brief SPI Type definition */
|
typedef enum {
|
SSI_MOTO_SPI = 0,
|
SSI_TI_SSP,
|
SSI_NS_MICROWIRE
|
} eSPI_SSIType;
|
|
/** @brief SPI Transfer type definition */
|
typedef enum {
|
SPI_POLL = 0,
|
SPI_IT,
|
SPI_DMA
|
} eSPI_TransferType;
|
|
/** @brief SPI Configuration Structure definition */
|
struct SPI_CONFIG {
|
UINT32 opMode; /**< Specifies the SPI operating mode, master or slave. */
|
UINT32 xfmMode; /**< Specifies the SPI bidirectional mode state, tx only, rx only or trx mode. */
|
UINT32 nBytes; /**< Specifies the SPI data size. */
|
UINT32 clkPolarity; /**< Specifies the serial clock steady state. */
|
UINT32 clkPhase; /**< Specifies the clock active edge for the bit capture. */
|
UINT32 firstBit; /**< Specifies whether data transfers start from MSB or LSB bit. */
|
UINT32 endianMode; /**< Specifies whether data transfers start from little or big endian. */
|
UINT32 apbTransform; /**< Specifies apb transform type. */
|
UINT32 ssd; /**< Specifies period between ss_n active and sclk_out. */
|
UINT32 speed; /**< Specifies the Baud Rate prescaler value which will be
|
used to configure the transmit and receive SCK clock. */
|
UINT32 ssiType; /**< Specifies if the TI mode is enabled or not.*/
|
UINT32 csm; /**< Specifies Motorola SPI Master SS_N high cycles for each frame data is transfer. */
|
};
|
|
/* We have 2 DMA channels per SPI, one for RX and one for TX */
|
struct HAL_SPI_DMA_INFO {
|
UINT8 channel;
|
UINT8 direction;
|
UINT32 addr;
|
};
|
|
struct HAL_SPI_DEV {
|
const UINT32 base;
|
const UINT32 clkId;
|
const UINT32 clkGateID;
|
const UINT32 pclkGateID;
|
const UINT8 irqNum;
|
const UINT8 isSlave;
|
const struct HAL_SPI_DMA_INFO txDma;
|
const struct HAL_SPI_DMA_INFO rxDma;
|
};
|
|
/** @brief SPI handle Structure definition */
|
struct SPI_HANDLE {
|
struct SPI_REG *pReg; /**< Specifies SPI registers base address. */
|
UINT32 maxFreq; /**< Specifies SPI clock frequency. */
|
struct SPI_CONFIG config; /**< Specifies SPI communication parameters. */
|
const UINT8 *pTxBuffer; /**< Specifies pointer to SPI Tx transfer Buffer. */
|
const UINT8 *pTxBufferEnd; /**< Specifies pointer to SPI Tx End transfer Buffer. */
|
UINT8 *pRxBuffer; /**< Specifies pointer to SPI Rx transfer Buffer. */
|
UINT8 *pRxBufferEnd; /**< Specifies pointer to SPI Rx End transfer Buffer. */
|
UINT32 len; /**< Specifies the transfer length . */
|
eSPI_TransferType type; /**< Specifies the transfer type: POLL/IT/DMA. */
|
UINT32 dmaBurstSize; /**< Specifies Dma Burst size */
|
};
|
|
|
RETURN_STATUS SPI_Init(struct SPI_HANDLE *pSPI, UINT32 base);
|
RETURN_STATUS SPI_DeInit(struct SPI_HANDLE *pSPI);
|
RETURN_STATUS SPI_FlushFifo(struct SPI_HANDLE *pSPI);
|
RETURN_STATUS SPI_SetCS(struct SPI_HANDLE *pSPI, UINT8 select, UINT8 enable);
|
RETURN_STATUS SPI_PioTransfer(struct SPI_HANDLE *pSPI);
|
RETURN_STATUS SPI_Stop(struct SPI_HANDLE *pSPI);
|
RETURN_STATUS SPI_Configure(struct SPI_HANDLE *pSPI, const UINT8 *pTxData,
|
UINT8 *pRxData, UINT32 Size);
|
UINT32 SPI_CalculateTimeout(struct SPI_HANDLE *pSPI);
|
|
#endif
|