OpenEdv-开源电子网

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

如何理解 DWORD prStartLBA; //相对扇区数,也就是从这里到逻辑扇区0的偏移(以扇区为单位) 的含义

[复制链接]

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2011-5-4
在线时间
0 小时
发表于 2011-8-18 17:44:04 | 显示全部楼层 |阅读模式

汉字显示实验时,在  fat.h中 有如下定义

//使用packed 以字节分配.避免数据对齐的问题
//硬盘分区表,每个分区占用16个字节,64个字节支持最大4个分区
//在SD卡上一般使用的是一个,也就是第一个分区.
typedef __packed struct  // length 16 bytes
{   
 BYTE prIsActive;     //0x80 表明该分区是否是活动分区
 BYTE prStartHead; //开始磁头
 WORD prStartCylSect; //开始扇区(低6位)和开始柱面(高10位)
 BYTE prPartType;  //系统ID
 BYTE prEndHead;  //结束磁头
 WORD prEndCylSect; //结束扇区和结束柱面
 DWORD prStartLBA;  //相对扇区数,也就是从这里到逻辑扇区0的偏移(以扇区为单位)
 DWORD prSize;   //总扇区数
}partrecord; 

而在Fat.c中有如下函数
//FAT初始化,不含SD的初始化,用之前应先调用sd的初始化
//返回值:0,初始化成功
//    其他,初始化失败  
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;
}

,请问,如何理解上面函数中红色字体的代码

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

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2011-5-4
在线时间
0 小时
 楼主| 发表于 2011-8-18 17:46:14 | 显示全部楼层
我用4G的 SD卡中,用winHEX 软件查看内容时,发现其值 为  2E616964,不知怎么理解 
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-8-18 18:01:10 | 显示全部楼层
回复【2楼】longzhsh:
---------------------------------
文件系统中,有个隐藏扇区的概念.你可以去看一下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 20:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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