`
datoplay
  • 浏览: 1605620 次
文章分类
社区版块
存档分类
最新评论

在pc机上移植fatfs文件系统(windows/linux) (二)

 
阅读更多

赶早继续~

每个扇区512字节,我创建一个2M的文件。开始的时候我不知道一个簇几个扇区,后来调试程序的时候才看到内部数组,一个簇2个扇区。我是模拟NAND FLASH。一个page512字节,每个块有32个page,2M的文件有了128个块。文件的第一块用来作为系统块。所以扇区大小要扣除系统块。

写完diskio.c,就开始写测试代码。

首先必须创建一个文件,并赋予一定大小。我是通过读写来测试的。

1、调用f_mount函数。 一般挂载不会出现什么问题。

2、开始的时候我没调用f_mkfs(0,0,0),直接打开文件。打开文件会一直失败。

3、深入研究下fopen。fatfs文件系统有对象的概念。chk_mounted用来检查文件系统对象是否有效。调试遇到的问题就卡在fmt = check_fs(fs, bsect = 0);/* Check sector 0 if it is a VBR */。 该函数是用来加载引导记录并且检测是否为FAT映射表(应该是这个意思)。

static
BYTE check_fs ( /* 0:The FAT BR, 1:Valid BR but not an FAT, 2:Not a BR, 3:Disk error */
FATFS *fs, /* File system object */
DWORD sect /* Sector# (lba) to check if it is an FAT boot record or not */
)
{
if (disk_read(fs->drv, fs->win, sect, 1) != RES_OK)/* Load boot record */
return 3;
if (LD_WORD(&fs->win[BS_55AA]) != 0xAA55)/* Check record signature (always placed at offset 510 even if the sector size is >512) */
return 2;


if ((LD_DWORD(&fs->win[BS_FilSysType]) & 0xFFFFFF) == 0x544146)/* Check "FAT" string */
return 0;
if ((LD_DWORD(&fs->win[BS_FilSysType32]) & 0xFFFFFF) == 0x544146)
return 0;


return 1;
}

先来说说return 3的2种场景吧:

1)、创建一个空文件,没有赋予大小,没有格式化

2)、后来听老大说,可以创建一个img文件。就自己去网上找了相关资料。成功的创建了一个FAT12/16 的2M大小img文件。经测试,执行fopen成功。但是fwrite和fread是失败的。我自己考虑了下,应该是文件操作不能直接对img文件进行读写。

如果是return 2,那么就是你没有格式化文件。


上图为测试结果。

测试结果我直接用UE工具打开载体文件。


在0x00010000H处有数据进入。

fat文件系统分区解读,查看链接:http://199818.blog.51cto.com/189818/32679

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics