#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;iblock_num;i++) { s->lut[i]=0xffff; } s->block_goodnum=0; for(int i=0;iblock_num;i++) { n->read_page_spare_area(i/s->block_per_plan,i%s->block_per_plan,0,buff,4); } }