现在的位置: 首页 > 综合 > 正文

关于chaN写的fatfs disk驱动

2019年03月23日 ⁄ 综合 ⁄ 共 1318字 ⁄ 字号 评论关闭

他的fatfs下载网页:http://elm-chan.org/

没有完整理清过程,以下是论坛提到的几点:

1.chaN的驱动是针对sd,ata,usb,nand的,不单单是sd。
2.有的SD没有MBR(即0扇区就是DBR)有的有。
这好像跟SD1.0 2.0版本有关:
在一些SD1.0中,物理0扇区就是逻辑0扇区,0扇区就是DBR,没有MBR,这种情况也就不存在分区,第一个fmt = check_fs(fs, bsect = 0);会返回0,因为check_fs里的第三个或第四个if判断会检测到DBR里面的FAT系统标识字符串,其中一个会返回0,fmt=0,fmt = check_fs(fs, bsect);就不会执行了 
********************************************* 
if (disk_read(fs->drive, 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; 
************************************************ 

而在一些有MBR的sd卡中物理0扇区是MBR,mbr里有DBR的偏移信息,执行fmt = check_fs(fs, bsect = 0);的时候,第一个和第二个if会通过,但是mbr里面没有fat标识字符串,所以第三个和第四个if不会过,返回1,fmt=1就会执行fmt = check_fs(fs, bsect);其中bsect是从mbr里读出来的逻辑0扇区偏移量,既DBR所在扇区,这次执行就同上面读DBR一样,会再第三个或第三个if返回0.
以下是关于ATA硬盘的:
而PC硬盘ata的MBR就在0扇区。
我们重装PC的时候硬盘是可以选择NTFS和FAT等格式。
在有MBR的前提下,就有DPT,紧接MBR引导代码是DPT和“55AA”,DBR是在偏移X扇区里,X就是代码的tbl[8]的双字(4字节),也就是DPT的OFFSET 8~11。
假设有4分区,那么只要第一次检查0扇区是不是DBR,如果不是就检查第二次(只需检查1次即可,无需检查多次,目的是验证是否是FAT),检查偏移X扇区。
执行check_fs(fs, bsect);后返回0,则说明第4分区DBR就在X扇区,验证成功,返回!0则错误。

抱歉!评论已关闭.