Files
elec_capture/source/nand/myftl.c

73 lines
1.3 KiB
C

#include "string.h"
#include "stdlib.h"
#include "debug.h"
#include "stm32h7xx.h"
#include "myftl.h"
//每个块,第一个page的spare区,前四个字节的含义:
//第一个字节,表示该块是否是坏块:0XFF,正常块;其他值,坏块.
//第二个字节,表示该块是否被用过:0XFF,没有写过数据;0XCC,写过数据了.
//第三和第四个字节,表示该块所属的逻辑块编号.
//每个page,spare区16字节以后的字节含义:
//第十六字节开始,后续每4个字节用于存储一个扇区(大小:NAND_ECC_SECTOR_SIZE)的ECC值,用于ECC校验
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);
}
}