求助FATFS文件系统中正点原子提供FTL转化层算法

2019-07-21 01:04发布

最近在学习正点原子提供的FATFS文件系统,在针对NAND FLASH设备,正点原子提供了FTL层使它能兼容FAT文件系统,但正点原子没有提供关于FTL较为详细的资料!大家有关于FTL详细的文档或自己的见解吗?正点原子提供的FTL用的算法均衡摩擦算法是什么?有没有垃圾回收?坏块管理?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
26条回答
fskofcpu
1楼-- · 2019-07-22 00:02
正点原子 发表于 2018-12-8 01:28
多看几遍。
第一次写的时候,根本就没有数据,全部是0XFF,读出来ECC校验值的位置,也是0XFFF
自然就有 ...

原子哥,我上面3、4楼的问题能帮我看看是什么问题吗
fskofcpu
2楼-- · 2019-07-22 04:09
正点原子 发表于 2018-12-8 01:28
多看几遍。
第一次写的时候,根本就没有数据,全部是0XFF,读出来ECC校验值的位置,也是0XFFF
自然就有 ...

串口发上来调试信息:
bad block index:2440
bad block index:3940
total block num:4096
good block num:4094
valid block num:3807
bad block index:2440
bad block index:3940
total block num:4096
good block num:4094
valid block num:3807
err hd,rd:0xff9a5999,0xff96a69a
eccnum,eccstart:1,0
PageNum,ColNum:261888,0
2bit ecc error or more
err hd,rd:0xffaaa599,0xffaaa6a5
eccnum,eccstart:1,1
PageNum,ColNum:261888,512
2bit ecc error or more
容量
disk total volume:950 MB
disk valid volume:950 MB
扫描到文件
err hd,rd:0xff9966a5,0xbedede4c
eccnum,eccstart:1,0
PageNum,ColNum:262002,0
2bit ecc error or more
1:/0
1:/1
1:/2
1:/3
读文件0:
Read file data is:
err hd,rd:0xff033cc0,0xf7ff9e4c
eccnum,eccstart:1,0
PageNum,ColNum:262003,0
2bit ecc error or more
0031   0032   0033   0034   0035   0036   0037   0038   0039   0000   
Readed data len:10
Read data over
读文件3:
Read file data is:
err hd,rd:0xffffffff,0x00
eccnum,eccstart:1,0
PageNum,ColNum:262004,0
2bit ecc error or more
0000   0001   0002   0003   0004   0005   0006   0007   0008   0009   
000A   000B   000C   000D   000E   000F   0010   0011   0012   0013   0014   0015   0016   0017   0018   0019   001A   001B   001C   001D   001E   001F   0020   0021   0022   0023   0024   002…………后面还有很多数据,但每512字节就有>2bit的ECC错误

下面是测试函数:

FTL_Init();
        fatfs_init();
        res=f_mount(fs[1],"1:",1); //挂载NAND FLASH.
                if(res==0X0D)//NAND FLASH磁盘,FAT文件系统错误,重新格式化NAND FLASH
                {
                        printf("%s ","NAND Disk Formatting...");//格式化NAND
                        res=f_mkfs("1:",1,4096);//格式化FLASH,2,盘符;1,不需要引导区,8个扇区为1个簇
                        if(res==0)
                        {
                                f_setlabel((const TCHAR *)"0:NANDDISK");        //设置Flash磁盘的名字为:NANDDISK
                                printf("%s ","NAND Disk Format Finish");                //格式化完成
                        }else printf("%s ","NAND Disk Format Error ");        //格式化失败
                        delay_200ns();delay_200ns();delay_200ns();delay_200ns();delay_200ns();delay_200ns();
                }
        DELAY_US(1000000L);

        //fatfs_unlink((u8*)"1:/3");

        fatfs_showfree((u8*)"1:");//显示剩余容量
        fatfs_scan_files((u8*)"1:");//遍历文件

        fatfs_open((u8*)"1:/1",0x01);//打开、读取文件
        fatfs_read(10);
        fatfs_close();
        fatfs_open((u8*)"1:/3",0x01);
        fatfs_size();
        fatfs_read(8192);
        fatfs_close();
fskofcpu
3楼-- · 2019-07-22 06:55
正点原子 发表于 2018-12-8 01:28
多看几遍。
第一次写的时候,根本就没有数据,全部是0XFF,读出来ECC校验值的位置,也是0XFFF
自然就有 ...

