73 lines
1.3 KiB
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);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|