225 lines
7.4 KiB
C
225 lines
7.4 KiB
C
/** ##########################################################################
|
||
** Filename :
|
||
** Project :
|
||
** Module :
|
||
** Processor :
|
||
** Version :
|
||
** Compiler :
|
||
** Date/Time :
|
||
** Abstract :
|
||
** Contents :
|
||
** Note :
|
||
** (c) Copyright dmdz Co.,Ltd
|
||
** --------------------------------------------------------------------------
|
||
** R E V I S I O N H I S T O R Y
|
||
** --------------------------------------------------------------------------
|
||
** Date Ver Author Description
|
||
|
||
** -20230602- --V1.0-- --mingyea--- --修改--
|
||
|
||
** #########################################################################*/
|
||
#ifndef EEPROM_H__
|
||
#define EEPROM_H__
|
||
|
||
/*---------------------------------------------------------------------------
|
||
- I N C L U D E F I L E S
|
||
----------------------------------------------------------------------------*/
|
||
|
||
#include "common_types.h"
|
||
#include "common_cfg.h"
|
||
#include "fm33lg0xx_fl.h"
|
||
#include "mf_config.h"
|
||
#include "eeprom_cfg.h"
|
||
|
||
#ifdef NVM_EEPROM_EXT_EN
|
||
|
||
/*---------------------------------------------------------------------------
|
||
- D E F I N E S / M A C R O S
|
||
----------------------------------------------------------------------------*/
|
||
#define EFLASH_STATE_READ 0u
|
||
#define EFLASH_STATE_IDLE 1u
|
||
#define EFLASH_STATE_UPDATE 2u
|
||
#define EFLASH_STATE_PAGE_TRANSFER 3u
|
||
|
||
#define EFLASH_PAGE_ERASE_STATE_WAIT_LAST_OPERATION 0u
|
||
#define EFLASH_PAGE_ERASE_STATE_TRIGGER_TO_START 1u
|
||
#define EFLASH_PAGE_ERASE_STATE_WAIT_ERASE_FINISH 2u
|
||
#define EFLASH_PAGE_ERASE_STATE_WAIT_EOP 3u
|
||
|
||
#define EFLASH_PAGE_TRANSFER_STATE_WRITE_NEW_DATA 0u
|
||
#define EFLASH_PAGE_TRANSFER_STATE_COPY 1U
|
||
#define EFLASH_PAGE_TRANSFER_STATE_ERASE 2U
|
||
|
||
#define EFLASH_RESULT_INIT 0U
|
||
#define EFLASH_RESULT_ONCE_OK 1U //循环一次
|
||
|
||
/* Used Flash pages for EEPROM emulation */
|
||
#define EFLASH_PAGE0 ((u16)0x0000)
|
||
#define EFLASH_PAGE1 ((u16)0x0001)
|
||
|
||
/* No valid page define */
|
||
#define EFLASH_NO_VALID_PAGE ((u16)0x00AB)
|
||
|
||
/* Page status definitions */
|
||
#define EFLASH_ERASED ((u16)0xFFFF) /* PAGE is empty */
|
||
#define EFLASH_RECEIVE_DATA ((u16)0xEEEE) /* PAGE is marked to receive data */
|
||
#define EFLASH_VALID_PAGE ((u16)0x0000) /* PAGE containing valid data */
|
||
|
||
/* Valid pages in read and write defines */
|
||
#define EFLASH_READ_FROM_VALID_PAGE ((u8)0x00)
|
||
#define EFLASH_WRITE_IN_VALID_PAGE ((u8)0x01)
|
||
|
||
/* Page full define */
|
||
#define EFLASH_PAGE_FULL ((u8)0x80)
|
||
|
||
|
||
#define EFLASH_OPERATION_LEN 4u //flash operation lenth, 4 bytes
|
||
#define EFLASH_PAGE_START_INFO_LEN 8u //page start information, 4 bytes for page status, 4 bytes reserved
|
||
#define EFLASH_PAGE_FIRST_VARIABLE_ADDRESS (EFLASH_PAGE_START_INFO_LEN + EFLASH_OPERATION_LEN) //(EFLASH_PAGE_START_INFO_LEN + EFLASH_OPERATION_LEN)
|
||
#define EFLASH_ELEMENT_LEN 8u //page element lenth, 8 bytes{4 for data + 4 for virtual address}
|
||
|
||
#define EFLASH_ADDRS_ALIGN 4u
|
||
|
||
#define EFLASH_STATUS_SUCCESS FLASH_COMPLETE
|
||
#define EFLASH_STATUS_BUSY FLASH_BUSY
|
||
#define EFLASH_STATUS_CMD_INVALID FLASH_ERROR_WRP
|
||
#define EFLASH_STATUS_PPADRER_ERROR FLASH_ERROR_PG
|
||
|
||
#define eeprom_statys_t FLASH_Status
|
||
|
||
#define EFLASH_READ_OK 0u
|
||
#define EFLASH_READ_FAILED 1u
|
||
|
||
|
||
#define FLASH_Lock()
|
||
#define FLASH_Unlock()
|
||
|
||
//#define EEPROM_FLAG_CHANGE 0x000000u
|
||
|
||
/*---------------------------------------------------------------------------
|
||
- T Y P E D E F I N I T I O N S
|
||
----------------------------------------------------------------------------*/
|
||
typedef u32 eflash_operate_t; //flash operation occupy
|
||
|
||
typedef enum
|
||
{
|
||
FLASH_BUSY = 1u,
|
||
FLASH_ERROR_PG,
|
||
FLASH_ERROR_WRP,
|
||
FLASH_COMPLETE,
|
||
FLASH_TIMEOUT
|
||
}FLASH_Status;
|
||
|
||
typedef struct
|
||
{
|
||
u32 first_reset_flag; //是否第一次操作
|
||
|
||
//转移相关
|
||
u32 page_addr_new;
|
||
u32 page_addr_old;
|
||
u16 valid_page_new;
|
||
u16 eflash_page_index;
|
||
u16 trans_page_count;
|
||
|
||
//总状态相关
|
||
u8 state; //状态 --
|
||
u8 erase_state; //状态 --擦除数据
|
||
u8 transfer_state; //状态 --转移数据
|
||
u8 result; //
|
||
u16 cmd_eeprom_result; //每一條指令,的返回
|
||
//u16 cmd_ram_result; //每一條指令,的返回
|
||
u16 page_count;
|
||
u16 page_cur_id;
|
||
u16 page_addr_cur_total;
|
||
|
||
#ifdef EEPROM_OPTIMIZE_SEARCH_FAST //快速定位相关
|
||
u16 current_page;
|
||
u32 current_end_addr; //存了多少个数据,指的是,flash扇区上,包括重复
|
||
#endif
|
||
//u32 data; //
|
||
//u8 data_u8[4];
|
||
|
||
}eeprom_ext_s;
|
||
|
||
typedef struct
|
||
{
|
||
u8 test;
|
||
#ifdef EEPROM_EXT_DEBUG_EN
|
||
//做為接口的eeprom 邏輯地址
|
||
u16 test_count[70];
|
||
#endif
|
||
}eeprom_ext_test_s;
|
||
|
||
typedef struct
|
||
{
|
||
u8 sector_num; //有几个扇区,不包含备份域,
|
||
u16 mass_page_size_byte; //总容量,不包含备份域
|
||
u16 mass_page_addr_total_u32;
|
||
u16 mass_page_addr_total_u8;
|
||
u32 ram_start_addr;
|
||
u32 ram_end_addr;
|
||
u32 eflash_page0_start_addr;
|
||
u32 eflash_page0_end_addr;
|
||
u32 eflash_page1_start_addr;
|
||
u32 eflash_page1_end_addr;
|
||
}eeprom_user_info_s;
|
||
|
||
typedef struct
|
||
{
|
||
u8 flag;
|
||
u8 count;
|
||
}eeprom_input_test_s;
|
||
/*---------------------------------------------------------------------------
|
||
- G L O B A L V A R I A B L E S
|
||
- only configuration table allowed here,variables are not allowed!
|
||
----------------------------------------------------------------------------*/
|
||
#ifdef EEPROM_EXT_DEBUG_EN
|
||
extern eeprom_input_test_s g_eeprom_input_test[EEPROM_AREA_TOTAL_FOR_RAM];
|
||
#endif
|
||
extern MEMORY_MAP_RAM_FLAG_NOINIT eeprom_ext_s g_eeprom_ext[EEPROM_AREA_TOTAL_FOR_RAM];
|
||
extern eeprom_ext_test_s g_eeprom_ext_test[EEPROM_AREA_TOTAL_FOR_RAM] ;
|
||
extern u8 *g_ram_for_eeprom[EEPROM_AREA_TOTAL_FOR_RAM] ;
|
||
extern u32 g_logic_page_read_data[EEPROM_AREA_TOTAL_FOR_RAM] MEMORY_MAP_RAM_WDOG ;
|
||
extern u32 g_logic_page_write_data[EEPROM_AREA_TOTAL_FOR_RAM] MEMORY_MAP_RAM_WDOG ;
|
||
extern u8 g_logic_page_read_u8data[EEPROM_AREA_TOTAL_FOR_RAM][4] MEMORY_MAP_RAM_WDOG ;
|
||
|
||
/*---------------------------------------------------------------------------
|
||
- C O N S T A N T S
|
||
----------------------------------------------------------------------------*/
|
||
extern const eeprom_user_info_s g_eeprom_user_info[EEPROM_AREA_TOTAL_FOR_RAM] ;
|
||
|
||
/*---------------------------------------------------------------------------
|
||
- F U N C T I O N P R O T O T Y P E
|
||
----------------------------------------------------------------------------*/
|
||
|
||
|
||
//////以下是内部接口,给eeprom_ext
|
||
u16 eeprom_read_one_element(u8 area_id,u16 virt_addr, u32* data);
|
||
eeprom_statys_t eeprom_verify_page_ful_write_one_ele(u8 area_id,u16 valid_page, u16 virt_addr, u32 data);
|
||
eeprom_statys_t eeprom_program_u32(u32 addr, u32 data);
|
||
u16 eeprom_find_valid_page(u8 area_id,u8 operation);
|
||
eeprom_statys_t eeprom_erase_page(u32 page_addr);
|
||
eeprom_statys_t eeprom_format(u8 area_id);
|
||
void eeprom_get_current_page_addr(u8 area_id,u16 *p_valid_page,u32 *p_addr);
|
||
u16 eeprom_drv_init(u8 area_id);
|
||
eeprom_statys_t eeprom_page_transfer(u8 area_id,u16 virt_addr, u32 data);
|
||
u16 eeprom_get_cur_page_id(u8 area_id);
|
||
u32 eeprom_get_cur_end_addr(u8 area_id);
|
||
|
||
///以下是外部接口
|
||
void eeprom_init(void);
|
||
void eeprom_task(void);
|
||
u8 eeprom_ext_get_state(u8 area_id);
|
||
void eeprom_ext_clear_flag(void);
|
||
|
||
u8 eeprom_read_u8_ext(u32 w_addr, u8 *p_data, u16 b_number);
|
||
u8 eeprom_write_u8_ext(u32 w_addr, u8 *p_data, u16 b_number);
|
||
|
||
|
||
u8 eeprom_write_u8_ext1(u32 w_addr, u8 *p_data, u16 b_number);
|
||
|
||
#endif
|
||
|
||
#endif /* __EEPROM_H */
|
||
|