2025-04-26 16:03:23 +08:00

225 lines
7.4 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.

/** ##########################################################################
** 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 */