Files
elec_capture/source/nand/myftl.c

73 lines
1.3 KiB
C
Raw Permalink Normal View History

#include "string.h"
#include "stdlib.h"
#include "debug.h"
#include "stm32h7xx.h"
#include "myftl.h"
//ÿ<><C3BF><EFBFBD><EFBFBD>,<2C><>һ<EFBFBD><D2BB>page<67><65>spare<72><65><>ĸ<EFBFBD><C4B8>ֽڵĺ<DAB5><C4BA><EFBFBD>:
//<2F><>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>,<2C><>ʾ<EFBFBD>ÿ<EFBFBD><C3BF>Ƿ<EFBFBD><C7B7>ǻ<EFBFBD><C7BB><EFBFBD>:0XFF,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;<3B><><EFBFBD><EFBFBD>ֵ,<2C><><EFBFBD><EFBFBD>.
//<2F>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>ֽ<EFBFBD>,<2C><>ʾ<EFBFBD>ÿ<EFBFBD><C3BF>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ù<EFBFBD>:0XFF,û<><C3BB>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;0XCC,д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
//<2F><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5>ĸ<EFBFBD><C4B8>ֽ<EFBFBD>,<2C><>ʾ<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
//ÿ<><C3BF>page,spare<72><65>16<31>ֽ<EFBFBD><D6BD>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD>ֽں<D6BD><DABA><EFBFBD>:
//<2F><>ʮ<EFBFBD><CAAE><EFBFBD>ֽڿ<D6BD>ʼ,<2C><><EFBFBD><EFBFBD>ÿ4<C3BF><34><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ڴ洢һ<E6B4A2><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>С:NAND_ECC_SECTOR_SIZE)<29><>ECCֵ,<2C><><EFBFBD><EFBFBD>ECCУ<43><D0A3>
typedef struct{
nand_if *nand;
uint32_t block_num;
uint16_t page_per_block;
uint16_t block_per_plan;
uint16_t plan_per_nand;
uint32_t block_goodnum;
uint32_t block_badnum;
uint16_t lut[0];
}ftl_def;
static ftl_def *g_self;
int ftl_init(nand_if *n,uint32_t block_num)
{
if(g_self) return -1;
uint32_t size=sizeof(ftl_def)+ block_num*2;
g_self=malloc(size);
if(g_self==0){
DBG_WARN("can not malloc memory");
return -1;
}
memset(g_self,0,size);
g_self->block_num=block_num;
g_self->nand=n;
return g_self->nand->init();
}
int ftl_create_lut(void)
{
ftl_def *s=g_self;
nand_if *n=s->nand;
uint8_t buff[4];
int index_logic;
for(int i=0;i<s->block_num;i++)
{
s->lut[i]=0xffff;
}
s->block_goodnum=0;
for(int i=0;i<s->block_num;i++)
{
n->read_page_spare_area(i/s->block_per_plan,i%s->block_per_plan,0,buff,4);
}
}