在pc机上移植fatfs文件系统(windows/linux) (二)
2011-07-06 09:33
946 查看
赶早继续~
每个扇区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
每个扇区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
相关文章推荐
- 在pc机上移植fatfs文件系统(windows/linux) (一)
- 在pc机上移植fatfs文件系统(windows/linux) (一)
- PC机上移植FatFs文件系统
- 180210 双系统模式下Windows访问Linux系统下的文件
- Linux、Windows直接操作android系统文件
- windows挂载linux网络文件系统NFS
- 移植linux3.4.2以及文件系统制作笔记
- Linux3.5.2内核移植与文件系统制作
- 使用WinSCP在Windows和Linux系统之间传输文件
- 【移植Linux 3.4.2内核之四】修改内核代码支持YAFFS文件系统
- FATfs文件系统移植-文件更改记录
- Linux-2.6.32.2内核在mini2440上的移植---根文件系统制作(1)
- Windows与Linux系统下的库文件介绍
- 转一篇比较详细介绍FatFs文件系统移植的文章 FatFs文件系统的移植
- linux 内核移植和根文件系统的制作
- 基于STM32F407的FatFs文件系统在SD卡驱动上的移植
- Linux 文件系统类型 文件系统结构 与Windows文件系统的比较
- Windows下查看Linux的ext4文件系统
- 烂泥:Linux系统与windows系统文件同步
- 如何在linux系统下挂接(mount)光盘镜像文件、移动硬盘、U盘以及Windows网络共享和UNIX