120 lines
3.7 KiB
C
120 lines
3.7 KiB
C
/*
|
|
* Copyright (c) 2022 Andes Technology Corporation.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#define LOG_LEVEL CONFIG_SPI_LOG_LEVEL
|
|
#include <zephyr/logging/log.h>
|
|
LOG_MODULE_REGISTER(spi_atcspi200);
|
|
|
|
#include "spi_context.h"
|
|
#include <zephyr/device.h>
|
|
#include <zephyr/drivers/spi.h>
|
|
|
|
#define REG_IDR 0x00
|
|
#define REG_TFMAT 0x10
|
|
#define REG_DIRIO 0x14
|
|
#define REG_TCTRL 0x20
|
|
#define REG_CMD 0x24
|
|
#define REG_ADDR 0x28
|
|
#define REG_DATA 0x2c
|
|
#define REG_CTRL 0x30
|
|
#define REG_STAT 0x34
|
|
#define REG_INTEN 0x38
|
|
#define REG_INTST 0x3c
|
|
#define REG_TIMIN 0x40
|
|
#define REG_MCTRL 0x50
|
|
#define REG_SLVST 0x60
|
|
#define REG_SDCNT 0x64
|
|
#define REG_CONFIG 0x7c
|
|
|
|
#define SPI_BASE (((const struct spi_atcspi200_cfg *)(dev)->config)->base)
|
|
#define SPI_TFMAT(dev) (SPI_BASE + REG_TFMAT)
|
|
#define SPI_TCTRL(dev) (SPI_BASE + REG_TCTRL)
|
|
#define SPI_CMD(dev) (SPI_BASE + REG_CMD)
|
|
#define SPI_DATA(dev) (SPI_BASE + REG_DATA)
|
|
#define SPI_CTRL(dev) (SPI_BASE + REG_CTRL)
|
|
#define SPI_STAT(dev) (SPI_BASE + REG_STAT)
|
|
#define SPI_INTEN(dev) (SPI_BASE + REG_INTEN)
|
|
#define SPI_INTST(dev) (SPI_BASE + REG_INTST)
|
|
#define SPI_TIMIN(dev) (SPI_BASE + REG_TIMIN)
|
|
#define SPI_CONFIG(dev) (SPI_BASE + REG_CONFIG)
|
|
|
|
/* Field mask of SPI transfer format register */
|
|
#define TFMAT_DATA_LEN_OFFSET (8)
|
|
|
|
#define TFMAT_CPHA_MSK BIT(0)
|
|
#define TFMAT_CPOL_MSK BIT(1)
|
|
#define TFMAT_SLVMODE_MSK BIT(2)
|
|
#define TFMAT_LSB_MSK BIT(3)
|
|
#define TFMAT_DATA_MERGE_MSK BIT(7)
|
|
#define TFMAT_DATA_LEN_MSK GENMASK(12, 8)
|
|
#define TFMAT_ADDR_LEN_MSK GENMASK(18, 16)
|
|
|
|
/* Field mask of SPI transfer control register */
|
|
#define TCTRL_RD_TCNT_OFFSET (0)
|
|
#define TCTRL_WR_TCNT_OFFSET (12)
|
|
#define TCTRL_TRNS_MODE_OFFSET (24)
|
|
|
|
#define TCTRL_WR_TCNT_MSK GENMASK(20, 12)
|
|
#define TCTRL_TRNS_MODE_MSK GENMASK(27, 24)
|
|
|
|
/* Transfer mode */
|
|
#define TRNS_MODE_WRITE_READ (0)
|
|
#define TRNS_MODE_WRITE_ONLY (1)
|
|
#define TRNS_MODE_READ_ONLY (2)
|
|
|
|
/* Field mask of SPI interrupt enable register */
|
|
#define IEN_RX_FIFO_MSK BIT(2)
|
|
#define IEN_TX_FIFO_MSK BIT(3)
|
|
#define IEN_END_MSK BIT(4)
|
|
|
|
/* Field mask of SPI interrupt status register */
|
|
#define INTST_RX_FIFO_INT_MSK BIT(2)
|
|
#define INTST_TX_FIFO_INT_MSK BIT(3)
|
|
#define INTST_END_INT_MSK BIT(4)
|
|
|
|
/* Field mask of SPI config register */
|
|
#define CFG_RX_FIFO_SIZE_MSK GENMASK(1, 0)
|
|
#define CFG_TX_FIFO_SIZE_MSK GENMASK(5, 4)
|
|
|
|
/* Field mask of SPI status register */
|
|
#define STAT_RX_NUM_MSK GENMASK(12, 8)
|
|
#define STAT_TX_NUM_MSK GENMASK(20, 16)
|
|
|
|
/* Field mask of SPI control register */
|
|
#define CTRL_RX_FIFO_RST_OFFSET (1)
|
|
#define CTRL_TX_FIFO_RST_OFFSET (2)
|
|
#define CTRL_RX_THRES_OFFSET (8)
|
|
#define CTRL_TX_THRES_OFFSET (16)
|
|
|
|
#define CTRL_RX_FIFO_RST_MSK BIT(1)
|
|
#define CTRL_TX_FIFO_RST_MSK BIT(2)
|
|
#define CTRL_RX_THRES_MSK GENMASK(12, 8)
|
|
#define CTRL_TX_THRES_MSK GENMASK(20, 16)
|
|
|
|
/* Field mask of SPI status register */
|
|
#define TIMIN_SCLK_DIV_MSK GENMASK(7, 0)
|
|
|
|
#define SET_MASK(x, msk) sys_write32(sys_read32(x) | msk, x)
|
|
#define CLR_MASK(x, msk) sys_write32(sys_read32(x) & ~msk, x)
|
|
|
|
#define TX_FIFO_THRESHOLD (1)
|
|
#define RX_FIFO_THRESHOLD (1)
|
|
#define MAX_TRANSFER_CNT (512)
|
|
|
|
#define TX_FIFO_SIZE_SETTING(dev) \
|
|
(sys_read32(SPI_CONFIG(dev)) & CFG_TX_FIFO_SIZE_MSK)
|
|
#define TX_FIFO_SIZE(dev) \
|
|
(2 << (TX_FIFO_SIZE_SETTING(dev) >> 4))
|
|
|
|
#define RX_FIFO_SIZE_SETTING(dev) \
|
|
(sys_read32(SPI_CONFIG(dev)) & CFG_RX_FIFO_SIZE_MSK)
|
|
#define RX_FIFO_SIZE(dev) \
|
|
(2 << (RX_FIFO_SIZE_SETTING(dev) >> 0))
|
|
|
|
#define TX_NUM_STAT(dev) (sys_read32(SPI_STAT(dev)) & STAT_TX_NUM_MSK)
|
|
#define RX_NUM_STAT(dev) (sys_read32(SPI_STAT(dev)) & STAT_RX_NUM_MSK)
|
|
#define GET_TX_NUM(dev) (TX_NUM_STAT(dev) >> 16)
|
|
#define GET_RX_NUM(dev) (RX_NUM_STAT(dev) >> 8)
|