|
本帖最后由 wdluo 于 2012-8-27 00:19 编辑
今天用S3C2440调试裸机的SD卡驱动,移植FATFS R0.9版本的文件系统,移植完毕后发现一个问题,这个程序读写2G的SD卡完全没问题,但是当我使用4G的金士顿SD卡的时候程序提示找不到文件系统,于是我单步调试到ff.c文件里面的check_fs()函数,该函数源码如下:- /*-----------------------------------------------------------------------*/
- /* Load a sector and check if it is an FAT Volume Boot Record */
- /*-----------------------------------------------------------------------*/
- static
- BYTE check_fs ( /* 0:FAT-VBR, 1:Valid BR but not 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;
- }
复制代码 在该函数里我单步运行,第一个和第二个if语句都没有问题,也就是说第0扇区的数据读取和扇区分区结束标志检查都是正确的,但是文件系统的类型检查失败,也就是找不到“FAT”这个字符串,首先我怀疑是文件系统的问题,于是将SD卡取出并在电脑上格式化后在读取,结果都是一样的,诡异的是电脑能正确识别SD卡,说明SD卡上的文件系统是有的,于是我就Google,后来找到了一篇关于SD分区的介绍,简单的说就是4G的SD卡有MBR分区的问题,第0扇区的数据不是文件系统的数据,而是MBR数据,根据网上的介绍,说在物理扇区0的0X1C6处会存储保留扇区数的数据,于是我用HxD_Hex_Editor软件查看扇区0的数据发现数据不对,下面是我用HxD_Hex_Editor查看我SD卡扇区0的数据:
由这个第0扇区的数据发现在0x1C6这里的数据为0,理论上说就是没有保留扇区,物理扇区和逻辑扇区应该是重合的,但实际上并不是这样子,在第0扇区里面没有文件系统的相关数据,比如
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;
这两条语句就检查不到文件系统,但是电脑能识别SD卡,说明SD的文件系统一定是存在的,但具体在哪里呢?我用这个软件的搜索功能搜索“FAT”字符串,结果在第63扇区找到了这个字符串,也就是真正的文件系统,如下图所示:
分析这个数据发现这才是我们真正需要的数据,而且数据也是正确的,所以现在的问题是如何让程序能自动识别这个逻辑分区。
首先我用一个最笨的方法,那就是在diskio.c文件里面的读写SD卡函数里面将扇区参数直接加上63,这样就实现了63个扇区的偏移,改写后的程序如下:- DRESULT disk_read (
- BYTE drv, /* Physical drive nmuber (0..),only 0 implemented */
- BYTE *buff, /* Data buffer to store read data */
- DWORD sector, /* Sector address (LBA) */
- BYTE count /* Number of sectors to read (1..255) */
- )
- {
- DRESULT res;
- if ((drv!=0) || (buff==0)) return RES_PARERR;//more check needed
- if(count<2)
- res=Read_One_Block(sector+63,buff);
- else
- {
- res=Read_Mult_Block(sector+63,count,buff);
- }
- if(res)
- return RES_OK;
- else
- return RES_ERROR;
- }
复制代码 写函数也做相同的处理,编译程序,下载运行...
正确了!!文件读写正确了!!运行效果如下图:
看来确实是那个MBR的问题,现在的疑问是为什么在0x1C6那里没有扇区偏移的数据?难道是存储在其他地方的?还有就是,就算是找到了这个数据的存储地址,那文件系统该如何处理?FATFS是否可以自动处理?这就等到我下一步的调试结果吧。
上传一个查看磁盘数据的软件:
HxD_Hex_Editor_CHS_1[1].7.7.0.rar
(852.95 KB, 下载次数: 89)
|
|