Files
6CAR/drivers/include/sdrv_xspi_slv.h
2026-04-18 09:16:58 +08:00

273 lines
9.7 KiB
C

/**
* @file sdrv_xspi_slv.h
* @brief SemiDrive common XSPI slave driver header file.
*
* @copyright Copyright (c) 2022 Semidrive Semiconductor.
* All rights reserved.
*/
#ifndef _SDRV_XSPI_SLV_H_
#define _SDRV_XSPI_SLV_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <debug.h>
#include <stdlib.h>
#include <types.h>
#include <sdrv_ckgen.h>
#include <sdrv_common.h>
/**
* @brief xspi slaver status error code.
*/
enum sdrv_xspi_master_error {
SSDRV_STATUS_GROUP_XSPI_SLAVER_SET_FLAG_ATTR_ERR = SDRV_ERROR_STATUS(SDRV_STATUS_GROUP_XSPI_MST_SLV, 1), /**< xspi slaver set flag error */
SSDRV_STATUS_GROUP_XSPI_SLAVER_GET_FLAG_ATTR_ERR = SDRV_ERROR_STATUS(SDRV_STATUS_GROUP_XSPI_MST_SLV, 2), /**< xspi slaver get flag error */
SSDRV_STATUS_GROUP_XSPI_SLAVER_GET_STATUS_ERR = SDRV_ERROR_STATUS(SDRV_STATUS_GROUP_XSPI_MST_SLV, 3), /**< xspi slaver get status error */
};
enum sdrv_xspi_slv_bit_endian {
XSPI_SLV_BIG_ENDIAN, /**< xspi bus transfer big endian */
XSPI_SLV_LITTLE_ENDIAN /**< xspi bus transfer little endian */
};
enum sdrv_xspi_slv_tx_mode {
XSPI_SLV_DQS_DIV2_ACLK, /**< QDS is DIV2 based on aclk */
XSPI_SLV_DQS_SCLK /**< QDS is based on sclk */
};
enum sdrv_xspi_slv_line {
XSPI_SLV_1_LINE, /**< xspi slave line 00: 1-line */
XSPI_SLV_4_LINE, /**< xspi slave line 01: 4-line */
XSPI_SLV_8_LINE, /**< xspi slave line 10: 8-line */
XSPI_SLV_16_LINE /**< xspi slave line 11: 16-line */
};
enum sdrv_xspi_slv_mode {
XSPI_SLV_INDIRECT_MODE, /**< xspi slave indirect mode */
XSPI_SLV_DIRECT_MODE /**< xspi slave direct mode */
};
struct sdrv_xspi_slv_sclk_idle_time_conf {
bool enable;
uint8_t idle_time; /**< sclk idle time */
};
struct sdrv_xspi_slv_debounce_ctrl_conf {
bool enable;
uint8_t time; /**< debounce time (based on aclk) */
};
struct sdrv_xspi_slv_dummy_cycle_conf {
uint8_t dummy_val; /**< slave dummy cycle configurations */
};
struct sdrv_xspi_slv_timeout_mon_ctrl_conf {
bool enable;
uint16_t time; /**< timeout monitor control */
};
struct sdrv_xspi_slv_aid_conf {
bool enable;
uint8_t aid; /**< read arid override value */
};
struct sdrv_xspi_slv_acache_conf {
bool enable;
uint8_t acache; /**< read arcache override value */
};
struct sdrv_xspi_slv_aprot_conf {
bool enable;
uint8_t aprot; /**< read arprot override value */
};
struct sdrv_xspi_slv_region_map_conf {
bool enable;
uint32_t offset_addr; /**< region map offset address */
uint32_t begin_addr; /**< region map begin address */
uint32_t end_addr; /**< region map end address */
uint32_t id; /**< region map select, have four regions */
};
struct sdrv_xspi_slv_mon_conf {
bool addr_en;
bool addr_lock; /**< monitor address lock */
uint32_t begin_addr; /**< monitor begin address */
uint32_t end_addr; /**< monitor end address */
uint32_t id; /**< region map select, have four regions */
};
/**
* @brief xspi slave set attr.
*/
enum sdrv_xspi_slv_ioctl_flag {
XSPI_SLV_FLAG_EN, /**< xspi slave mode control */
XSPI_SLV_FLAG_CRC_EN, /**< CRC32 enable */
XSPI_SLV_FLAG_BIT_ENDIAN, /**< xspi bus transfer big endian enable */
XSPI_SLV_FLAG_PAD_RESET_MASK, /**< soft reset enable */
XSPI_SLV_FLAG_WR_CHK_EN, /**< write check enable */
XSPI_SLV_FLAG_TX_MODE, /**< tx mode configurations */
XSPI_SLV_FLAG_AXI_WR_EN, /**< axi write operation enable*/
XSPI_SLV_FLAG_AXI_RD_EN, /**< axi read operation enable*/
XSPI_SLV_FLAG_MODE, /**< driect mode or indirect mode*/
XSPI_SLV_FLAG_SCLK_IDLE_TIME, /**< sclk idle time */
XSPI_SLV_FLAG_RATE, /**< xspi slave rate */
XSPI_SLV_FLAG_LINE, /**< xspi slave line */
XSPI_SLV_FLAG_DEBOUNCE_CTRL, /**< xspi debounce time */
XSPI_SLV_FLAG_TIMEOUT_CTRL, /**< xspi timeout monitor time */
XSPI_SLV_FLAG_ST_ACCESS, /**< xspi slave status access permission by xspi master */
XSPI_SLV_FLAG_ID0, /**< ID0 value */
XSPI_SLV_FLAG_ID1, /**< ID1 value */
XSPI_SLV_FLAG_PAD_INTB_MASK, /**< pad intb mask value base on xspi slave status */
XSPI_SLV_FLAG_PAD_CRCB_MASK, /**< pad crcb mask value base on xspi slave status */
XSPI_SLV_FLAG_INT_ST, /**< irq interrupt status */
XSPI_SLV_FLAG_INT_MASK, /**< irq interrupt status mask */
XSPI_SLV_FLAG_ST, /**< xspi slave status */
XSPI_SLV_FLAG_ST_UPDATE, /**< xspi slave status update */
XSPI_SLV_FLAG_CMD_WR_TRG, /**< write trigger command (only valid in indirect mode) */
XSPI_SLV_FLAG_CMD_RD_TRG, /**< read trigger command (only valid in indirect mode) */
XSPI_SLV_FLAG_CMD_WR_PACKET0, /**< write packet0 command (only valid in indirect mode) */
XSPI_SLV_FLAG_CMD_WR_PACKET1, /**< write packet1 command (only valid in indirect mode) */
XSPI_SLV_FLAG_CMD_WR_PAYLOAD, /**< write payload command (only valid in indirect mode) */
XSPI_SLV_FLAG_CMD_WR_WDATA, /**< write wdata command (only valid in indirect mode) */
XSPI_SLV_FLAG_CMD_WR_ST, /**< write status command (only valid in indirect mode) */
XSPI_SLV_FLAG_CMD_RD_ID, /**< read id command (only valid in indirect mode) */
XSPI_SLV_FLAG_CMD_RD_ST, /**< read status command (only valid in indirect mode) */
XSPI_SLV_FLAG_CMD_RD_RDATA, /**< read rdata command (only valid in indirect mode) */
XSPI_SLV_FLAG_CMD_RD_RDATA_CRC, /**< read rdata with CRC command (only valid in indirect mode) */
XSPI_SLV_FLAG_ARID_OVERRIDE, /**< arid override value */
XSPI_SLV_FLAG_ARCACHE_OVERRIDE, /**< arcache override value */
XSPI_SLV_FLAG_ARPROT_OVERRIDE, /**< arprot override value */
XSPI_SLV_FLAG_AWID_OVERRIDE, /**< awid override value */
XSPI_SLV_FLAG_AWCACHE_OVERRIDE, /**< awcache override value */
XSPI_SLV_FLAG_AWPROT_OVERRIDE, /**< awprot override value */
XSPI_SLV_FLAG_REGION_MAP, /**< region map control */
XSPI_SLV_FLAG_RD_MON, /**< read monitor permission control */
XSPI_SLV_FLAG_WR_MON, /**< write monitor permission control */
XSPI_SLV_FLAG_WR_DUMMY_CYCLE, /**< set xspi slv dummy cycle */
XSPI_SLV_FLAG_MAX /**< end */
};
/**
* @brief sdrv_xspi_slv slave configurations.
*/
struct sdrv_xspi_slv_conf {
paddr_t base; /**< xspi slave register base address */
uint16_t irq; /**< xspi slave irq number */
bool crc_dis; /**< crc32 disable or not */
enum sdrv_xspi_slv_bit_endian bit_endian; /**< big endian or little endian */
enum sdrv_xspi_slv_tx_mode tx_mode; /**< QDS is DIV2 based on aclk or sclk */
enum sdrv_xspi_slv_mode mode; /**< indirect mode or direct mode */
bool is_ddr; /**< ddr or sdr mode */
enum sdrv_xspi_slv_line line; /**< slave line select */
/**< indirect configurations */
uint8_t cmd_wr_trg; /**< write trigger command */
uint8_t cmd_rd_trg; /**< read trigger command */
uint8_t cmd_wr_packet0; /**< write package0 command */
uint8_t cmd_wr_packet1; /**< write package1 command */
uint8_t cmd_wr_payload; /**< write payload command */
uint8_t cmd_wr_wdata; /**< write rdata command */
uint8_t cmd_wr_st; /**< write status command */
uint8_t cmd_rd_id; /**< write status command */
uint8_t cmd_rd_st; /**< read trigger command */
uint8_t cmd_rd_rdata; /**< read trigger command */
uint8_t cmd_rd_rdata_crc; /**< read rdata with CRC command */
};
/**
* @brief slv_device
*/
struct sdrv_xspi_slv {
paddr_t base; /**< xspi slave register base address */
uint16_t irq; /**< xspi slave irq number */
};
/**
* @brief xspi slave slave init.
*
* @param[in] xspi slave dev
* @param[in] xspi slave config
* @return int
* @retval 0: success
* @retval other: fail
*/
status_t sdrv_xspi_slv_init(struct sdrv_xspi_slv *slave,
const struct sdrv_xspi_slv_conf *conf);
/**
* @brief xspi slave set attr.
* @details This function used for xspi slave set attribute, and detailed flag reference structure definitions.
* @param[in] xspi slave dev
* @param[in] xspi slave ioctl flag
* @param[in] xspi slave buf
* @return int
* @retval 0: success
* @retval -1: fail
*/
status_t sdrv_xspi_slv_set_attr(struct sdrv_xspi_slv *slave,
enum sdrv_xspi_slv_ioctl_flag flag, const void *buf);
/**
* @brief xspi slave get attr.
* @details This function used for xspi slave get attribute, and detailed flag reference structure definitions.
* @param[in] xspi slave dev
* @param[in] xspi slave ioctl flag
* @param[out] xspi slave buf
* @return int
* @retval 0: success
* @retval other: fail
*/
status_t sdrv_xspi_slv_get_attr(struct sdrv_xspi_slv *slave,
enum sdrv_xspi_slv_ioctl_flag flag, void *buf);
/**
* @brief xspi slave enable.
* @details This function used for xspi enable receive data.
* @param[in] xspi slave dev
* @return int
* @retval 0: success
* @retval other: fail
*/
status_t sdrv_xspi_slv_enable(struct sdrv_xspi_slv *slave);
/**
* @brief xspi slave disable.
* @details This function used for xspi disable receive data.
* @param[in] xspi slave dev
* @return int
* @retval 0: success
* @retval other: fail
*/
status_t sdrv_xspi_slv_disable(struct sdrv_xspi_slv *slave);
/**
* @brief xspi slave deinit.
*
* @param[in] xspi slave dev
* @return int
* @retval 0: success
* @retval other: fail
*/
status_t sdrv_xspi_slv_deinit(struct sdrv_xspi_slv *slave);
/**
* @brief xspi slave status.
*
* @param[in] xspi get slaver status
* @return int
* @retval 0: success
* @retval other: fail
*/
status_t sdrv_xspi_slv_clr_status(struct sdrv_xspi_slv *slave);
#ifdef __cplusplus
}
#endif
#endif