金牌会员
 
- 积分
- 1260
- 金钱
- 1260
- 注册时间
- 2012-9-1
- 在线时间
- 67 小时
|

楼主 |
发表于 2012-10-10 10:42:07
|
显示全部楼层
unsigned char FAT_Init(void)//Initialize of FAT need initialize SD first
{
bootsector710 *bs = 0; //定义DBR结构体,包含BPB部分(12~90字节是BPB)
bpb710 *bpb = 0; //定义BPB结构体
// partrecord *pr = 0; //定义硬盘信息 结构休 (16字节)
DWORD hidsec1[4]; //隐藏的扇区数即为DBR在物理扇区的偏移量
DWORD hidsec;
u8 a=0;
long long Capacity;
Capacity =(long long)SD_GetSectorCount()*512; //得到SD容量,单位为字节
if(Capacity<0xff)return 1;
if(SD_ReadDisk(fat_buffer,0,1))return 2; //读物理扇区0。即MBR(其中MBR内的硬盘分区表中有DBR的地址信息),如没有MBR,则为DBR。经测试,我的SD卡是有MBR的
if(fat_buffer[0]!=0xEB&&fat_buffer[0]!=0xE9) //如物理0扇区第一字节不为0XEB或0XE9,则存在MBR,否则不存在
{
//printf("此SD卡的物理扇区0为MBR\n");
// pr = (partrecord *)((partsector *)fat_buffer)->psPart;//first partition
// hidsec=pr->prStartLBA; //隐藏的扇区 即DBR的物理扇区偏移
hidsec1[0] = fat_buffer[457]*0x1000000+fat_buffer[456]*0x10000+fat_buffer[455]*0x100+fat_buffer[454];
hidsec1[1] = fat_buffer[473]*0x1000000+fat_buffer[472]*0x10000+fat_buffer[471]*0x100+fat_buffer[470]; // 第一分区
hidsec1[2] = fat_buffer[489]*0x1000000+fat_buffer[488]*0x10000+fat_buffer[487]*0x100+fat_buffer[486];
hidsec1[3] = fat_buffer[505]*0x1000000+fat_buffer[504]*0x10000+fat_buffer[503]*0x100+fat_buffer[502];
do
{
if(SD_ReadDisk(fat_buffer,hidsec1[a],1))return 4;
hidsec=hidsec1[a]; //第1分区物理扇区偏移
if(a>3)return 5;
a++;
}
while(fat_buffer[0]!=0xEB&&fat_buffer[0]!=0xE9);
// hidsec=0x3f; /*我的sd卡需要的 测试用*/
//printf("此SD卡的DBR的物理扇区偏移为=%d\n",hidsec) ;
}
else
{
hidsec=0; //无MBR,物理扇区0即为DBR
//printf("此SD卡不存在MBR,物理扇区0即为DBR,物理扇区0即为逻辑扇区0.\n");
}
if(SD_ReadDisk(fat_buffer,hidsec,1))return 3;
//printf("DBR物理扇区偏移量:%d \n",hidsec);
// printf("开始:\n");
// for(a=0;a<512;a++)printf("%x ",fat_buffer[a]);//打印MBR扇区数据
// printf("结束\n");
bs = (bootsector710 *)fat_buffer;
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; //第一个数据扇区
// printf("每扇区字节数:%d \n",BytesPerSector);
// printf("每簇扇区数:%d \n",SectorsPerClust);
// printf("第一个FAT表扇区:%d \n",FirstFATSector);
// printf("根目录项数:%d \n",RootDirCount);
// printf("根目录占用的扇区数:%d \n",RootDirSectors);
return 0;
} |
|