Files
kunlun/driver/inc/flash.h
2024-09-28 14:24:04 +08:00

382 lines
9.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/****************************************************************************
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
be copied by any method or incorporated into another program without
the express written consent of Aerospace C.Power. This Information or any portion
thereof remains the property of Aerospace C.Power. The Information contained herein
is believed to be accurate and Aerospace C.Power assumes no responsibility or
liability for its use in any way and conveys no license or title under
any patent or copyright and makes no representation or warranty that this
Information is free from patent or copyright infringement.
****************************************************************************/
#ifndef FLASH_H
#define FLASH_H
#include "sfc.h"
#ifdef __cplusplus
extern "C" {
#endif
extern sfc_ctrl_t *g_sfc_ctrl;
#define PAGE_PROGRAM_MASK 0xFF
#define SECTOR_ERASE_MASK 0xFFF
#define BLOCK_ERASE_32K_MASK 0x1FFFF
#define BLOCK_ERASE_64K_MASK 0xFFFF
#define PAGE_NUM_PER_SECTOR 0x10
#define PAGE_PROGRAM_SIZE 0x100
#define PAGE_ERASE_SIZE 0x100
#define SECTOR_ERASE_SIZE 0x1000
#define BLOCK_ERASE_32K_SIZE 0x8000
#define BLOCK_ERASE_64K_SIZE 0x10000
#define STS_WIP_BIT_S0 0x01
#define STS_WEL_BIT_S1 0x02
#define QUAD_ENA_BIT_S9 0x02
#define ADDR_DEFAULT_VAL_ZERO 0x00
#define SFDP_DEVICE_ID_ADDR 0x10
#define SFDP_DEVICE_ID_POS 0x03
#define FLASH_SUSPEND_ERASE 0
#define FLASH_SUSPEND_PROG 1
#define FLASH_CHIP_ID_LEN 16
/** \defgproup Driver_APIs FLASH APIs
* @brief FLASH APIs
*
*
*
*/
/** @addtogroup Driver_APIs
* @{
*
*/
typedef enum _flash_size {
FLASH_1M = 1,
FLASH_2M = 2,
FLASH_4M = 3,
FLASH_8M = 4,
FLASH_16M = 5,
FLASH_MAX,
} flash_size_t;
typedef enum {
SFC_MAP_STS_INIT = 0,
SFC_MAP_STS_DONE = 1,
SFC_MAP_STS_ERR = 2,
} sfc_map_sts_t;
typedef enum {
MODE_ERASE_MIN = 0x00U,
MODE_ERASE_SECTOR = 0x00U,
MODE_ERASE_PAGE = 0x01U,
MODE_ERASE_BLOCK64 = 0x02U,
MODE_ERASE_BLOCK32 = 0x03U,
MODE_ERASE_CHIP = 0x04U,
MODE_ERASE_MAX,
} mode_erase_t;
typedef enum {
MODE_WRITE_STS_REG0 = 0x00U,
MODE_WRITE_STS_REG1 = 0x01U
} mode_write_sts_t;
typedef enum {
MOD_SFC_READ_MIN = 0x00U,
MOD_SFC_READ_SIG = 0x00U,
MOD_SFC_READ_HIGH_SPD = 0x01U,
MOD_SFC_READ_DUAL_FAST = 0x02U,
MOD_SFC_READ_QUAD_FAST = 0x03U,
MOD_SFC_READ_DUAL_IO_FAST = 0x04U,
MOD_SFC_READ_QUAD_IO_FAST = 0x05U,
MOD_SFC_READ_QUAD_IO_WORD_FAST = 0x06U,
MOD_SFC_READ_MAX,
} flash_read_mode_t;
typedef enum {
MOD_PAGE_PROGRAM_MIN = 0x00U,
MOD_PAGE_PROGRAM_STAND = 0x01U,
MOD_PAGE_PROGRAM_QUAD = 0x02U,
MOD_PAGE_PROGRAM_FAST = 0x03U,
MOD_PAGE_PROGRAM_MAX,
} flash_page_prog_t;
typedef enum {
HAL_OK = 0x00U,
HAL_ERROR = 0x01U,
HAL_BUSY = 0x02U,
HAL_TIMEOUT = 0x03U,
HAL_NOT_SUPPORTED = 0x04U
} flash_rt_sts_t;
enum {
FLASH_OS_DISABLE = 0,
FLASH_OS_ENABLE = 1,
};
typedef struct _flash_os_cb {
uint32_t is_sw_sus_resume;
uint32_t (*get_gp_timer_val)(uint8_t id);
void (*task_suspend_all)(void);
void (*task_resume_all)(void);
} flash_os_cb_t;
typedef struct {
uint8_t is_erase;
uint8_t read_mode;
uint8_t write_mode;
uint8_t erase_mode;
uint8_t sw_mode;
flash_os_cb_t *cb;
} flash_write_param_t;
#define FLASH_PARAM_CHECK(a) \
if (!(a)) { \
return HAL_ERROR; \
} \
#define REGION_ADDR_OF_ID(id) ((id + 1)*0x1000)
/**
* @brief flash_probe() - function used to probe device by reading device ID
* @param data: the pointer of data where the manufacturer ID is saved
*
* @return HAL_OK -- succeed
* @return HAL_ERROR -- fail
*
*/
uint8_t flash_probe(void *data);
/**
* @brief flash_write() - function used to program data info flash memory
* @param data: the pointer of data to be written
* @param addr: the start address
* @param size: the data length(flash page size,unit is byte)
* @param param: the pointer of parameters - flash read/write/erase mode
*
* @return HAL_OK - succeed
* @return HAL_ERROR - fail
*
*/
uint8_t flash_write(const void* data, uint32_t addr,
uint32_t size, void *param);
/**
* @brief flash_read() - function used to read data from flash memory
* @param data: the read value will be saved in this pointer
* @param addr: the starting address
* @param size: the data length(flash page size,unit is byte)
* @param mode: read flash data mode
*
* @return HAL_OK - succeed
* @return HAL_ERROR - fail
*
*/
uint8_t flash_read(void* data, uint32_t addr, int size, uint8_t mode);
/**
* @brief flash_erase() - function used to erase flash memory data
* @param addr: the starting address
* @param uint32_t mode : the erase type
* @param param: the pointer of parameters - flash read/write/erase mode
*
* @return HAL_OK - succeed
* @return HAL_ERROR - fail
*
*/
uint8_t flash_erase(uint32_t addr, void *param);
/**
* @brief flash_get_dev_id() -function used to get flash device ID
* @param data: the manufacturer ID will be saved in this pointer
*
* @return HAL_OK - succeed
* @return HAL_ERROR - fail
*
*/
uint8_t flash_get_dev_id(void* data);
/**
* @brief flash_get_chip_id() -function used to get flash chip ID
* @param data: the chip ID will be saved in this pointer
*
* @return HAL_OK - succeed
* @return HAL_ERROR - fail
*
*/
uint8_t flash_get_chip_id(void* data);
/**
* @brief flash_get_dev_size() -function used to get flash device size
*
* @return FLASH_1M
* @return FLASH_2M
*
*/
uint32_t flash_get_dev_size(void);
/**
* @brief flash_get_dev_base() -function used to get flash device's base address.
*
* @return base address
*
*/
uint32_t flash_get_dev_base(void);
/**
* @brief flash_get_pe_mode() -function used to get flash device's program/erase mode.
*
* @return MOD_SW_MODE_ENA - SW SUPEND/RESUME
* @return MOD_SW_MODE_DIS - HW SUPEND/RESUME
*
*/
uint32_t flash_get_pe_mode(void);
/**
* @brief flash_get_sts_reg() - function used ot get flash status register
* @param data: the status register will be saved in this pointer
* @param reg_num: register number is 0/1
*
* @return HAL_OK - succeed
* @return HAL_ERROR - fail
*
*/
uint8_t flash_get_sts_reg(void* data, int reg_num);
/**
* @brief flash_set_quad_mode() - function used to set flash quad mode
*
* @return HAL_OK - succeed
* @return HAL_ERROR - fail
*
*/
uint8_t flash_set_quad_mode();
/**
* @brief flash_addr_mapping() - function used to exchange mapping flash address
* @param offset1: the address to exchanged
* @param offset2: the address to exchanged
* @param size: the range of address
*
* @return HAL_OK - succeed
* @return HAL_ERROR - fail
*
*/
uint8_t flash_addr_mapping(uint32_t offset1, uint32_t offset2, uint32_t size);
/**
* @brief flash_get_mapping_sts() - function used to get mapping status
*
* @return HAL_OK - succeed
* @return HAL_ERROR - fail
*
*/
uint8_t flash_get_mapping_sts(uint32_t *status);
/**
* @brief flash_clk_div_set() - function used to set flash controller's clock div.
*
* @return
*
*/
void flash_clk_div_set(uint8_t div);
/**
* @brief flash_clk_div_set() - function used to get flash controller's clock div.
*
* @return clock div
*
*/
uint8_t flash_clk_div_get();
/**
* @brief flash_init() - function used to initiate flash controller
* @param mode: init degree, 1: full init 0: part init
*
* @return HAL_OK - succeed
* @return HAL_ERROR - fail
*
*/
uint8_t flash_init(int mode);
/**
* @brief flash_data_reinforce() - read data and write twice to reinforce
flash data, this function is only applicable to Puya specific flash chip.
* @param offset: flash offset address
* @return HAL_OK - succeed
* @return HAL_ERROR - fail
*/
uint8_t flash_data_reinforce(uint32_t offset, uint32_t len);
/**
* @brief flash_set_os_ena() - set g_flash_os_ena = TRUE
* @return void
*/
void flash_set_os_ena();
/**
* @brief flash_set_os_dis() - set g_flash_os_ena = FALSE
* @return void
*/
void flash_set_os_dis();
/**
* @brief flash_os_is_enable() - get g_flash_os_ena value
* @return void
*/
uint8_t flash_os_is_enable();
/**
* @brief flash_otp_write() - write flash otp (Security) register
* @return void
*/
uint8_t flash_otp_write(FLASH_OTP_REGION_ID id,
uint32_t addr, const void *buf, size_t count);
/**
* @brief flash_otp_read() - read flash otp (Security) register
* @return void
*/
uint8_t flash_otp_read(FLASH_OTP_REGION_ID id,
uint32_t addr, void *buf, size_t count);
/**
* @brief flash_otp_erase() - erase flash otp (Security) register
* @return void
*/
uint8_t flash_otp_erase(FLASH_OTP_REGION_ID id);
/**
* @brief flash_otp_lock() - lock flash otp (Security) register ,
once its lock, the corresponding 256-Byte Security Register will become
read-only permanently.
* @return void
*/
void flash_otp_lock(FLASH_OTP_REGION_ID id);
/**
* @brief flash_otp_get_size() - get flash otp (Security) register size(bytes)
* @return void
*/
uint32_t flash_otp_get_size(void);
#ifdef __cplusplus
}
#endif
#endif // FLASH_H