1348 lines
42 KiB
C
Raw Normal View History

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