?? fat.c
字號:
/************************************************************/
/* SD Code for AT91SAM7S64 */
/* By pasyong */
/* 2006-5 */
/* Base IAR 4.30A */
/************************************************************/
#include <string.h>
#include "sd.h"
#include "fat.h"
#include "uart.h"
#include "3310.h"
extern uchar BUFFER[512];
unsigned char LONGNAME_BUFFER_ADDR[30];
unsigned char DIRNAME_BUFFER_ADDR[30];
unsigned char *LongNameBuffer = (unsigned char *) LONGNAME_BUFFER_ADDR;
unsigned char *DirNameBuffer = (unsigned char *) DIRNAME_BUFFER_ADDR;
struct partrecord *PartInfo;
unsigned char Fat32Enabled;
unsigned long FirstDataSector;
unsigned int BytesPerSector;
unsigned int SectorsPerCluster;
unsigned long FirstFATSector;
unsigned long FirstDirSector;
unsigned long FileSize;
unsigned long FatInCache = 0;
//********************************************************************************************
//讀一個扇區
void ReadBlock(unsigned long LBA)
//********************************************************************************************
{ unsigned long temp;
temp=LBA<<9;
SD_Read_Block(temp);
}
/*-----------------------------------------------------------------------
查詢數據區一個簇開始扇區號
-----------------------------------------------------------------------*/
unsigned long fatClustToSect(unsigned long clust)
{
return ((clust-2) * SectorsPerCluster) + FirstDataSector;
}
/*-----------------------------------------------------------------------
查詢一個簇所占扇區數
-----------------------------------------------------------------------*/
unsigned int fatClusterSize(void)
{
// return the number of sectors in a disk cluster
return SectorsPerCluster;
}
/*-----------------------------------------------------------------------
查詢SD卡文件系統信息
-----------------------------------------------------------------------*/
unsigned char fatInit()
{ unsigned int data;unsigned char t1,t2;
unsigned char PartType;
unsigned long StartLBA,FATsecs,Size;
//struct bpb710 *bpb;
// 讀MBR結構
ReadBlock(0);
// 讀取分區表信息
//PartInfo = ((struct partrecord *) ((struct partsector *)BUFFER)->psPart);
// 讀引導扇區
// 引導扇區號在PartInfo.prStartLBA中
PartType=BUFFER[450];
Size=BUFFER[458]+(BUFFER[459]<<8)+(BUFFER[460]<<16)+(BUFFER[461]<<24);
StartLBA=BUFFER[454]+(BUFFER[455]<<8)+(BUFFER[456]<<16)+(BUFFER[457]<<24);
ReadBlock(StartLBA); //FAT32時是99號扇區
//bpb = (struct bpb710 *) ((struct bootsector710 *) BUFFER)->bsBPB;
FirstDataSector=StartLBA; //FirstDataSector = PartInfo->prStartLBA;
FATsecs=BUFFER[22]+(BUFFER[23]<<8);//bpb->bpbFATsecs
if(FATsecs)//bpb->bpbFATsecs
{
// bpbFATsecs非0,為FAT16,FAT表所占的扇區數在bpbFATsecs里
FirstDataSector += BUFFER[14]+(BUFFER[15]<<8)+BUFFER[16]*FATsecs;
//FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbFATsecs;
}
else
{
// bpbFATsecs是0,為FAT32,FAT表所占的扇區數在bpbBigFATsecs里
FirstDataSector += BUFFER[14]+(BUFFER[15]<<8)+BUFFER[16]*(BUFFER[36]+(BUFFER[37]<<8)+(BUFFER[38]<<16)+(BUFFER[39]<<24));
//FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbBigFATsecs;
}
SectorsPerCluster =BUFFER[13]; //bpb->bpbSecPerClust;
BytesPerSector =BUFFER[11]+(BUFFER[12]<<8); //bpb->bpbBytesPerSec;
FirstFATSector =BUFFER[14]+(BUFFER[15]<<8)+StartLBA; //bpb->bpbResSectors + PartInfo->prStartLBA;
//查詢SD卡文件系統分區類型
switch (PartType)//PartInfo->prPartType
{
case PART_TYPE_DOSFAT16:
case PART_TYPE_FAT16:
case PART_TYPE_FAT16LBA:
// 第一個目錄扇區號為2
FirstDirSector = CLUST_FIRST;
//FirstDataSector += (bpb->bpbRootDirEnts)/DIRENTRIES_PER_SECTOR;
Fat32Enabled = 0;
break;
case PART_TYPE_FAT32LBA:
case PART_TYPE_FAT32:
FirstDirSector =BUFFER[44]+(BUFFER[45]<<8)+(BUFFER[46]<<16)+(BUFFER[47]<<24); //bpb->bpbRootClust;
Fat32Enabled = 1;
break;
default:break;
//return 1;
}
//查詢SD卡文件系統信息
switch (PartType)
{
case PART_TYPE_DOSFAT16:
LCD_write_english_string(0,0,"DOSFAT 16");
break;
case PART_TYPE_FAT16:
LCD_write_english_string(0,0,"FAT16 ");
break;
case PART_TYPE_FAT16LBA:
LCD_write_english_string(0,0,"FAT16 LBA");
break;
case PART_TYPE_FAT32LBA:
LCD_write_english_string(0,0,"FAT32 LBA");
break;
case PART_TYPE_FAT32:
LCD_write_english_string(0,0,"FAT32");
break;
default:
LCD_write_english_string(0,0,"No Partition!");
break;
}
//顯示磁盤容量
data=Size>>11;
LCD_set_XY(56,0);
t1=data/100;
LCD_write_char(t1+48);
data=data%100;
t1=data/10;
LCD_write_char(t1+48);
t2=data%10;
LCD_write_char(t2+48);
LCD_write_english_string(76,0,"M");
LCD_write_english_string(0,1,"RATE");
return 0;
}
/*-----------------------------------------------------------------------
查詢一個文件的開始簇
-----------------------------------------------------------------------*/
unsigned long fatGetDirEntry(unsigned char entry)
{
unsigned char offentry,offsetsector,n;
unsigned long temp;
offsetsector=entry/16;
offentry=entry%16;
// read dir data
ReadBlock(fatClustToSect(FirstDirSector)+offsetsector);
//for( w=0;w<512;w++)
//putchar(BUFFER[w]);
n=offentry*32;
temp=((unsigned long)BUFFER[26+n])+((unsigned long)BUFFER[27+n]<<8) +((unsigned long)BUFFER[20+n] << 16)+((unsigned long)BUFFER[21+n]<<24);
//文件的起始簇地址
if((BUFFER[0+n] == 0x00)||(BUFFER[0+n] == 0xE5))
return 0;
else
return temp;
}
/*-----------------------------------------------------------------------
在FAT表中查詢下一個簇所在扇區號
-----------------------------------------------------------------------*/
unsigned long fatNextCluster(unsigned long cluster)
{
unsigned long nextCluster;
unsigned long fatMask;
unsigned long fatOffset;
unsigned long sector;
unsigned int offset;
if(Fat32Enabled)
{
// 一個表項為4bytes(32 bits)
fatOffset = cluster << 2;
// 設置 FAT32 bit mask
fatMask = FAT32_MASK;
}
else
{
// 一個表項為2bytes(16 bits)
fatOffset = cluster << 1;
// 設置 FAT16 bit mask
fatMask = FAT16_MASK;
}
//計算FAT扇區號
sector = FirstFATSector + (fatOffset / BytesPerSector);
//計算FAT扇區號中表項的偏移地址
offset = fatOffset % BytesPerSector;
ReadBlock(sector);
// 讀取下一個簇號
nextCluster = (*((unsigned long*) &((char*)BUFFER)[offset])) & fatMask;
// 是否文件的結束簇
if (nextCluster == (CLUST_EOFE & fatMask))
nextCluster = 0;
return nextCluster;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -