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

1348 lines
42 KiB
C
Raw Permalink 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 : 1.0
** 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--- --修改--
** #########################################################################*/
/*---------------------------------------------------------------------------
- I N C L U D E F I L E S
----------------------------------------------------------------------------*/
#include "error.h"
#include "eeprom.h"
#include "eeprom_seq.h"
#include "eeprom_state_machine.h"
#include "system_voltage_manage.h"
#include "wdog.h"
#ifdef NVM_EEPROM_EXT_EN
/*---------------------------------------------------------------------------
- D E F I N E S / M A C R O S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- T Y P E D E F I N I T I O N S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- S T A T I C V A R I A B L E S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
* G L O B A L V A R I A B L E S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- C O N S T A N T S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- F U N C T I O N P R O T O T Y P E
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description : 擦除数据
----------------------------------------------------------------------------*/
eeprom_statys_t eeprom_erase_page(u32 page_addr)
{
eeprom_statys_t l_flash_status ;
#ifdef EEPROM_EXT_JUDGE_PAGE_ADDR
assert_param(page_addr>=EEPROM_FLASH_ADDR_START);
assert_param(page_addr<EEPROM_FLASH_ADDR_END);
#endif
wdog_task();
#ifdef EEPROM_EXT_DEBUG_IO_EN
//EEPROM_EXT_ERASE_TEST_ON();
#endif
if (FL_FAIL == FL_FLASH_SectorErase(FLASH, page_addr))
{
l_flash_status = EFLASH_STATUS_BUSY;
}
else
{
l_flash_status = EFLASH_STATUS_SUCCESS;
}
#ifdef EEPROM_EXT_DEBUG_IO_EN
//EEPROM_EXT_ERASE_TEST_OFF();
#endif
return l_flash_status;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description : 写一个word
----------------------------------------------------------------------------*/
eeprom_statys_t eeprom_program_u32(u32 addr, u32 data)
{
eeprom_statys_t l_flash_status ;
#ifdef EEPROM_EXT_JUDGE_PAGE_ADDR
assert_param(addr>=EEPROM_FLASH_ADDR_START);
assert_param(addr<=EEPROM_AERA_END_ADDR);
assert_param((addr&FLASH_ADDRS_ALIGN_RES_MASK)==0u);
#endif
wdog_task();
if (FL_FAIL == FL_FLASH_Program_Word(FLASH, addr, data))
{
l_flash_status = EFLASH_STATUS_BUSY;
}
else
{
l_flash_status = EFLASH_STATUS_SUCCESS;
}
return l_flash_status;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :初始化
----------------------------------------------------------------------------*/
u16 eeprom_drv_init(u8 area_id)
{
u16 i;
u16 l_page0_status, l_page1_status;
#ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO
#else
u16 l_page0_auxi, l_page1_auxi;
#endif
//u16 l_addr_index = 0u;
//u16 l_eeprom_status = 0u, l_read_status = EFLASH_READ_FAILED;
u16 l_flash_status = EFLASH_STATUS_SUCCESS;
u8 l_flag_out=0u;
assert_param(area_id<EEPROM_AREA_TOTAL);
if(area_id>=EEPROM_AREA_TOTAL)
{
l_flash_status = EFLASH_STATUS_PPADRER_ERROR;
//return l_flash_status;
}
else
{
/* Get Page0 status */
l_page0_status = (*(__IO eflash_operate_t*)EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id));
/* Get Page1 status */
l_page1_status = (*(__IO eflash_operate_t*)EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id));
#ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO
#else
/* Get Page0 status */
l_page0_auxi = (*(__IO eflash_operate_t*)(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id)+EFLASH_OPERATION_LEN));
/* Get Page1 status */
l_page1_auxi = (*(__IO eflash_operate_t*)(EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id)+EFLASH_OPERATION_LEN));
#endif
/* Check for invalid header states and repair if necessary */
switch (l_page0_status)
{
case EFLASH_ERASED:
if (l_page1_status == EFLASH_VALID_PAGE) /* Page0 erased, Page1 valid */
{
//其实不需要每次都擦除,
#if 1 //其实没必要,每次都删除
if(g_eeprom_ext[area_id].first_reset_flag != EEPROM_FLAG_NOT_FIRST_RESET)
{
for(i = 0; i < EEPROM_AREAx_EFLASH_PAGE_NUM(area_id); i ++)
{
l_flash_status = eeprom_erase_page(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) + i * EFLASH_PAGE_SIEZ);
if(l_flash_status != EFLASH_STATUS_SUCCESS)
{
break;
}
}
/* If erase operation was failed, a Flash error code is returned */
if (l_flash_status != EFLASH_STATUS_SUCCESS)
{
//return l_flash_status;
l_flag_out=1u;
break;
}
}
#endif
}
#ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO
else if (l_page1_status == EFLASH_RECEIVE_DATA) /* Page0 erased, Page1 receive */
{
//g_eeprom_ext[area_id].first_reset_flag = EEPROM_FLAG_FIRST_RESET_CLEAR;
/* Erase Page0 */
for(i = 0; i < EEPROM_AREAx_EFLASH_PAGE_NUM(area_id); i ++)
{
l_flash_status = eeprom_erase_page(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) + i * EFLASH_PAGE_SIEZ);
if(l_flash_status != EFLASH_STATUS_SUCCESS)
{
break;
}
}
/* If erase operation was failed, a Flash error code is returned */
if (l_flash_status != EFLASH_STATUS_SUCCESS)
{
l_flag_out=1u;
break;
}
/* Mark Page1 as valid */
l_flash_status = eeprom_program_u32(EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id), EFLASH_VALID_PAGE);
/* If program operation was failed, a Flash error code is returned */
if (l_flash_status != EFLASH_STATUS_SUCCESS)
{
l_flag_out=1u;
break;
}
g_eeprom_ext[area_id].state = EFLASH_STATE_IDLE;
break;
}
#endif
else /* First EEPROM access (Page0&1 are erased) or invalid state -> format EEPROM */
{
#ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO
#else
if( l_page0_auxi == EFLASH_RECEIVE_DATA )
{
//正在转移,不用格式化--并且把FFFFF清成0
l_flash_status = eeprom_program_u32(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id), EFLASH_VALID_PAGE);
if (l_flash_status != EFLASH_STATUS_SUCCESS)
{
//return l_flash_status;
l_flag_out=1u;
break;
}
g_eeprom_ext[area_id].state = EFLASH_STATE_IDLE;
}
else if(l_page1_auxi == EFLASH_RECEIVE_DATA )
{
//正在转移,不用格式化--并且把FFFFF清成0
l_flash_status = eeprom_program_u32(EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id), EFLASH_VALID_PAGE);
if (l_flash_status != EFLASH_STATUS_SUCCESS)
{
//return l_flash_status;
l_flag_out=1u;
break;
}
g_eeprom_ext[area_id].state = EFLASH_STATE_IDLE;
}
else
#endif
{
/* Erase both Page0 and Page1 and set Page0 as valid page */
l_flash_status = eeprom_format(area_id);
/* If erase/program operation was failed, a Flash error code is returned */
if (l_flash_status != EFLASH_STATUS_SUCCESS)
{
//return l_flash_status;
l_flag_out=1u;
break;
}
g_eeprom_ext[area_id].first_reset_flag = EEPROM_FLAG_FIRST_RESET_CLEAR;
}
}
break;
#ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO
case EFLASH_RECEIVE_DATA:
if (l_page1_status == EFLASH_VALID_PAGE) /* Page0 receive, Page1 valid */
{
#ifdef EEPROM_EXT_STATE_MACHILE_ENABLE
//--其实可以考虙删除PAGE0重新在状态机中搬
/* Erase Page1 */
for(i = 0; i < EEPROM_AREAx_EFLASH_PAGE_NUM(area_id); i ++)
{
//wdog_task();
//wdt_disable();
l_flash_status = eeprom_erase_page(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) + i * EFLASH_PAGE_SIEZ);
//wdog_init();
//wdog_task();
if(l_flash_status != EFLASH_STATUS_SUCCESS)
{
break;
}
}
/* If erase operation was failed, a Flash error code is returned */
if (l_flash_status != EFLASH_STATUS_SUCCESS)
{
l_flag_out=1u;
break;
}
//g_eeprom_ext[area_id].first_reset_flag = EEPROM_FLAG_FIRST_RESET_CLEAR;
g_eeprom_ext[area_id].trans_page_count =0u;
g_eeprom_ext[area_id].transfer_state = EFLASH_PAGE_TRANSFER_STATE_WRITE_NEW_DATA;
#else
/* Transfer data from Page1 to Page0 */ //--其实可以考虙删除PAGE0重新在状态机中搬
eeprom_reset_page_transfer_continus(area_id,g_eeprom_ext[area_id].page_cur_id, g_logic_page_write_data[area_id]);
#endif
}
else if(l_page1_status == EFLASH_ERASED) /* Page0 receive, Page1 erased */
{
/* Erase Page1 */
//g_eeprom_ext[area_id].first_reset_flag = EEPROM_FLAG_FIRST_RESET_CLEAR;
for(i = 0; i < EEPROM_AREAx_EFLASH_PAGE_NUM(area_id); i ++)
{
l_flash_status = eeprom_erase_page(EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id) + i * EFLASH_PAGE_SIEZ);
if(l_flash_status != EFLASH_STATUS_SUCCESS)
{
break;
}
}
/* If erase operation was failed, a Flash error code is returned */
if (l_flash_status != EFLASH_STATUS_SUCCESS)
{
l_flag_out=1u;
break;
}
/* Mark Page0 as valid */
l_flash_status = eeprom_program_u32(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id), EFLASH_VALID_PAGE);
/* If program operation was failed, a Flash error code is returned */
if (l_flash_status != EFLASH_STATUS_SUCCESS)
{
l_flag_out=1u;
break;
}
g_eeprom_ext[area_id].state = EFLASH_STATE_IDLE;
}
else /* Invalid state -> format eeprom */
{
/* Erase both Page0 and Page1 and set Page0 as valid page */
l_flash_status = eeprom_format(area_id);
/* If erase/program operation was failed, a Flash error code is returned */
if (l_flash_status != EFLASH_STATUS_SUCCESS)
{
//return l_flash_status;
l_flag_out=1u;
break;
}
g_eeprom_ext[area_id].first_reset_flag = EEPROM_FLAG_FIRST_RESET_CLEAR;
}
break;
#endif
case EFLASH_VALID_PAGE:
if (l_page1_status == EFLASH_VALID_PAGE) /* Invalid state -> format eeprom */
{
/* Erase both Page0 and Page1 and set Page0 as valid page */
l_flash_status = eeprom_format(area_id);
/* If erase/program operation was failed, a Flash error code is returned */
if (l_flash_status != EFLASH_STATUS_SUCCESS)
{
//return l_flash_status;
l_flag_out=1u;
break;
}
g_eeprom_ext[area_id].first_reset_flag = EEPROM_FLAG_FIRST_RESET_CLEAR;
}
else if (l_page1_status == EFLASH_ERASED) /* Page0 valid, Page1 erased */
{
/* Erase Page1 */
#if 1 //其实没必要,每次都删除
if(g_eeprom_ext[area_id].first_reset_flag != EEPROM_FLAG_NOT_FIRST_RESET)
{
for(i = 0; i < EEPROM_AREAx_EFLASH_PAGE_NUM(area_id); i ++)
{
l_flash_status = eeprom_erase_page(EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id) + i * EFLASH_PAGE_SIEZ);
if(l_flash_status != EFLASH_STATUS_SUCCESS)
{
break;
}
}
/* If erase operation was failed, a Flash error code is returned */
if (l_flash_status != EFLASH_STATUS_SUCCESS)
{
//return l_flash_status;
l_flag_out=1u;
break;
}
}
#endif
}
else /* Page0 valid, Page1 receive */
{
#ifdef EEPROM_EXT_STATE_MACHILE_ENABLE
for(i = 0; i < EEPROM_AREAx_EFLASH_PAGE_NUM(area_id); i ++)
{
//wdog_task();
//wdt_disable();
l_flash_status = eeprom_erase_page(EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id) + i * EFLASH_PAGE_SIEZ);
//wdog_init();
//wdog_task();
if(l_flash_status != EFLASH_STATUS_SUCCESS)
{
break;
}
}
/* If erase operation was failed, a Flash error code is returned */
if (l_flash_status != EFLASH_STATUS_SUCCESS)
{
l_flag_out=1u;
break;
}
g_eeprom_ext[area_id].trans_page_count =0u;
g_eeprom_ext[area_id].transfer_state = EFLASH_PAGE_TRANSFER_STATE_WRITE_NEW_DATA;
#else
/* Transfer data from Page0 to Page1 */ //--其实可以考虙删除PAGE1重新在状态机中搬
eeprom_reset_page_transfer_continus(area_id,g_eeprom_ext[area_id].page_cur_id, g_logic_page_write_data[area_id]);
#endif
}
break;
default: /* Any other state -> format eeprom */
/* Erase both Page0 and Page1 and set Page0 as valid page */
l_flash_status = eeprom_format(area_id);
/* If erase/program operation was failed, a Flash error code is returned */
if (l_flash_status != EFLASH_STATUS_SUCCESS)
{
//return l_flash_status;
l_flag_out=1u;
break;
}
g_eeprom_ext[area_id].first_reset_flag = EEPROM_FLAG_FIRST_RESET_CLEAR;
break;
}
}
if(l_flag_out==0u)
{
l_flash_status = EFLASH_STATUS_SUCCESS;
}
return l_flash_status;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters : area_id: Var片区virt_addr: Variable virtual addressdata: Global variable contains the read variable value
|Output parameters :
|Return value : Success or error status:
* - 0: if variable was found
* - 1: if the variable was not found
* - EFLASH_NO_VALID_PAGE: if no valid page was found.
|Description :读取一个U32
----------------------------------------------------------------------------*/
u16 eeprom_read_one_element(u8 area_id,u16 virt_addr, u32* data)
{
u16 l_valid_page = EFLASH_PAGE0;
u16 l_addr_value = 0x5555, l_read_status = EFLASH_READ_FAILED;
u32 l_addr, l_page_start_addr;
assert_param(area_id<EEPROM_AREA_TOTAL);
/* Get active Page for read operation */
l_valid_page = eeprom_find_valid_page(area_id,EFLASH_READ_FROM_VALID_PAGE);
/* Check if there is no valid page */
if (l_valid_page == EFLASH_NO_VALID_PAGE)
{
return EFLASH_NO_VALID_PAGE;
}
/* Get the valid Page start l_addr */
l_page_start_addr = (u32)(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) + (u32)(l_valid_page * EFLASH_AREAx_MASS_PAGE_SIZE(area_id)));
#ifdef EEPROM_OPTIMIZE_SEARCH_FAST
if(eeprom_get_cur_page_id(area_id) == l_valid_page)
{
l_addr = eeprom_get_cur_end_addr(area_id);
}
else
{
l_addr = (u32)((EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) - EFLASH_OPERATION_LEN ) + (u32)((1 + l_valid_page) * EFLASH_AREAx_MASS_PAGE_SIZE(area_id) ));
}
#else
/* Get the valid Page end l_addr */
l_addr = (u32)((EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) - EFLASH_OPERATION_LEN ) + (u32)((1 + l_valid_page) * EFLASH_AREAx_MASS_PAGE_SIZE(area_id) ));
#endif
/* Check each active page address starting from end */
while (l_addr > (l_page_start_addr + EFLASH_OPERATION_LEN))
{
/* Get the current location content to be compared with virtual address */
l_addr_value = (*(__IO eflash_operate_t*)l_addr);
/* Compare the read address with the virtual address */
if (l_addr_value == (virt_addr + EEPROM_VIRT_ADDRESS_OFFSET))
{
/* Get content of l_addr-EFLASH_OPERATION_LEN which is variable value */
*data = (*(__IO eflash_operate_t*)(l_addr - EFLASH_OPERATION_LEN));
/* In case variable value is read, reset l_read_status flag */
l_read_status = EFLASH_READ_OK;
break;
}
else
{
/* Next address location */
l_addr = l_addr - EFLASH_ELEMENT_LEN;
}
}
//如果讀取,沒有該數據,返回一個默認值
if(l_read_status!=EFLASH_READ_OK)
{
*data= EEPROM_EXT_UN_WRITE_INIT;
}
/* Return l_read_status value: (0: variable exist, 1: variable doesn't exist) */
return l_read_status;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters : area_id: Var片区virt_addr: 16 bit virtual address of the variable
data: 16 bit data to be written as variable value
|Output parameters :
|Return value : Success or error status:
* - EFLASH_STATUS_SUCCESS: on success
* - EFLASH_PAGE_FULL: if valid page is full
* - EFLASH_NO_VALID_PAGE: if no valid page was found
* - Flash error code: on write Flash error
|Description :快速定位地址;
----------------------------------------------------------------------------*/
void eeprom_get_current_page_addr(u8 area_id,u16 *p_valid_page,u32 *p_addr)
{
u16 l_valid_page = EFLASH_PAGE0;
//eeprom_statys_t l_status_res = EFLASH_STATUS_SUCCESS;
u32 l_current_addr = 0u;
u32 l_addr, l_page_end_addr;
/* Get active Page for read operation */
l_valid_page = eeprom_find_valid_page(area_id,EFLASH_READ_FROM_VALID_PAGE);
/* Check if there is no valid page */
if (l_valid_page == EFLASH_NO_VALID_PAGE)
{
*p_valid_page = EFLASH_NO_VALID_PAGE;
*p_addr = EFLASH_READ_NOT_VALID_ADDR_CUR; //表示没有 有效的页
return ;
}
*p_valid_page = l_valid_page;
/* Get the valid Page start l_addr */
l_addr = (u32)(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) + (u32)(l_valid_page * EFLASH_AREAx_MASS_PAGE_SIZE(area_id)) + EFLASH_PAGE_FIRST_VARIABLE_ADDRESS);
/* Get the valid Page end l_addr */
l_page_end_addr = (u32)((EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) - EFLASH_OPERATION_LEN) + (u32)((1 + l_valid_page) * EFLASH_AREAx_MASS_PAGE_SIZE(area_id)));
/* Check each active page address starting from begining */
while (l_addr <= l_page_end_addr)
{
/* Verify if l_addr and l_addr+EFLASH_OPERATION_LEN contents are all 0xF */
#if (EFLASH_OPERATION_LEN == 2)
if ((*(__IO eflash_operate_t*)l_addr) == 0xFFFFFFFF)
#elif (EFLASH_OPERATION_LEN == 4)
if (((*(__IO eflash_operate_t*)l_addr) == 0xFFFFFFFF) &&
((*(__IO eflash_operate_t*)(l_addr - EFLASH_OPERATION_LEN)) == 0xFFFFFFFF)) //我认为目前-4是合理的 因为数据在地址前面
#endif
{
/* Set variable data */
//向前找如果先找到FFFF则认为是空的当前可以填的。
l_current_addr = l_addr;
*p_addr = l_current_addr;
/* Return program operation status */
return ;//l_current_addr;
}
else
{
/* Next address location */
l_addr = l_addr + EFLASH_ELEMENT_LEN;
}
}
l_current_addr = l_page_end_addr;
*p_addr = l_current_addr; //对齐到实际地址
/* Return EFLASH_PAGE_FULL in case the valid page is full */
return ;//l_current_addr;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters : Erases EFLASH_PAGE0 and EFLASH_PAGE1 and writes EFLASH_VALID_PAGE header to EFLASH_PAGE0
|Output parameters :
|Return value : Status of the last operation (Flash write or erase) done during
* EEPROM formating
|Description :
----------------------------------------------------------------------------*/
eeprom_statys_t eeprom_format(u8 area_id)
{
eeprom_statys_t l_status_res = EFLASH_STATUS_SUCCESS;
u8 i;
assert_param(area_id<EEPROM_AREA_TOTAL);
/* Erase Page0 */
for(i = 0; i < EEPROM_AREAx_EFLASH_PAGE_NUM(area_id); i ++)
{
l_status_res = eeprom_erase_page(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) + i * EFLASH_PAGE_SIEZ);
if (l_status_res != EFLASH_STATUS_SUCCESS)
{
break;
}
}
/* If erase operation was failed, a Flash error code is returned */
if (l_status_res != EFLASH_STATUS_SUCCESS)
{
return l_status_res;
}
/* Set Page0 as valid page: Write EFLASH_VALID_PAGE at Page0 base address */
l_status_res = eeprom_program_u32(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id), EFLASH_VALID_PAGE);
/* If program operation was failed, a Flash error code is returned */
if (l_status_res != EFLASH_STATUS_SUCCESS)
{
return l_status_res;
}
/* Erase Page1 */
for(i = 0; i < EEPROM_AREAx_EFLASH_PAGE_NUM(area_id); i ++)
{
l_status_res = eeprom_erase_page(EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id) + i * EFLASH_PAGE_SIEZ);
if (l_status_res != EFLASH_STATUS_SUCCESS)
{
break;
}
}
/* Return Page1 erase operation status */
return l_status_res;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters : area_id: Var片区 operation: operation to achieve on the valid page.
* This parameter can be one of the following values:
* @arg EFLASH_READ_FROM_VALID_PAGE: read operation from valid page
* @arg EFLASH_WRITE_IN_VALID_PAGE: write operation from valid page
|Output parameters :
|Return value :Valid page number (EFLASH_PAGE0 or EFLASH_PAGE1) or EFLASH_NO_VALID_PAGE in case
* of no valid page was found
|Description : Find valid Page for write or read operation
----------------------------------------------------------------------------*/
u16 eeprom_find_valid_page(u8 area_id,u8 operation)
{
u16 l_page0_status, l_page1_status;
#ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO
#else
u16 l_page0_auxi, l_page1_auxi;
#endif
u16 l_result =0u;
assert_param(area_id<EEPROM_AREA_TOTAL);
/* Get Page0 actual status */
l_page0_status = (*(__IO eflash_operate_t*)EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id));
/* Get Page1 actual status */
l_page1_status = (*(__IO eflash_operate_t*)EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id));
#ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO
#else
/* Get Page0 status */
l_page0_auxi = (*(__IO eflash_operate_t*)(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id)+EFLASH_OPERATION_LEN));
/* Get Page1 status */
l_page1_auxi = (*(__IO eflash_operate_t*)(EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id)+EFLASH_OPERATION_LEN));
#endif
/* Write or read operation */
switch (operation)
{
case EFLASH_WRITE_IN_VALID_PAGE: /* ---- Write operation ---- */
#ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO
if(l_page1_status == EFLASH_VALID_PAGE)
{
if(l_page0_status == EFLASH_RECEIVE_DATA)
{
l_result = EFLASH_PAGE0; /* Page0 valid */
}
else
{
l_result = EFLASH_PAGE1; /* Page1 valid */
}
}
else if(l_page0_status == EFLASH_VALID_PAGE)
{
if(l_page1_status == EFLASH_RECEIVE_DATA)
{
l_result = EFLASH_PAGE1; /* Page1 valid */
}
else
{
l_result = EFLASH_PAGE0; /* Page0 valid */
}
}
else
{
l_result = EFLASH_NO_VALID_PAGE ; /* No valid Page */
}
#else
if ((l_page0_status == EFLASH_VALID_PAGE) && (l_page1_status == EFLASH_ERASED) )
{
l_result = EFLASH_PAGE0; /* Page0 valid */
}
else if ( (l_page1_status == EFLASH_VALID_PAGE) && (l_page0_status == EFLASH_ERASED) )
{
l_result = EFLASH_PAGE1; /* Page1 valid */
}
else if ( (l_page1_status == EFLASH_ERASED) && (l_page0_status == EFLASH_ERASED) )
{
#ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO
#else
if(l_page0_auxi == EFLASH_RECEIVE_DATA)
{
l_result = EFLASH_PAGE0; /* Page0 valid */
}
else if(l_page1_auxi == EFLASH_RECEIVE_DATA)
{
l_result = EFLASH_PAGE1; /* Page0 valid */
}
else
#endif
{
l_result = EFLASH_NO_VALID_PAGE ; /* No valid Page */
}
}
else
{
l_result = EFLASH_NO_VALID_PAGE ; /* No valid Page */
}
#endif
break;
case EFLASH_READ_FROM_VALID_PAGE: /* ---- Read operation ---- */
if ( (l_page0_status == EFLASH_VALID_PAGE) && (l_page1_status != EFLASH_VALID_PAGE))
{
l_result = EFLASH_PAGE0; /* Page0 valid */
}
else if ((l_page1_status == EFLASH_VALID_PAGE) && (l_page0_status != EFLASH_VALID_PAGE))
{
l_result = EFLASH_PAGE1; /* Page1 valid */
}
else if ( (l_page1_status == EFLASH_ERASED) && (l_page0_status == EFLASH_ERASED) )
{
#ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO
#else
if(l_page0_auxi == EFLASH_RECEIVE_DATA)
{
l_result = EFLASH_PAGE0; /* Page0 valid */
}
else if(l_page1_auxi == EFLASH_RECEIVE_DATA)
{
l_result = EFLASH_PAGE1; /* Page0 valid */
}
else
#endif
{
l_result = EFLASH_NO_VALID_PAGE ; /* No valid Page */
}
}
else
{
l_result = EFLASH_NO_VALID_PAGE ; /* No valid Page */
}
break;
default:
l_result = EFLASH_PAGE0; /* Page0 valid */
break;
}
return l_result;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters : area_id: Var片区
virt_addr: 16 bit virtual address of the variable
data: 16 bit data to be written as variable value
|Output parameters :
|Return value : Success or error status:
* - EFLASH_STATUS_SUCCESS: on success
* - EFLASH_PAGE_FULL: if valid page is full
* - EFLASH_NO_VALID_PAGE: if no valid page was found
* - Flash error code: on write Flash error
|Description : Verify if active page is full and Writes variable in EEPROM.
----------------------------------------------------------------------------*/
eeprom_statys_t eeprom_verify_page_ful_write_one_ele(u8 area_id,u16 valid_page, u16 virt_addr, u32 data)
{
eeprom_statys_t l_status_res = EFLASH_STATUS_SUCCESS;
u32 l_addr, l_page_end_addr;
#ifdef EEPROM_OPTIMIZE_SEARCH_FAST
if(eeprom_get_cur_page_id(area_id) == valid_page)
{
l_addr = eeprom_get_cur_end_addr(area_id) - EFLASH_OPERATION_LEN;
}
else
{
l_addr = (u32)(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) + (u32)(valid_page * EFLASH_AREAx_MASS_PAGE_SIZE(area_id)) + EFLASH_PAGE_FIRST_VARIABLE_ADDRESS - EFLASH_OPERATION_LEN);
}
#else
/* Get the valid Page start l_addr */
l_addr = (u32)(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) + (u32)(valid_page * EFLASH_AREAx_MASS_PAGE_SIZE(area_id)) + EFLASH_PAGE_FIRST_VARIABLE_ADDRESS - EFLASH_OPERATION_LEN);
#endif
/* Get the valid Page end l_addr */
l_page_end_addr = (u32)((EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) - EFLASH_OPERATION_LEN) + (u32)((1u + valid_page) * EFLASH_AREAx_MASS_PAGE_SIZE(area_id)));
/* Check each active page address starting from begining */
while (l_addr < l_page_end_addr)
{
/* Verify if l_addr and l_addr+EFLASH_OPERATION_LEN contents are all 0xF */
#if (EFLASH_OPERATION_LEN == 2)
if ((*(__IO eflash_operate_t*)l_addr) == 0xFFFFFFFF)
#elif (EFLASH_OPERATION_LEN == 4)
if (((*(__IO eflash_operate_t*)l_addr) == 0xFFFFFFFF) &&
((*(__IO eflash_operate_t*)(l_addr + EFLASH_OPERATION_LEN)) == 0xFFFFFFFF))
#endif
{
#ifdef EEPROM_EXT_DEBUG_IO_EN
EEPROM_EXT_TEST1_ON(area_id);
#endif
/* Set variable data */
l_status_res = eeprom_program_u32(l_addr, data);
#ifdef EEPROM_EXT_DEBUG_IO_EN
EEPROM_EXT_TEST1_OFF(area_id);
#endif
/* If program operation was failed, a Flash error code is returned */
if (l_status_res != EFLASH_STATUS_SUCCESS)
{
return l_status_res;
}
#ifdef EEPROM_EXT_DEBUG_IO_EN
EEPROM_EXT_TEST1_ON(area_id);
#endif
/* Set variable virtual address */
l_status_res = eeprom_program_u32(l_addr + EFLASH_OPERATION_LEN, (virt_addr + EEPROM_VIRT_ADDRESS_OFFSET));
#ifdef EEPROM_EXT_DEBUG_IO_EN
EEPROM_EXT_TEST1_OFF(area_id);
#endif
/* Return program operation status */
return l_status_res;
}
else
{
/* Next address location */
l_addr = l_addr + EFLASH_ELEMENT_LEN;
}
}
/* Return EFLASH_PAGE_FULL in case the valid page is full */
return EFLASH_PAGE_FULL;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by : None
|Preconditions : None
|Input parameters : area_id: Var片区
|Output parameters : None
|Return value : None
|Description : 转移
----------------------------------------------------------------------------*/
eeprom_statys_t eeprom_page_transfer(u8 area_id,u16 virt_addr, u32 data)
{
u16 l_valid_page = EFLASH_PAGE0;
eeprom_statys_t l_status_res = EFLASH_STATUS_BUSY;
u16 ReadStatus = 0;
u32 DataVar;
u8 i;
switch (g_eeprom_ext[area_id].transfer_state)
{
case EFLASH_PAGE_TRANSFER_STATE_WRITE_NEW_DATA:
/* Get active Page for read operation */
l_valid_page = eeprom_find_valid_page(area_id,EFLASH_READ_FROM_VALID_PAGE);
if (l_valid_page == EFLASH_PAGE1) /* Page1 valid */
{
/* New page address where variable will be moved to */
g_eeprom_ext[area_id].page_addr_new = EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id);
g_eeprom_ext[area_id].valid_page_new = EFLASH_PAGE0;
/* Old page address where variable will be taken from */
g_eeprom_ext[area_id].page_addr_old = EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id);
}
else if (l_valid_page == EFLASH_PAGE0) /* Page0 valid */
{
/* New page address where variable will be moved to */
g_eeprom_ext[area_id].page_addr_new = EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id);
g_eeprom_ext[area_id].valid_page_new = EFLASH_PAGE1;
/* Old page address where variable will be taken from */
g_eeprom_ext[area_id].page_addr_old = EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id);
}
else
{
return EFLASH_NO_VALID_PAGE; /* No valid Page */
}
#ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO
l_status_res = eeprom_program_u32(g_eeprom_ext[area_id].page_addr_new, EFLASH_RECEIVE_DATA);
#else
l_status_res = eeprom_program_u32(g_eeprom_ext[area_id].page_addr_new+EFLASH_OPERATION_LEN, EFLASH_RECEIVE_DATA);
#endif
/* If program operation was failed, a Flash error code is returned */
if (l_status_res != EFLASH_STATUS_SUCCESS)
{
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[area_id].test_count[0]++;
#endif
return l_status_res; //这里要不要返回
}
#ifdef EEPROM_EXT_DEBUG_IO_EN
EEPROM_EXT_TEST1_ON(area_id);
#endif
/* Write the variable passed as parameter in the new active page */
l_status_res = eeprom_verify_page_ful_write_one_ele(area_id,g_eeprom_ext[area_id].valid_page_new,virt_addr, data);
#ifdef EEPROM_EXT_DEBUG_IO_EN
EEPROM_EXT_TEST1_OFF(area_id);
#endif
/* If program operation was failed, a Flash error code is returned */
if (l_status_res != EFLASH_STATUS_SUCCESS)
{
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[area_id].test_count[1]++;
#endif
return l_status_res; //这里要不要返回?
}
g_eeprom_ext[area_id].trans_page_count = 0;
l_status_res = EFLASH_STATUS_BUSY;
g_eeprom_ext[area_id].transfer_state = EFLASH_PAGE_TRANSFER_STATE_COPY;
g_eeprom_ext[area_id].page_addr_cur_total =1u; //从1开始因为这个数据就是存进去的
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[area_id].test_count[2]++;
#endif
break;
case EFLASH_PAGE_TRANSFER_STATE_COPY:
/* Transfer process: transfer vari[area_id]ables from old to the new active page */
for (i = 0u; i < 4u; i ++)
{
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[area_id].test_count[3]++;
#endif
if (g_eeprom_ext[area_id].trans_page_count != (virt_addr)) /* Check each variable except the one passed as parameter */
{
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[area_id].test_count[4]++;
#endif
/* Read the other last variable updates */
ReadStatus = eeprom_read_one_element(area_id,g_eeprom_ext[area_id].trans_page_count, &DataVar);
/* In case variable corresponding to the virtual address was found */
if (ReadStatus == EFLASH_READ_OK)
{
/* Transfer the variable to the new active page */
#ifdef EEPROM_EXT_DEBUG_IO_EN
EEPROM_EXT_TEST_ON(area_id);
#endif
l_status_res = eeprom_verify_page_ful_write_one_ele(area_id,g_eeprom_ext[area_id].valid_page_new,g_eeprom_ext[area_id].trans_page_count, DataVar);
#ifdef EEPROM_EXT_DEBUG_IO_EN
EEPROM_EXT_TEST_OFF(area_id);
#endif
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[area_id].test_count[5]++;
#endif
/* If program operation was failed, a Flash error code is returned */
if (l_status_res != EFLASH_STATUS_SUCCESS)
{
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[area_id].test_count[6]++;
#endif
return l_status_res;
}
g_eeprom_ext[area_id].page_addr_cur_total++;
}
else
{
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[area_id].test_count[7]++;
#endif
}
}
g_eeprom_ext[area_id].trans_page_count ++;
if(g_eeprom_ext[area_id].trans_page_count >= EEPROM_AREAx_ADDR_TOTAL_U32(area_id))
{
g_eeprom_ext[area_id].trans_page_count = 0;
l_status_res = EFLASH_STATUS_BUSY;
g_eeprom_ext[area_id].eflash_page_index = 0;
g_eeprom_ext[area_id].transfer_state = EFLASH_PAGE_TRANSFER_STATE_ERASE;
g_eeprom_ext[area_id].erase_state = EFLASH_PAGE_ERASE_STATE_WAIT_LAST_OPERATION;
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[area_id].test_count[8]++;
#endif
break;
}
}
l_status_res = EFLASH_STATUS_BUSY;
break;
case EFLASH_PAGE_TRANSFER_STATE_ERASE:
l_status_res = eeprom_erase_page(g_eeprom_ext[area_id].page_addr_old + g_eeprom_ext[area_id].eflash_page_index * EFLASH_PAGE_SIEZ);
if (l_status_res != EFLASH_STATUS_SUCCESS)
{
return l_status_res;
}
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[area_id].test_count[9]++;
#endif
g_eeprom_ext[area_id].eflash_page_index ++;
if(g_eeprom_ext[area_id].eflash_page_index >= EEPROM_AREAx_EFLASH_PAGE_NUM(area_id))
{
#ifdef EEPROM_EXT_DEBUG_IO_EN
EEPROM_EXT_TEST_ON(area_id);
#endif
l_status_res = eeprom_program_u32(g_eeprom_ext[area_id].page_addr_new, EFLASH_VALID_PAGE);
#ifdef EEPROM_EXT_DEBUG_IO_EN
EEPROM_EXT_TEST_OFF(area_id);
#endif
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[area_id].test_count[10]++;
#endif
}
else
{
l_status_res = EFLASH_STATUS_BUSY;
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[area_id].test_count[11]++;
#endif
}
break;
default:
l_status_res = EFLASH_STATUS_CMD_INVALID;
break;
}
return (l_status_res);
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by : None
|Preconditions : None
|Input parameters :
|Output parameters : None
|Return value : None
|Description :
----------------------------------------------------------------------------*/
err_flag_e ram_read_bytes_for_eeprom(u32 addr,u8 *p_data,u16 len)
{
err_flag_e l_result;
u8 *p_src;
u16 i;
if( (addr<EEPROM_RAM_ADDR_START) || (addr>EEPROM_RAM_ADDR_END) || ((addr+len)>(EEPROM_RAM_ADDR_END+1u)) )
{
l_result = ERR_FAILED;
}
else
{
p_src = (u8 *)(addr);
for (i = 0; i < len; i++)
{
p_data[i] = p_src[i]; /*lint !e511*/
}
l_result = ERR_OK;
}
return l_result;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by : None
|Preconditions : None
|Input parameters :
|Output parameters : None
|Return value : None
|Description
----------------------------------------------------------------------------*/
err_flag_e ram_write_bytes_for_eeprom(u32 addr,u8 *p_data,u16 len)
{
err_flag_e l_result;
u8 *p_addr;
u16 i;
if( (addr<EEPROM_RAM_ADDR_START) || (addr>EEPROM_RAM_ADDR_END) || ((addr+len)>(EEPROM_RAM_ADDR_END+1u)) )
{
l_result = ERR_FAILED;
}
else
{
p_addr = (u8 *)(addr);
for (i = 0; i < len; i++)
{
p_addr[i] = p_data[i] ; /*lint !e511*/
}
l_result = ERR_OK;
}
return l_result;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by : None
|Preconditions : None
|Input parameters :
|Output parameters : None
|Return value : None
|Description
----------------------------------------------------------------------------*/
u8 eeprom_read_u8_ext(u32 w_addr, u8 *p_data, u16 b_number)
{
u8 l_result ;
l_result = ram_read_bytes_for_eeprom(w_addr+EEPROM_RAM_ADDR_START,p_data,b_number);
return l_result;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by : None
|Preconditions : None
|Input parameters :
|Output parameters : None
|Return value : None
|Description
----------------------------------------------------------------------------*/
u8 eeprom_write_u8_ext(u32 w_addr, u8 *p_data, u16 b_number)
{
u8 l_result ;
#ifdef EEPROM_EXT_STATE_MACHILE_ENABLE
#else
u16 l_start_addr;
u16 l_offset;
u16 l_len;
u16 i;
u32 *p_u32;
u32 l_data;
#endif
l_result = ram_write_bytes_for_eeprom(w_addr+EEPROM_RAM_ADDR_START,p_data,b_number);
#ifdef EEPROM_EXT_STATE_MACHILE_ENABLE
#else
l_offset = w_addr&(u32)0x03u;
l_start_addr = (w_addr-l_offset)/4u;
l_len = ((b_number+l_offset)/0x04u+1u);
for(i = 0; i < l_len; i++)
{
if( ((w_addr+EEPROM_RAM_ADDR_START)>=EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_0) )
&& ((w_addr+EEPROM_RAM_ADDR_START+b_number)<=EEPROM_AREAx_RAM_ADDR_END(EEPROM_AREA_ID_0) ) )
{
p_u32 = (u32*)(l_start_addr*4u+EEPROM_RAM_ADDR_START);
l_data = *p_u32;
eeprom_write_one_element_seq(EEPROM_AREA_ID_0,l_start_addr,l_data);
}
else if( ((w_addr+EEPROM_RAM_ADDR_START)>=EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_1) )
&& ((w_addr+EEPROM_RAM_ADDR_START+b_number)<=EEPROM_AREAx_RAM_ADDR_END(EEPROM_AREA_ID_1) ) )
{
p_u32 = (u32*)(l_start_addr*4u+EEPROM_RAM_ADDR_START);
l_data = *p_u32;
l_offset = (EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_1)-EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_0))/4;
eeprom_write_one_element_seq(EEPROM_AREA_ID_1,l_start_addr-l_offset,l_data);
}
else
{
}
p_u32++;
}
#endif
return l_result;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by : None
|Preconditions : None
|Input parameters :
|Output parameters : None
|Return value : None
|Description
----------------------------------------------------------------------------*/
u8 eeprom_ext_get_state(u8 area_id)
{
assert_param(area_id<EEPROM_AREA_TOTAL);
return g_eeprom_ext[area_id].state;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by : None
|Preconditions : None
|Input parameters :
|Output parameters : None
|Return value : None
|Description 初始化
----------------------------------------------------------------------------*/
void eeprom_init(void)
{
eeprom_area_init(EEPROM_AREA_ID_0);
#if EEPROM_AREA_TOTAL >1u
eeprom_area_init(EEPROM_AREA_ID_1);
#endif
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by : None
|Preconditions : None
|Input parameters :
|Output parameters : None
|Return value : None
|Description 任务
----------------------------------------------------------------------------*/
void eeprom_task(void)
{
eeprom_test_task();
#if 0
//if(g_eeprom_input_test.flag==0x1)
{
//g_eeprom_input_test.flag=2u;
//g_eeprom_input_test.count++;
//eeprom_ext_input_test();
//eeprom_ext_restart();
if(SVD_ISR_SVDR_Msk != FL_SVD_GetLatchedPowerStatus(SVD))
{
return ; //l_result;
}
#ifdef EEPROM_EXT_STATE_MACHILE_ENABLE
{
eeprom_state_machine_task(EEPROM_AREA_ID_0);
#if EEPROM_AREA_TOTAL >1u
eeprom_state_machine_task(EEPROM_AREA_ID_1);
#endif
}
#endif
}
#else
#ifdef EEPROM_EXT_STATE_MACHILE_ENABLE
u8 l_power_grade;
l_power_grade = system_voltage_manage_mode_get(FUNC_SYSTEM_VOLTAGE_MANAGE_ID);
if( ( (l_power_grade == SYSTEM_VOLTAGE_MODE_NORMAL) || (l_power_grade == SYSTEM_VOLTAGE_MODE_HIGH) ) //电压不能低于9v
&& (SVD_ISR_SVDR_Msk == FL_SVD_GetLatchedPowerStatus(SVD)) )
{
#ifdef EEPROM_EXT_DEBUG_EN
//g_eeprom_ext_test.test_count[37]++;
#endif
#ifdef EEPROM_EXT_STATE_MACHILE_ENABLE
eeprom_state_machine_task(EEPROM_AREA_ID_0);
#if EEPROM_AREA_TOTAL >1u
eeprom_state_machine_task(EEPROM_AREA_ID_1);
#endif
#endif
}
else
{
#ifdef EEPROM_EXT_DEBUG_EN
//g_eeprom_ext_test.test_count[38]++;
#endif
}
#endif
#endif
}
#if 0
//
/*---------------------------------------------------------------------------
|Prototype :
|Called by : None
|Preconditions : None
|Input parameters :
|Output parameters : None
|Return value : None
|Description 测试用
----------------------------------------------------------------------------*/
u8 eeprom_write_u8_ext1(u32 w_addr, u8 *p_data, u16 b_number)
{
u8 l_result ;
u16 l_start_addr;
u16 l_offset;
u16 l_len;
u16 i;
u32 *p_u32;
u32 l_data;
l_result = ram_write_bytes_for_eeprom(w_addr+EEPROM_RAM_ADDR_START,p_data,b_number);
#if 0 //def EEPROM_EXT_STATE_MACHILE_ENABLE
#else
l_offset = w_addr&(u32)0x03u;
l_start_addr = (w_addr-l_offset)/4u;
l_len = ((b_number+l_offset)/0x04u+1u);
for(i = 0; i < l_len; i++)
{
if( ((w_addr+EEPROM_RAM_ADDR_START)>=EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_0) )
&& ((w_addr+EEPROM_RAM_ADDR_START+b_number)<=EEPROM_AREAx_RAM_ADDR_END(EEPROM_AREA_ID_0) ) )
{
p_u32 = (u32*)(l_start_addr*4u+EEPROM_RAM_ADDR_START);
l_data = *p_u32;
eeprom_write_one_element_seq(EEPROM_AREA_ID_0,l_start_addr,l_data);
}
else if( ((w_addr+EEPROM_RAM_ADDR_START)>=EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_1) )
&& ((w_addr+EEPROM_RAM_ADDR_START+b_number)<=EEPROM_AREAx_RAM_ADDR_END(EEPROM_AREA_ID_1) ) )
{
p_u32 = (u32*)(l_start_addr*4u+EEPROM_RAM_ADDR_START);
l_data = *p_u32;
l_offset = (EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_1)-EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_0))/4;
eeprom_write_one_element_seq(EEPROM_AREA_ID_1,l_start_addr-l_offset,l_data);
}
else
{
}
p_u32++;
}
#endif
return l_result;
}
#endif
#endif