292 lines
13 KiB
C
292 lines
13 KiB
C
/**
|
||
* Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n
|
||
*
|
||
* Description: Provides flash common Configuration information. \n
|
||
* Author: @CompanyNameTag \n
|
||
* History: \n
|
||
* 2022-11-15, Create file. \n
|
||
*/
|
||
#ifndef FLASH_COMMON_CONFIG_H
|
||
#define FLASH_COMMON_CONFIG_H
|
||
|
||
/**
|
||
* @defgroup drivers_driver_flash_common_config Flash Common Config
|
||
* @ingroup drivers_driver_flash
|
||
* @{
|
||
*/
|
||
#include "stdbool.h"
|
||
#include "spi.h"
|
||
|
||
#define WAIT_CYCLES_0 0x0
|
||
#define WAIT_CYCLES_1 0x1
|
||
#define WAIT_CYCLES_2 0x2
|
||
#define WAIT_CYCLES_3 0x3
|
||
#define WAIT_CYCLES_4 0x4
|
||
#define WAIT_CYCLES_5 0x5
|
||
#define WAIT_CYCLES_6 0x6
|
||
#define WAIT_CYCLES_7 0x7
|
||
#define WAIT_CYCLES_8 0x8
|
||
#define WAIT_CYCLES_9 0x9
|
||
#define WAIT_CYCLES_10 0x0A
|
||
|
||
/* Flash cmd define. */
|
||
#define FLASH_WREN_CMD 0x06
|
||
#define FLASH_WRDI_CMD 0x04
|
||
#define FLASH_RDID_CMD 0x9F
|
||
#define FLASH_RDSR1_CMD 0x05
|
||
#define FLASH_WRSR1_CMD 0x01
|
||
#define FLASH_RDSR2_CMD 0x35
|
||
#define FLASH_WRSR2_CMD 0x31
|
||
#define FLASH_RDSR3_CMD 0x15
|
||
#define FLASH_WRSR3_CMD 0x11
|
||
#define FLASH_SE_CMD 0x20
|
||
#define FLASH_BE_CMD 0xD8
|
||
#define FLASH_BE32K_CMD 0x52
|
||
#define FLASH_CE_CMD 0xC7
|
||
#define FLASH_DUMMY_CMD 0xC0
|
||
#define FLASH_PP_CMD 0x02
|
||
#define FLASH_4PP_CMD 0x38
|
||
#define FLASH_DP_CMD 0xB9
|
||
#define FLASH_RDP_CMD 0xAB
|
||
#define FLASH_RD_CMD 0x03
|
||
#define FLASH_FRD_CMD 0x0B
|
||
#define FLASH_QRD_CMD 0xEB
|
||
#define FLASH_RSTEN_CMD 0x66
|
||
#define FLASH_RST_CMD 0x99
|
||
#define FLASH_RDB_CMD 0xAB
|
||
/* Manufacturer ID + Device ID, Device id can track manufacturer info. */
|
||
#define FLASH_MSID_CMD 0x90
|
||
#define FLASH_UQID_CMD 0x4B
|
||
|
||
#define FLASH_DATA_ONE_BYTE 0
|
||
#define FLASH_DUMMY 0x0
|
||
|
||
#define FLASH_XIP_TRANS_2_BYTE 0x1
|
||
#define FLASH_XIP_TRANS_8_BYTE 0x7
|
||
|
||
#define FLASH_QSPI_TRANSMIT_DMA_ENABLE 1
|
||
#define FLASH_QSPI_TRANSMIT_DMA_DISABLE 2
|
||
|
||
#define FLASH_WRITE_MAX_TRANS_CNT 0x100
|
||
#define FLASH_CMD_LENGTH_4_BYTE 4
|
||
#define MANUFACTURE_ID_LENGTH 3
|
||
#define DEVICE_ID_LENGTH 2
|
||
|
||
/* Define flash manufacturer id. */
|
||
#define FLASH_MANUFACTURER_MXIC_MX25R32 0x1628C2
|
||
#define FLASH_MANUFACTURER_MXIC_MX25R64 0x1728C2
|
||
#define FLASH_MANUFACTURER_MXIC_MX25U64 0x3725C2
|
||
#define FLASH_MANUFACTURER_MXIC_MX25U128 0x3825C2
|
||
#define FLASH_MANUFACTURER_MXIC_MX25U12843 0xC22538
|
||
/* Flash ID is same, but the unique ID is different, and unique ID(0xE9) needs to add cmd at xip mode. */
|
||
#define FLASH_MANUFACTURER_WINBOND_W25Q32 0x1660EF
|
||
/* Flash ID is same, but the unique ID is different, and unique ID(0xEC) needs to add cmd at xip mode. */
|
||
#define FLASH_MANUFACTURER_WINBOND_W25Q64 0x1760EF
|
||
/* Flash ID is same, but the unique ID is different, and unique ID(NULL) needs to add cmd at xip mode. */
|
||
#define FLASH_MANUFACTURER_WINBOND_W25Q128 0x1860EF
|
||
#define FLASH_MANUFACTURER_WINBOND_W25Q128JW 0x1880EF
|
||
#define FLASH_MANUFACTURER_WINBOND_W25Q256 0x1960EF
|
||
#define FLASH_MANUFACTURER_MICRON_MT25QU128 0x18BB20
|
||
#define FLASH_MANUFACTURER_MICRON_MT25QU256 0x19BB20
|
||
/* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
|
||
#define FLASH_MANUFACTURER_GIGADEVICE_GD25WQ64 0x1765C8
|
||
/* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
|
||
#define FLASH_MANUFACTURER_GIGADEVICE_GD25LE64EX 0x1760C8 /* EX represents E3IG and ESIG. */
|
||
/* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode */
|
||
#define FLASH_MANUFACTURER_GIGADEVICE_GD25LX128 0x1860C8 /* LX represents LB and LE. */
|
||
#define FLASH_MANUFACTURER_GIGADEVICE_GD25LQ256 0x1960C8
|
||
#define FLASH_MANUFACTURER_DOSILICON_FM25M64 0x1743F8
|
||
/* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
|
||
#define FLASH_MANUFACTURER_GIGADEVICE_GD25LQ32D 0x1660C8
|
||
/* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
|
||
#define FLASH_MANUFACTURER_DOSILICON_FM25M4AA 0x1842F8
|
||
/* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
|
||
#define FLASH_MANUFACTURER_PUYA_P25Q32LX 0x166085 /* LX represents L and LC. */
|
||
#define FLASH_MANUFACTURER_PUYA_P25Q64SL 0x176085
|
||
/* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
|
||
#define FLASH_MANUFACTURER_ADESTO_AT25SL128A 0x18421F
|
||
/* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
|
||
#define FLASH_MANUFACTURER_MXIC_MX25U32 0x3625C2
|
||
#define FLASH_MANUFACTURER_MXIC_MX25U256 0x3925C2
|
||
#define FLASH_MANUFACTURER_ELITE_EN25SX128A 0x18781C
|
||
/* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
|
||
#define FLASH_MANUFACTURER_DOSILICON_DS25M4AB 0x1842E5
|
||
#define FLASH_MANUFACTURER_ELITE_EN25S32A 0x16381C
|
||
#define FLASH_MANUFACTURER_XTX_XT25Q64D 0x17600B
|
||
#define FLASH_MANUFACTURER_XTX_XT25Q128D 0x18600B
|
||
|
||
#define FLASH_CMD_LEN_MAX 4
|
||
|
||
#define addr_unalign(Addr, Boundary) ((Addr) & ((Boundary) - 1))
|
||
#define addr_unalign_4b(Addr) addr_unalign((Addr), 4)
|
||
|
||
#define FLASH_SIZE_4MB 0x400000
|
||
#define FLASH_SIZE_8MB 0x800000
|
||
#define FLASH_SIZE_16MB 0x1000000
|
||
#define FLASH_SIZE_32MB 0x2000000
|
||
|
||
#define FLASH_PAGE_SIZE 4096
|
||
|
||
#define FLASH_BLOCK_32K_SIZE 0x8000
|
||
#define FLASH_BLOCK_64K_SIZE 0x10000
|
||
|
||
#define FLASH_W25Q64JWBYIQ_UNIQUE_ID 0xEC
|
||
#define FLASH_W25Q32JWBYIQ_UNIQUE_ID 0xE9
|
||
#define FLASH_W25Q128JWBYIQ_UNIQUE_ID 0xEB
|
||
|
||
|
||
static const uint32_t g_flash_need_cmd_unique_id[] = { FLASH_W25Q32JWBYIQ_UNIQUE_ID,
|
||
FLASH_W25Q64JWBYIQ_UNIQUE_ID,
|
||
FLASH_W25Q128JWBYIQ_UNIQUE_ID };
|
||
|
||
static const uint32_t g_winbond_flash_manufact_id[] = { FLASH_MANUFACTURER_WINBOND_W25Q32,
|
||
FLASH_MANUFACTURER_WINBOND_W25Q64,
|
||
FLASH_MANUFACTURER_WINBOND_W25Q128 };
|
||
|
||
/**
|
||
* @if Eng
|
||
* @brief supported flash.
|
||
* @else
|
||
* @brief 支持的flash。
|
||
* @endif
|
||
*/
|
||
typedef enum flash_support_manufacturer {
|
||
FLASH_MXIC_MX25R32,
|
||
FLASH_MXIC_MX25R64,
|
||
FLASH_MXIC_MX25U64,
|
||
FLASH_MXIC_MX25U128,
|
||
FLASH_WINBOND_W25Q32,
|
||
FLASH_WINBOND_W25Q64,
|
||
FLASH_WINBOND_W25Q128,
|
||
FLASH_WINBOND_W25Q128JW,
|
||
FLASH_WINBOND_W25Q256,
|
||
FLASH_MICRON_MT25QU128,
|
||
FLASH_MICRON_MT25QU256,
|
||
FLASH_GIGADEVICE_GD25WQ64,
|
||
FLASH_GIGADEVICE_GD25LE64E,
|
||
FLASH_GIGADEVICE_GD25LB128,
|
||
FLASH_GIGADEVICE_GD25LQ256,
|
||
FLASH_DOSILICON_FM25M64,
|
||
FLASH_GIGADEVICE_GD25LQ32D,
|
||
FLASH_DOSILICON_FM25M4AA,
|
||
FLASH_PUYA_P25Q32LC,
|
||
FLASH_ADESTO_AT25SL128A,
|
||
FLASH_MXIC_MX25U32,
|
||
FLASH_MXIC_MX25U12843,
|
||
FLASH_ELITE_EN25SX128A,
|
||
FLASH_DOSILICON_DS25M4AB,
|
||
FLASH_ELITE_EN25S32A,
|
||
FLASH_XTX_XT25Q64D,
|
||
FLASH_XTX_XT25Q128D,
|
||
FLASH_PUYA_P25Q64SL,
|
||
FLASH_MXIC_MX25U256,
|
||
FLASH_MANUFACTURER_MAX
|
||
} flash_support_manufacturer_t;
|
||
|
||
/**
|
||
* @brief Flash cmd type.
|
||
*/
|
||
typedef enum flash_cmd_type {
|
||
FLASH_CMD_TYPE_CMD,
|
||
FLASH_CMD_TYPE_PROCESSING,
|
||
FLASH_CMD_TYPE_CHECK,
|
||
FLASH_CMD_TYPE_END
|
||
} flash_cmd_type_t;
|
||
|
||
/**
|
||
* @if Eng
|
||
* @brief Flash cmd.
|
||
* @else
|
||
* @brief Flash 命令。
|
||
* @endif
|
||
*/
|
||
typedef struct flash_cmd_exe {
|
||
flash_cmd_type_t cmd_type; /*!< @if Eng Flash cmd type.
|
||
@else Flash 命令模式。@endif */
|
||
hal_spi_frame_format_t spi_frf_mode; /*!< @if Eng Flash spi trans mode.
|
||
@else Flash使用的spi传输模式。@endif */
|
||
uint8_t cmd_len; /*!< @if Eng cmd length.
|
||
@else 命令长度。@endif */
|
||
uint8_t cmd[FLASH_CMD_LEN_MAX]; /*!< @if Eng cmd.
|
||
@else 命令数组。@endif */
|
||
} flash_cmd_exe_t;
|
||
|
||
/**
|
||
* @if Eng
|
||
* @brief Flash qspi xip config.
|
||
* @else
|
||
* @brief Flash进出xip配置。
|
||
* @endif
|
||
*/
|
||
typedef struct flash_qspi_xip_config {
|
||
uint32_t enter_xip_before_wait_cycles_config; /*!< @if Eng Before enter xip mode wait cycle.
|
||
@else 进xip模式前的等待周期。@endif */
|
||
uint32_t enter_xip_before_inst_l; /*!< @if Eng Before enter xip mode inst len.
|
||
@else 进xip模式前的指令长度。@endif */
|
||
uint32_t enter_xip_before_addr_l; /*!< @if Eng Before enter xip mode addr len.
|
||
@else 进xip模式前的地址长度。@endif */
|
||
uint32_t enter_xip_before_trans_type; /*!< @if Eng Before enter xip mode trans type.
|
||
@else 进xip模式前的传输方式。@endif */
|
||
uint32_t enter_xip_after_wait_cycles_config; /*!< @if Eng After enter xip mode wait cycle.
|
||
@else 进xip模式后的等待周期。@endif */
|
||
uint32_t enter_xip_after_inst_l; /*!< @if Eng After enter xip mode inst len.
|
||
@else 进xip模式后的指令长度。@endif */
|
||
uint32_t enter_xip_after_addr_l; /*!< @if Eng After enter xip mode addr len.
|
||
@else 进xip模式后的地址长度。@endif */
|
||
uint32_t enter_xip_after_trans_type; /*!< @if Eng After enter xip mode trans type.
|
||
@else 进xip模式后的传输方式。@endif */
|
||
bool enter_xip_after_enable_32bit_addr; /*!< @if Eng Whether to enable 32bit_addr.
|
||
@else 进xip模式后是否需要使能32位地址。@endif */
|
||
bool enter_xip_after_enable_wrap; /*!< @if Eng Whether to enable wrap.
|
||
@else 进xip模式后是否需要使能数据包装。@endif */
|
||
} flash_qspi_xip_config_t;
|
||
|
||
/**
|
||
* @if Eng
|
||
* @brief Flash qspi enable config.
|
||
* @else
|
||
* @brief Flash qspi使能配置。
|
||
* @endif
|
||
*/
|
||
typedef struct flash_qe_config {
|
||
uint32_t manufacturer_id; /*!< @if Eng Flash manufacturer id.
|
||
@else Flash 制造 id。@endif */
|
||
flash_cmd_exe_t *flash_set_qe_cmd; /*!< @if Eng Flash set qspi enable cmd
|
||
@else Flash qspi 使能命令。@endif */
|
||
} flash_qe_config_t;
|
||
|
||
/**
|
||
* @if Eng
|
||
* @brief The basic configuration for flash.
|
||
* @else
|
||
* @brief Flash基础配置。
|
||
* @endif
|
||
*/
|
||
typedef struct flash_cfg {
|
||
uint32_t isinit; /*!< @if Eng Flash is init.
|
||
@else Flash 是否初始化。@endif */
|
||
uint32_t qspi_isinit; /*!< @if Eng Flash qspi is init.
|
||
@else Flash qspi是否初始化。@endif */
|
||
flash_support_manufacturer_t flash_manufacturer; /*!< @if Eng Flash manufacturer id index.
|
||
@else Flash id 索引。@endif */
|
||
uint32_t unique_id; /*!< @if Eng Flash unique id.
|
||
@else Flash 唯一 id。@endif */
|
||
spi_bus_t bus; /*!< @if Eng Flash spi bus.
|
||
@else Flash 使用的 spi bus。@endif */
|
||
hal_spi_frame_format_t mode; /*!< @if Eng Flash trans mode.
|
||
@else Flash 传输模式。@endif */
|
||
bool is_xip; /*!< @if Eng Flash is use xip.
|
||
@else Flash 使用xip。@endif */
|
||
bool need_cmd_at_xip_mode; /*!< @if Eng Flash need cmd at xip mode.
|
||
@else Flash 需要xip命令。@endif */
|
||
spi_attr_t attr; /*!< @if Eng Flash spi attr.
|
||
@else Flash spi 基础配置。@endif */
|
||
spi_extra_attr_t extra_attr; /*!< @if Eng Flash spi extra attr.
|
||
@else Flash spi 拓展配置。@endif */
|
||
} flash_cfg_t;
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
#endif
|