Commit d0088c9d authored by 李冠华's avatar 李冠华

feat:增加校验提供的flash空间是否够用的功能

parent 35ace98a
...@@ -12,47 +12,11 @@ ...@@ -12,47 +12,11 @@
uint32_t g_u32EEPROMBlock0Buffer[EEPROM_BLOCK0_BUFFER_SIZE / 4U]; uint32_t g_u32EEPROMBlock0Buffer[EEPROM_BLOCK0_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK0_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_UDS_FLAG_SIZE)
// uint32_t g_u32EEPROMBlock0Buffer[EEPROM_BLOCK0_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK1_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_UDS_S27_SIZE)
// uint32_t g_u32EEPROMBlock1Buffer[EEPROM_BLOCK1_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK2_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_UDS_S2E_SIZE)
// uint32_t g_u32EEPROMBlock2Buffer[EEPROM_BLOCK2_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK3_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_UDS_CONFIG_SIZE)
// uint32_t g_u32EEPROMBlock3Buffer[EEPROM_BLOCK3_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK4_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_UDS_DTC_SIZE)
// uint32_t g_u32EEPROMBlock4Buffer[EEPROM_BLOCK4_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK5_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_ODO_SIZE)
// uint32_t g_u32EEPROMBlock5Buffer[EEPROM_BLOCK5_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK6_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_ODO_STAMP_SIZE)
// uint32_t g_u32EEPROMBlock6Buffer[EEPROM_BLOCK6_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK7_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_TRIP_STAMP_SIZE)
// uint32_t g_u32EEPROMBlock7Buffer[EEPROM_BLOCK7_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK8_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_SERVICE_INFO_SIZE)
// uint32_t g_u32EEPROMBlock8Buffer[EEPROM_BLOCK8_BUFFER_SIZE / 4U];
static const EEPROM_Block_st_t g_stEEPROMBlockTable[] = static const EEPROM_Block_st_t g_stEEPROMBlockTable[] =
{ {
/* u32StartAddr u32EndAddr u32DataSize pu32DataBuffer */ /*u32UsageTimes u32StartAddr u32EndAddr u32DataSize pu32DataBuffer */
{SECTOR_14_START_ADDR, 0x0801E7FFUL, EEPROM_BLOCK0_BUFFER_SIZE, g_u32EEPROMBlock0Buffer,}, {EEPROM_TARGET_ERASE_NUM, SECTOR_14_START_ADDR, 0x0801E7FFUL, EEPROM_BLOCK0_BUFFER_SIZE, g_u32EEPROMBlock0Buffer,},
// {0x08019080UL, 0x080190FFUL, EEPROM_BLOCK1_BUFFER_SIZE, g_u32EEPROMBlock1Buffer,}, {EEPROM_TARGET_ERASE_NUM1, SECTOR_12_START_ADDR, 0x0801A7FFUL, EEPROM_BLOCK0_BUFFER_SIZE, g_u32EEPROMBlock0Buffer,},
// {0x08019100UL, 0x0801917FUL, EEPROM_BLOCK2_BUFFER_SIZE, g_u32EEPROMBlock2Buffer,},
// {0x08019180UL, 0x080191FFUL, EEPROM_BLOCK3_BUFFER_SIZE, g_u32EEPROMBlock3Buffer,},
// {0x08019200UL, 0x0801927FUL, EEPROM_BLOCK4_BUFFER_SIZE, g_u32EEPROMBlock4Buffer,},
// {0x08019280UL, 0x0801967FUL, EEPROM_BLOCK5_BUFFER_SIZE, g_u32EEPROMBlock5Buffer,},
// {0x08019680UL, 0x08019B7FUL, EEPROM_BLOCK6_BUFFER_SIZE, g_u32EEPROMBlock6Buffer,},
// {0x08019B80UL, 0x0802157FUL, EEPROM_BLOCK7_BUFFER_SIZE, g_u32EEPROMBlock7Buffer,},
// {0x08021580UL, 0x080215FFUL, EEPROM_BLOCK8_BUFFER_SIZE, g_u32EEPROMBlock8Buffer,},
}; };
/**************************************************************************** /****************************************************************************
...@@ -61,9 +25,10 @@ static const EEPROM_Block_st_t g_stEEPROMBlockTable[] = ...@@ -61,9 +25,10 @@ static const EEPROM_Block_st_t g_stEEPROMBlockTable[] =
EEPROM_Block_Access_st_t g_stEEPROMBlockAccess[EEPROM_TOTAL_BLOCK_NUM]; EEPROM_Block_Access_st_t g_stEEPROMBlockAccess[EEPROM_TOTAL_BLOCK_NUM];
void EEPROM_Init(void) EEPROM_Init_Status_en_t EEPROM_Init(void)
{ {
EEPROM_Media_Access_st_t stFlashAccessFunc; EEPROM_Media_Access_st_t stFlashAccessFunc;
uint8_t u8Result = 0U;
// TYW_FDL_Init(); // TYW_FDL_Init();
...@@ -74,10 +39,19 @@ void EEPROM_Init(void) ...@@ -74,10 +39,19 @@ void EEPROM_Init(void)
// Int_Data_Flash_Register_P_E_Complete_Cb(EEPROM_Mem_Access_Complete_Callback); // Int_Data_Flash_Register_P_E_Complete_Cb(EEPROM_Mem_Access_Complete_Callback);
EEPROM_Access_Init( g_stEEPROMBlockTable, u8Result = EEPROM_Access_Init( g_stEEPROMBlockTable,
g_stEEPROMBlockAccess, g_stEEPROMBlockAccess,
&stFlashAccessFunc, &stFlashAccessFunc,
EEPROM_TOTAL_BLOCK_NUM); EEPROM_TOTAL_BLOCK_NUM);
if (u8Result == 0xFFU)
{
return EEPROM_INIT_FAIL;
}
else
{
return EEPROM_INIT_SUCCESS;
}
} }
EEPROM_Status_en_t EEPROM_Get_Status(void) EEPROM_Status_en_t EEPROM_Get_Status(void)
......
...@@ -22,6 +22,13 @@ typedef enum ...@@ -22,6 +22,13 @@ typedef enum
EEPROM_STAT_BUSY, EEPROM_STAT_BUSY,
}EEPROM_Status_en_t; }EEPROM_Status_en_t;
typedef enum
{
EEPROM_INIT_SUCCESS = 0,
EEPROM_INIT_FAIL,
}EEPROM_Init_Status_en_t;
/**************************************************************************** /****************************************************************************
* !!! The following code should be generated by configuration tool !!! * * !!! The following code should be generated by configuration tool !!! *
****************************************************************************/ ****************************************************************************/
...@@ -50,11 +57,14 @@ enum g_enEEPROMBlockName ...@@ -50,11 +57,14 @@ enum g_enEEPROMBlockName
#define EEPROM_TOTAL_BLOCK_NUM (1U)/*创建的独立的负载均衡空间的个数*/ #define EEPROM_TOTAL_BLOCK_NUM (1U)/*创建的独立的负载均衡空间的个数*/
#define EEPROM_TARGET_ERASE_NUM 4000000U
#define EEPROM_TARGET_ERASE_NUM1 4000000U
/**************************************************************************** /****************************************************************************
* !!! End of code generation !!! * * !!! End of code generation !!! *
****************************************************************************/ ****************************************************************************/
extern void EEPROM_Init(void); extern EEPROM_Init_Status_en_t EEPROM_Init(void);
extern EEPROM_Status_en_t EEPROM_Get_Status(void); extern EEPROM_Status_en_t EEPROM_Get_Status(void);
extern EEPROM_Block_Status_en_t EEPROM_Get_Block_Status(uint16_t u16BlockID); extern EEPROM_Block_Status_en_t EEPROM_Get_Block_Status(uint16_t u16BlockID);
......
...@@ -192,15 +192,13 @@ EEPROM_Mem_Blank_Chk_Func_ptr_t g_pfnEEPROMMemBlankCheck; ...@@ -192,15 +192,13 @@ EEPROM_Mem_Blank_Chk_Func_ptr_t g_pfnEEPROMMemBlankCheck;
EEPROM_Mem_Read_Func_ptr_t g_pfnEEPROMMemRead; EEPROM_Mem_Read_Func_ptr_t g_pfnEEPROMMemRead;
EEPROM_Mem_Write_Func_ptr_t g_pfnEEPROMMemWrite; EEPROM_Mem_Write_Func_ptr_t g_pfnEEPROMMemWrite;
void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable, uint8_t EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
EEPROM_Block_Access_st_t * pstBlockAccess, EEPROM_Block_Access_st_t * pstBlockAccess,
EEPROM_Media_Access_st_t * pstMediaAccess, EEPROM_Media_Access_st_t * pstMediaAccess,
uint16_t u16BlockNum) uint16_t u16BlockNum)
{ {
uint16_t i; uint16_t i;
uint8_t u8Loop; uint8_t u8Loop;
uint8_t u8Ready;
uint16_t u16Index; uint16_t u16Index;
uint16_t u16IndexBkup; uint16_t u16IndexBkup;
uint16_t u16RecordNum; uint16_t u16RecordNum;
...@@ -210,12 +208,40 @@ void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable, ...@@ -210,12 +208,40 @@ void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
uint32_t u32DataAddr; uint32_t u32DataAddr;
uint32_t u32DataAddrBase; uint32_t u32DataAddrBase;
uint32_t u32DataAddrEnd; uint32_t u32DataAddrEnd;
uint32_t u32DataSpaceSize = 0U;
uint32_t u32GivenSpaceSize = 0U;
uint32_t u32LostAccuracy = 0U;
EEPROM_Ctrl_Data_un_t unCtrlData; EEPROM_Ctrl_Data_un_t unCtrlData;
if ((pstBlockTable != NULL) && (pstBlockAccess != NULL) &&\ if ((pstBlockTable != NULL) && (pstBlockAccess != NULL) &&\
(pstMediaAccess != NULL) && (u16BlockNum != 0U)) (pstMediaAccess != NULL) && (u16BlockNum != 0U))
{ {
/*** Step 0 : 通过传入的使用次数计算使用的flash空间大小,是否会超限 */
for (i = 0U; i < u16BlockNum; i++)
{
u32LostAccuracy = 0U;
u32LostAccuracy = pstBlockTable[i].u32UsageTimes % MAX_ERASE_FREQUENCY; /*计算空间时丢失的精度*/
if (u32LostAccuracy != 0U)
{
/*增加1个存储块的空间*/
u32LostAccuracy = 1U;
}
u32DataSpaceSize += (((pstBlockTable[i].u32UsageTimes / MAX_ERASE_FREQUENCY) + u32LostAccuracy) * ONE_PAGE_LEN);
u32GivenSpaceSize += (pstBlockTable[i].u32EndAddr - pstBlockTable[i].u32StartAddr + 1U);
}
printf("u32DataSpaceSize wei : %x\n\r",u32DataSpaceSize);
printf("u32GivenSpaceSize wei : %x\n\r",u32GivenSpaceSize);
if (u32DataSpaceSize > u32GivenSpaceSize)
{
printf("kong jian bu zu!\n\r");
return 0xFFU;
}
/*** Step 1 : Setup media(data flash) access functions ***/ /*** Step 1 : Setup media(data flash) access functions ***/
g_pfnEEPROMMemErase = pstMediaAccess->pfnMemErase; g_pfnEEPROMMemErase = pstMediaAccess->pfnMemErase;
g_pfnEEPROMMemBlankCheck = pstMediaAccess->pfnMemBlankChk; g_pfnEEPROMMemBlankCheck = pstMediaAccess->pfnMemBlankChk;
...@@ -224,7 +250,7 @@ void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable, ...@@ -224,7 +250,7 @@ void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
/*** Step 2 : Generate flash read / write control data ***/ /*** Step 2 : Generate flash read / write control data ***/
g_stEEPROMAccess.u8State = EEPROM_WR_STATE_IDLE; g_stEEPROMAccess.u8State = EEPROM_WR_STATE_IDLE;
g_stEEPROMAccess.u16BlockNum = u16BlockNum; /*可以操作的E方的区域(这个项目是9个,对应g_stEEPROMBlockTable这个数组)*/ g_stEEPROMAccess.u16BlockNum = u16BlockNum; /*可以操作的E方的区域,可以按项目将flash划分为多个磨损空间,每个空间存储擦写次数相近的数据*/
g_pstEEPROMBlock = pstBlockAccess; g_pstEEPROMBlock = pstBlockAccess;
...@@ -276,7 +302,6 @@ void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable, ...@@ -276,7 +302,6 @@ void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
} }
u16RecordNum = 0U; u16RecordNum = 0U;
u8Ready = 0U;
while (u8Loop) while (u8Loop)
{ {
...@@ -287,7 +312,6 @@ void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable, ...@@ -287,7 +312,6 @@ void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
if (unCtrlData.stField.u16Index + unCtrlData.stField.u16IndexInv == 0xFFFFU) if (unCtrlData.stField.u16Index + unCtrlData.stField.u16IndexInv == 0xFFFFU)
{ {
u8Loop = 0U; u8Loop = 0U;
u8Ready = 1U;
g_pstEEPROMBlock[i].u8Status = EEPROM_BLOCK_ACTIVE; g_pstEEPROMBlock[i].u8Status = EEPROM_BLOCK_ACTIVE;
g_pstEEPROMBlock[i].u8SectorOffset = 0U; g_pstEEPROMBlock[i].u8SectorOffset = 0U;
...@@ -443,6 +467,11 @@ void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable, ...@@ -443,6 +467,11 @@ void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
}while(u8Loop); }while(u8Loop);
} }
} }
return 0;
}
else
{
return 0xFFU;
} }
} }
......
...@@ -5,9 +5,11 @@ ...@@ -5,9 +5,11 @@
#include <stdint.h> #include <stdint.h>
#define ONE_PAGE_LEN 0x100U #define ONE_PAGE_LEN 0x100U
#define MAX_ERASE_FREQUENCY 100000U
typedef struct typedef struct
{ {
uint32_t u32UsageTimes;
uint32_t u32StartAddr; uint32_t u32StartAddr;
uint32_t u32EndAddr; uint32_t u32EndAddr;
uint32_t u32DataSize; uint32_t u32DataSize;
...@@ -47,7 +49,7 @@ typedef struct ...@@ -47,7 +49,7 @@ typedef struct
#define EEPROM_BLOCK_CTRL_BYTE_SIZE (8U) #define EEPROM_BLOCK_CTRL_BYTE_SIZE (8U)
extern void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable, extern uint8_t EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
EEPROM_Block_Access_st_t * pstBlockAccess, EEPROM_Block_Access_st_t * pstBlockAccess,
EEPROM_Media_Access_st_t * pstMediaAccess, EEPROM_Media_Access_st_t * pstMediaAccess,
uint16_t u16BlockNum); uint16_t u16BlockNum);
......
...@@ -7,22 +7,22 @@ ...@@ -7,22 +7,22 @@
#define FLASH_DATA_LEN 32 #define FLASH_DATA_LEN 32
#define SECTOR_0_START_ADDR 0x08000000 #define SECTOR_0_START_ADDR 0x08000000UL
#define SECTOR_1_START_ADDR 0x08002000 #define SECTOR_1_START_ADDR 0x08002000UL
#define SECTOR_2_START_ADDR 0x08004000 #define SECTOR_2_START_ADDR 0x08004000UL
#define SECTOR_3_START_ADDR 0x08006000 #define SECTOR_3_START_ADDR 0x08006000UL
#define SECTOR_4_START_ADDR 0x08008000 #define SECTOR_4_START_ADDR 0x08008000UL
#define SECTOR_5_START_ADDR 0x0800A000 #define SECTOR_5_START_ADDR 0x0800A000UL
#define SECTOR_6_START_ADDR 0x0800C000 #define SECTOR_6_START_ADDR 0x0800C000UL
#define SECTOR_7_START_ADDR 0x0800E000 #define SECTOR_7_START_ADDR 0x0800E000UL
#define SECTOR_8_START_ADDR 0x08010000 #define SECTOR_8_START_ADDR 0x08010000UL
#define SECTOR_9_START_ADDR 0x08012000 #define SECTOR_9_START_ADDR 0x08012000UL
#define SECTOR_10_START_ADDR 0x08014000 #define SECTOR_10_START_ADDR 0x08014000UL
#define SECTOR_11_START_ADDR 0x08016000 #define SECTOR_11_START_ADDR 0x08016000UL
#define SECTOR_12_START_ADDR 0x08018000 #define SECTOR_12_START_ADDR 0x08018000UL
#define SECTOR_13_START_ADDR 0x0801A000 #define SECTOR_13_START_ADDR 0x0801A000UL
#define SECTOR_14_START_ADDR 0x0801C000 #define SECTOR_14_START_ADDR 0x0801C000UL
#define SECTOR_15_START_ADDR 0x0801E000 #define SECTOR_15_START_ADDR 0x0801E000UL
typedef struct typedef struct
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment