225 lines
7.4 KiB
C
Raw Permalink Normal View History

2025-04-26 16:03:23 +08:00
/** ##########################################################################
** 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 */