OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13789|回复: 2

FAT32文件系统为什么我读不懂你的心?

[复制链接]

12

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2011-8-2
在线时间
0 小时
发表于 2011-9-20 09:02:16 | 显示全部楼层 |阅读模式

unsigned char FAT_Init(void)//Initialize of FAT  need initialize SD first
{      
 bootsector710 *bs  = 0;
 bpb710        *bpb = 0;    
 partrecord    *pr  = 0;

 DWORD hidsec=0;
 u32 Capacity; 
 Capacity = SD_GetCapacity();      
 if(Capacity<0xff)return 1;    
 if(SD_ReadSingleBlock(0,fat_buffer))return 2;
 bs = (bootsector710 *)fat_buffer; 
 pr = (partrecord *)((partsector *)fat_buffer)->psPart;//first partition
 hidsec = pr->prStartLBA;//the hidden sectors
 if(hidsec >= Capacity/512)hidsec = 0; 
 else
 {
  if(SD_ReadSingleBlock(pr->prStartLBA,fat_buffer))return 3;//read the bpb sector
  bs = (bootsector710 *)fat_buffer;
  if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)
  {
   hidsec = 0;
   if(SD_ReadSingleBlock(0,fat_buffer))return 4;//read the bpb sector
   bs = (bootsector710 *)fat_buffer; 
  }
 }  
 if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)return 5;//对付没有bootsect的sd卡 //dead with the card which has no bootsect
 bpb = (bpb710 *)bs->bsBPB;
 if(bpb->bpbFATsecs)//detemine thd FAT type  //do not support FAT12
 {
  FAT32_Enable=0; //FAT16
  FATsectors   = bpb->bpbFATsecs;//FAT表占用的扇区数
  FirstDirClust = 2;
 }
 else
 {
  FAT32_Enable=1; //FAT32
  FATsectors   = bpb->bpbBigFATsecs;//FAT占用的扇区数
  FirstDirClust = bpb->bpbRootClust;
 }

 BytesPerSector = bpb->bpbBytesPerSec;      //每扇区字节数
 SectorsPerClust = (BYTE)bpb->bpbSecPerClust;//每簇扇区数
 FirstFATSector = bpb->bpbResSectors+hidsec;//第一个FAT表扇区
 RootDirCount = bpb->bpbRootDirEnts;  //根目录项数
 RootDirSectors = (RootDirCount*32)>>9;  //根目录占用的扇区数
 FirstDirSector = FirstFATSector+bpb->bpbFATs*FATsectors;//第一个目录扇区
 FirstDataSector = FirstDirSector+RootDirSectors;//第一个数据扇区
 return 0;

原子哥和各位武林高手打扰了,最近在学习你的FAT32文件系统,有史以来的难啊,好多句子着实读不懂,望原子哥解惑一下,感激不尽,我简单的解释一下我对初始化的理解“是将FAT32的文件格式拷贝到SD卡里面”,对吗?
bootsector710 *bs  = 0;   这个定义是不是定义一个指向数据结构bootsector710的结构体指针*bs?
 bs = (bootsector710 *)fat_buffer; 这个语句的意思是结构体bootsector710 的指针bs指向数据缓存区?可不可以直接写为bs=fat_buffer?
 pr = (partrecord *)((partsector *)fat_buffer)->psPart;//first partition这个句子怎么解释呢?
 if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)return 5;//对付没有bootsect的sd卡 //dead with the card which has no bootsect
这个句子我觉得是 if(bs->bsJump[0]=0xE9 && bs->bsJump[0]=0xEB)return 5;是判断当前扇区是不是DBR所在的分区,如果是,当前扇区为DBR分区,如果不是,当前扇区为MBR分区,对吗?
 bpb = (bpb710 *)bs->bsBPB;这个句子怎么解释呢?
期望原子哥和各位爱心人士的回答,如果我的问题太简单,请不要见笑,我是菜鸟。那位高人要是系统的解释一下这个初始化函数,那再好不过了,先致谢了。





 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-9-20 09:22:25 | 显示全部楼层

1,原子哥和各位武林高手打扰了,最近在学习你的FAT32文件系统,有史以来的难啊,好多句子着实读不懂,望原子哥解惑一下,感激不尽,我简单的解释一下我对初始化的理解“是将FAT32的文件格式拷贝到SD卡里面”,对吗?
初始化?SD卡的初始化是将SD卡切换为SPI模式.而FAT的初始化,则是得到FAT的一些必要信息.比如文件系统的类型(FAT12/FAT16/FAT32等),根目录的地址,fat表等.
拷贝那是操作上的事情了.

2,bootsector710 *bs  = 0;   这个定义是不是定义一个指向数据结构bootsector710的结构体指针*bs?
  就是定义一个bootsector710类型的指针.

3,bs = (bootsector710 *)fat_buffer; 这个语句的意思是结构体bootsector710 的指针bs指向数据缓存区?可不可以直接写为bs=fat_buffer?
这句话的意思是强制将fat_buffer的数据按顺序转换为bootsector710结构体数据,然后bs指向这些数据,相当于一次赋值给了bs的各成员.
不能写成bs=fat_buffer.

4,pr = (partrecord *)((partsector *)fat_buffer)->psPart;//first partition这个句子怎么解释呢?
将fat_buffer的内容先强制转换为partsector类型的数据,然后将partsector ->psPart的数据强制转换为partrecord 类型的数据,然后pr指针指向它.

5,if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)return 5;//对付没有bootsect的sd卡 //dead with the card which has no bootsect
这个句子我觉得是 if(bs->bsJump[0]=0xE9 && bs->bsJump[0]=0xEB)return 5;是判断当前扇区是不是DBR所在的分区,如果是,当前扇区为DBR分区,如果不是,当前扇区为MBR分区,对吗?

这个看资料就可以了.

6,bpb = (bpb710 *)bs->bsBPB;这个句子怎么解释呢?
参考第4个问题.
 

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2011-8-2
在线时间
0 小时
 楼主| 发表于 2011-9-20 09:34:48 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子哥的热心回答,听原子哥一说,“如拨云雾而见青天”,豁然开朗啊,再次致谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 04:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表