串口发上来调试信息:
bad block index:2440
bad block index:3940
total block num:4096
good block num:4094
valid block num:3807
bad block index:2440
bad block index:3940
total block num:4096
good block num:4094
valid block num:3807
err hd,rd:0xff9a5999,0xff96a69a
eccnum,eccstart:1,0
PageNum,ColNum:261888,0
2bit ecc error or more
err hd,rd:0xffaaa599,0xffaaa6a5
eccnum,eccstart:1,1
PageNum,ColNum:261888,512
2bit ecc error or more
容量
disk total volume:950 MB
disk valid volume:950 MB
扫描到文件
err hd,rd:0xff9966a5,0xbedede4c
eccnum,eccstart:1,0
PageNum,ColNum:262002,0
2bit ecc error or more
1:/0
1:/1
1:/2
1:/3
读文件0:
Read file data is:
err hd,rd:0xff033cc0,0xf7ff9e4c
eccnum,eccstart:1,0
PageNum,ColNum:262003,0
2bit ecc error or more
0031   0032   0033   0034   0035   0036   0037   0038   0039   0000   
Readed data len:10
Read data over
读文件3:
Read file data is:
err hd,rd:0xffffffff,0x00
eccnum,eccstart:1,0
PageNum,ColNum:262004,0
2bit ecc error or more
0000   0001   0002   0003   0004   0005   0006   0007   0008   0009   
000A   000B   000C   000D   000E   000F   0010   0011   0012   0013   0014   0015   0016   0017   0018   0019   001A   001B   001C   001D   001E   001F   0020   0021   0022   0023   0024   002…………后面还有很多数据,但每512字节就有>2bit的ECC错误

下面是测试函数:
        FTL_Init();
        fatfs_init();
        res=f_mount(fs[1],"1:",1); //挂载NAND FLASH.
                if(res==0X0D)//NAND FLASH磁盘,FAT文件系统错误,重新格式化NAND FLASH
                {
                        printf("%s ","NAND Disk Formatting...");//格式化NAND
                        res=f_mkfs("1:",1,4096);//格式化FLASH,2,盘符;1,不需要引导区,8个扇区为1个簇
                        if(res==0)
                        {
                                f_setlabel((const TCHAR *)"0:NANDDISK");        //设置Flash磁盘的名字为:NANDDISK
                                printf("%s ","NAND Disk Format Finish");                //格式化完成
                        }else printf("%s ","NAND Disk Format Error ");        //格式化失败
                        delay_200ns();delay_200ns();delay_200ns();delay_200ns();delay_200ns();delay_200ns();
                }
        DELAY_US(1000000L);

        //fatfs_unlink((u8*)"1:/3");

        fatfs_showfree((u8*)"1:");//显示剩余容量
        fatfs_scan_files((u8*)"1:");//遍历文件

        fatfs_open((u8*)"1:/0",0x01);//打开、读取文件
        fatfs_read(10);
        fatfs_close();
        fatfs_open((u8*)"1:/3",0x01);
        fatfs_size();
        fatfs_read(8192);
        fatfs_close();
fskofcpu
4楼-- · 2019-07-22 07:06
正点原子 发表于 2018-12-8 01:28
多看几遍。
第一次写的时候,根本就没有数据,全部是0XFF,读出来ECC校验值的位置,也是0XFFF
自然就有 ...

原子哥,麻烦你看一下我的问题,谢谢!
正点原子
5楼-- · 2019-07-22 12:05
 精彩回答 2  元偷偷看……
fskofcpu
6楼-- · 2019-07-22 14:31
正点原子 发表于 2018-12-12 01:26
没看明白你问题是什么?
你直接用我们例程,可以操作么?

现在我有疑问的几点如下:
1、底层驱动中规定:大于512字节进行ECC校验,小于512字节不进行ECC校验,但是在读写时我看代码都是以512字节(扇区大小)为单位,根本没有区分写入字节到底是多少:因为diskio.c文件中disk_read和disk_write分别调用的FTL函数为:FTL_ReadSectors(buff,sector,512,count);//读取数据FTL_WriteSectors((u8*)buff,sector,512,count);//写入数据。单位都是512而不是我们要写入读取的字节数。

2、在diskio.c文件中的disk_ioctl函数中获取nand参数:在case  GET_BLOCK_SIZE  等于 nand_dev.page_mainsize/512;//block大小,定义成一个page的大小。明明要定义成一个page大小为什么还要除以512.

3、您实现的坏块管理和均衡摩擦主要是通过保留区实现的。剩下百分之七的块作为保留区,提供坏块替换的块和plane内复制时的替换块,后者擦除成功后可以继续留在保留区使用不成功丢弃为坏块,如此循环往复。我这样理解对吗?

4、我现在遇到的问题就是,如上面我贴出的代码(串口返回的信息):无论我进行何种操作:比如打开文件、写入文件,读取数据(每读取512字节,好像缓存只有这么大)都会返回一个>2bit的ECC校验错误。

一周热门 更多>