bleSDK_expansion_board/drivers/api/fshc.h

346 lines
12 KiB
C

/**
****************************************************************************************
*
* @file fshc.h
*
* @brief Header file - Flash Controlor(FSHC) Driver
*
****************************************************************************************
*/
#ifndef _FSHC_H_
#define _FSHC_H_
#include <stdint.h>
#include <stdbool.h>
/*
* DEFINES
****************************************************************************************
*/
typedef uint32_t flen_t; // uint16->32 reduce size 6vp 1118
enum cache_region_size
{
CACHE_RS1K = 0x09,
CACHE_RS2K = 0x0A,
CACHE_RS4K = 0x0B,
CACHE_RS8K = 0x0C,
CACHE_RS16K = 0x0D,
CACHE_RS32K = 0x0E,
CACHE_RS64K = 0x0F,
CACHE_RS128K = 0x10,
CACHE_RS256K = 0x11,
CACHE_RS512K = 0x12,
};
enum bit_num_mode
{
// 0/1: 1 bit spi mode
SPI_MODE = 1,
// 2: 2bits dual mode
DUAL_MODE = 2,
// 3: 4bits quad mode
QUAD_MODE = 3,
};
/// Bits field of Cmd and Mode
enum fshc_cmd_mode
{
// Command Code - bit[7:0]
FCM_CMD_LSB = 0,
FCM_CMD_MSK = 0xFF << FCM_CMD_LSB,
// Line BitMode - bit[9:8]
FCM_MODE_LSB = 8,
FCM_MODE_MSK = 0x03 << FCM_MODE_LSB,
// Special Bits - bit[11:10]
// OTP read or write
FCM_RWOTP_BIT = 1 << 10,
// erase chip
FCM_ERCHIP_BIT = 1 << 11,
// R&W FIFO Type - bit[15:12]
// pkt fill: 1 - next fragment, 0 - first of send-en
FCM_NEXTPKT_BIT = 1 << 12,
// multi-packet transmisson mode
FCM_PACKETS_BIT = 1 << 13,
// not wait complete
FCM_NOTWAIT_BIT = 1 << 14,
// enable suspend mode
FCM_SUSPEND_BIT = 1 << 15,
};
// BitMode, default SPI_MODE
#define FCM_MODE_DUAL (DUAL_MODE << FCM_MODE_LSB)
#define FCM_MODE_QUAD (QUAD_MODE << FCM_MODE_LSB)
// R&W FIFO Type
#define FCM_TYPE_BLOCKING (0)
#define FCM_TYPE_NOTWAIT (FCM_NOTWAIT_BIT)
#define FCM_TYPE_SUSPEND (FCM_SUSPEND_BIT)
#define FCM_TYPE_PKTSTART (FCM_PACKETS_BIT | FCM_NOTWAIT_BIT)
#define FCM_TYPE_PKTNEXT (FCM_PACKETS_BIT | FCM_NEXTPKT_BIT)
/// SBUS access flash send_ctrl register config
enum addr_with_arg
{
// 2'b00/2'b11: address followed by idle
IDLE_ADR_ARG = 0,
// 2'b01: address followed by wdata
SDAT_ADR_ARG = 1,
// 2'b10: address followed by rdata
RDAT_ADR_ARG = 2,
};
enum cmd_with_arg
{
// 3'b011: command followed by address
SADR_CMD_ARG = 3,
// 3'b101: command followed by wdata
SDAT_CMD_ARG = 5,
// 3'b110: command followed by rdata
RDAT_CMD_ARG = 6,
// others: command followed by idle
IDLE_CMD_ARG = 0,
};
enum send_ctrl_bfs
{
// bit[1:0] - MCU transmit data bit number (@see enum bit_num_mode)
SCTRL_DATA_BIT_MODE_LSB = 0,
SCTRL_DATA_BIT_MODE_MSK = (0x03 << SCTRL_DATA_BIT_MODE_LSB),
// bit[3:2] - MCU transmit address bit number (@see enum bit_num_mode)
SCTRL_ADDR_BIT_MODE_LSB = 2,
SCTRL_ADDR_BIT_MODE_MSK = (0x03 << SCTRL_ADDR_BIT_MODE_LSB),
// bit[5:4] - MCU transmit command bit number (most support only 1bit, eg. GD)
SCTRL_CMD_BIT_MODE_LSB = 4,
SCTRL_CMD_BIT_MODE_MSK = (0x03 << SCTRL_CMD_BIT_MODE_LSB),
// bit[7:6] - MCU address argument (@see enum addr_with_arg)
SCTRL_ADDR_WITH_ARG_LSB = 6,
SCTRL_ADDR_WITH_ARG_MSK = (0x03 << SCTRL_ADDR_WITH_ARG_LSB),
// bit[10:8]- MCU command argument (@see enum cmd_with_arg)
SCTRL_CMD_WITH_ARG_LSB = 8,
SCTRL_CMD_WITH_ARG_MSK = (0x07 << SCTRL_CMD_WITH_ARG_LSB),
};
#define SEND_CTRL_CONF(datmode, adrmode, cmdarg, adrarg) \
( ((datmode) << SCTRL_DATA_BIT_MODE_LSB) | ((adrmode) << SCTRL_ADDR_BIT_MODE_LSB) \
| (SPI_MODE << SCTRL_CMD_BIT_MODE_LSB) /* command be mostly 1bit mode */ \
| ((cmdarg) << SCTRL_CMD_WITH_ARG_LSB) | ((adrarg) << SCTRL_ADDR_WITH_ARG_LSB) )
// command sent with address for READ, expect receive data.
#define SCTRL_RD_DAT(datmode) SEND_CTRL_CONF(datmode, SPI_MODE, SADR_CMD_ARG, RDAT_ADR_ARG)
// command sent with address and data for WRITE.
#define SCTRL_WR_DAT(datmode) SEND_CTRL_CONF(datmode, SPI_MODE, SADR_CMD_ARG, SDAT_ADR_ARG)
// SBUS control conf
enum sbus_ctrl_cfg
{
// command sent without arguments for ENABLE Only.
SCTRL_EN_CMD = SEND_CTRL_CONF(SPI_MODE, SPI_MODE, IDLE_CMD_ARG, IDLE_ADR_ARG),
// command sent without arguments for READ, expect receive state value(l~4Bytes).
SCTRL_RD_STA = SEND_CTRL_CONF(SPI_MODE, SPI_MODE, RDAT_CMD_ARG, IDLE_ADR_ARG),
// command sent with state value(l~4Bytes) for WRITE.
SCTRL_WR_STA = SEND_CTRL_CONF(SPI_MODE, SPI_MODE, SDAT_CMD_ARG, IDLE_ADR_ARG),
// command sent without arguments for ERASE chip all.
SCTRL_ER_CHIP = SEND_CTRL_CONF(SPI_MODE, SPI_MODE, IDLE_CMD_ARG, IDLE_ADR_ARG),
// commnad sent with address for ERASE page/sector/bank part.
SCTRL_ER_PART = SEND_CTRL_CONF(SPI_MODE, SPI_MODE, SADR_CMD_ARG, IDLE_ADR_ARG),
// Read & Write date command in special mode.
SCTRL_SIRD_DAT = SCTRL_RD_DAT(SPI_MODE),
SCTRL_SIWR_DAT = SCTRL_WR_DAT(SPI_MODE),
SCTRL_DLRD_DAT = SCTRL_RD_DAT(DUAL_MODE),
SCTRL_DLWR_DAT = SCTRL_WR_DAT(DUAL_MODE),
SCTRL_QDRD_DAT = SCTRL_RD_DAT(QUAD_MODE),
SCTRL_QDWR_DAT = SCTRL_WR_DAT(QUAD_MODE),
};
enum adrcmd_bitlen_bfs
{
// bit[5:0] --- MCU adr cycle length,include dummy cycle, only 24 bit is valid
ACBIT_ADR_LEN_LSB = 0,
ACBIT_ADR_LEN_MSK = 0x1F << ACBIT_ADR_LEN_LSB,
// bit[11:6] --- MCU cmd cycle length,include dummy cycle, only 8 bit is vaild,
ACBIT_CMD_LEN_LSB = 6,
ACBIT_CMD_LEN_MSK = 0x1F << ACBIT_CMD_LEN_LSB,
};
#define ACBIT_ADR_LEN(len) ((len) << ACBIT_ADR_LEN_LSB)
#define ACBIT_CMD_LEN(len) ((len) << ACBIT_CMD_LEN_LSB)
enum acbit_len_cfg
{
// 0x1C0 bit: cmd=8-1, adr=0
ACBIT_SI_IDLE = ACBIT_CMD_LEN(7) | ACBIT_ADR_LEN(0x00),
// 0x1D7 bit: cmd=8-1, adr=24-1, 0dumy=0
ACBIT_SI_0DUMY = ACBIT_CMD_LEN(7) | ACBIT_ADR_LEN(0x17),
// 0x1DF bit: cmd=8-1, adr=24-1, 1dumy=8
ACBIT_SI_1DUMY = ACBIT_CMD_LEN(7) | ACBIT_ADR_LEN(0x1F),
// 0x1CF bit: cmd=8-1, adr=24/2-1, 1dumy=4
ACBIT_DL_1DUMY = ACBIT_CMD_LEN(7) | ACBIT_ADR_LEN(0x0F),
};
// SBUS access dummy
enum sbus_dumy_cfg
{
// adr23 + NDUMY
SBUS_SI_0DUMY = 0x17,
// adr23 + 8(1DUMY)
SBUS_SI_1DUMY = 0x1F,
// adr24/2 - 1 + 4(1DUMY)
SBUS_DL_1DUMY = 0xF,
};
/// IBUS access flash(only support read data) fshc ctrl configure
enum cmd_len_dumy
{
// cmd(7) + dumy(0)
CLEN_0DUMY = 7,
// cmd(7) + dumy(8)
CLEN_1DUMY = 15,
};
enum delay_set_bfs
{
// bit[5:0] --- hpm command length, default is 6'h1f,
DLYSET_HPM_CLEN_LSB = 0,
// bit[9:6] --- only use in qpi read cmd, default is 4'h7,
DLYSET_CMD_LEN_LSB = 6,
// bit[13:10]--- use in suspend/resume/exit_hpm cmd, default is 4'h7,
DLYSET_0DUMY_CLEN_LSB = 10,
// bit[15:14]--- CACHE transmit address bit number(@see enum bit_num_mode)
DLYSET_ADDR_BIT_MODE_LSB = 14,
// bit[17:16]--- CACHE transmit command bit number(@see enum bit_num_mode)
DLYSET_CMD_BIT_MODE_LSB = 16,
// bit[19:18]--- CACHE transmit data bit number(@see enum bit_num_mode)
DLYSET_DATA_BIT_MODE_LSB = 18,
};
#define IBUS_CTRL_CONF(adrmode, datmode, hlen) \
( ((adrmode) << DLYSET_ADDR_BIT_MODE_LSB) | (SPI_MODE << DLYSET_CMD_BIT_MODE_LSB) \
| ((datmode) << DLYSET_DATA_BIT_MODE_LSB) | (CLEN_0DUMY << DLYSET_CMD_LEN_LSB) \
| (CLEN_0DUMY << DLYSET_0DUMY_CLEN_LSB) | ((hlen) << DLYSET_HPM_CLEN_LSB) )
// IBUS control conf
enum ibus_ctrl_cfg
{
// spi read data via IBUS
IBUS_SIRD_CFG = IBUS_CTRL_CONF(SPI_MODE, SPI_MODE, CLEN_0DUMY),
//dual read data via IBUS
IBUS_DLRD_CFG = IBUS_CTRL_CONF(SPI_MODE, DUAL_MODE, CLEN_0DUMY),
//quad read data via IBUS
IBUS_QDRD_CFG = IBUS_CTRL_CONF(SPI_MODE, QUAD_MODE, CLEN_0DUMY),
//dual hpm read data via IBUS
IBUS_DLRD_HPM = IBUS_CTRL_CONF(DUAL_MODE, DUAL_MODE, CLEN_1DUMY),
//quad hpm read data via IBUS
IBUS_QDRD_HPM = IBUS_CTRL_CONF(QUAD_MODE, QUAD_MODE, CLEN_1DUMY),
};
// IBUS access dummy
enum ibus_dumy_cfg
{
IBUS_SI_0DUMY = 0x17,
IBUS_SI_1DUMY = 0x1F,
IBUS_DL_1DUMY = 0xF,
IBUS_QD_1DUMY = 0xB,
};
/*
* FUNCTION DECLARATION
****************************************************************************************
*/
#if (ROM_UNUSED)
/**
****************************************************************************************
* @brief Send control/enable command without value
*
* @param[in] cmd Command opcode(eg. FSH_CMD_RST_EN FSH_CMD_RESET FSH_CMD_EXIT_HMP
* FSH_CMD_WR_EN FSH_CMD_WR_STA_EN)
*
****************************************************************************************
*/
void fshc_en_cmd(uint8_t cmd);
/**
****************************************************************************************
* @brief Write value to flash state register
*
* @param[in] cmd Command opcode(eg. FSH_CMD_WR_STA)
* @param[in] len Length of value, range 1~4 Bytes
* @param[in] val State value, valid range 8/16/24/32bits by 'len'
*
****************************************************************************************
*/
void fshc_wr_sta(uint8_t cmd, uint8_t len, uint32_t val);
/**
****************************************************************************************
* @brief Read value from flash state register
*
* @param[in] cmd Command opcode(eg. FSH_CMD_RD_ID FSH_CMD_RD_STA0 FSH_CMD_RD_STA1)
* @param[in] len Length of value, range 1~4 Bytes
*
* @return value State value, valid range 8/16/24/32bits by 'len'
****************************************************************************************
*/
uint32_t fshc_rd_sta(uint8_t cmd, uint8_t len);
/**
****************************************************************************************
* @brief Perpare write data to flash
*
* @param[in] cmd fshc access cmd (example read cmd: 0x03)
* @param[in] offset access flash addr offset
* @param[in] len access flash data len, unit is byte
* @param[in] sctrl access flash mode config(example: spi mode, dual mode...)
* @param[in] acbit dummy cycle
*
****************************************************************************************
*/
void fshc_wr_cfg(uint8_t cmd, uint32_t offset, flen_t len, uint16_t sctrl, uint16_t acbit);
flen_t fshc_wr_fifo(const uint32_t *data, flen_t wlen, uint16_t fcmd);
/**
****************************************************************************************
* @brief Perpare read data from flash
*
* @param[in] cmd fshc access cmd (example read cmd: 0x03)
* @param[in] offset access flash addr offset
* @param[in] len access flash data len, unit is byte
* @param[in] sctrl access flash mode config(example: spi mode, dual mode...)
* @param[in] acbit dummy cycle
*
****************************************************************************************
*/
void fshc_rd_cfg(uint8_t cmd, uint32_t offset, flen_t len, uint16_t sctrl, uint16_t acbit);
flen_t fshc_rd_fifo(uint32_t *buff, flen_t wlen, uint16_t fcmd);
void fshc_xip_conf(uint8_t rdCmd, uint8_t adrBits, uint32_t dlySet);
void fshc_hpm_conf(bool en, uint8_t crIdx, uint8_t crCmd);
void fshc_erase(uint32_t offset, uint16_t fcmd);
flen_t fshc_read(uint32_t offset, uint32_t *buff, flen_t wlen, uint16_t fcmd);
flen_t fshc_write(uint32_t offset, const uint32_t *data, flen_t wlen, uint16_t fcmd);
void fshc_cache_conf(uint32_t base_addr);
void fshc_suspend_conf(uint8_t susCmd, uint8_t rsmCmd, uint16_t susTime, uint32_t rsmTime);
#endif
#endif // _FSHC_H_