http://webcache.googleusercontent.com/search?q=cache:http://read.pudn.com/downloads167/ebook/768493/lpc2136/fat/fat.c__.htm
www.pudn.com > 317676632136tft.rar > fat.c, change:2008-06-20,size:10191b
#include "fat.h" INT8U fname[20][8]; INT8U fext[20][3]; INT32U fclust[20]; INT8U fcount; INT32U fsize[20]; INT32U NextCluster; //指向当前正在读取文件的簇号 INT32U SectorIndex=0; //正在读扇区 //////////////////////////////////////////////////////////////////////////////// //磁盘分区信息 //////////////////////////////////////////////////////////////////////////////// INT8U Partition_Active; // 0x80代表该分区为缺省分区 INT8U Partition_StartHead; // 该分区入口的磁头地址 INT16U Partition_StartCylSect; // 该分区入口的扇区地址和柱面地址 INT8U Partition_PartType; // 该分区类型 INT8U Partition_EndHead; // 该分区结束的扇区地址 INT16U Partition_EndCylSect; // 该分区结束的柱面地址 INT32U Partition_StartLBA; // 该分区内第一个扇区地址 INT32U Partition_Size; // 该分区所包含的扇区总数 //////////////////////////////////////////////////////////////////////////////// //fat32 BPB结构,包括扩展BPB //////////////////////////////////////////////////////////////////////////////// INT8U BS_jmpBoot[3]; //jmp code INT8U BS_OEMName[8]; //oem and os like dos5.0 INT16U BPB_BytesPerSec; //扇区字节数 INT8U BPB_SecPerClus; //每簇扇区数 INT16U BPB_RsvdSecCnt; //保留扇区数 INT8U BPB_NumFATs; //FAT数目 INT16U BPB_RootEntCnt; //根目录项数 0 INT16U BPB_TotSec16; //小扇区总数 0 INT8U BPB_Media; //媒体描述符 INT16U BPB_FATSz16; //每FAT扇区数fat32不用为0 INT16U BPB_SecPerTrk; //每道扇区数 INT16U BPB_NumHeads; //磁头数 INT32U BPB_HiddSec; //隐藏扇区数 INT32U BPB_TotSec32; //总扇区数 INT32U BPB_FATSz32; //每FAT扇区数fat32 INT16U BPB_ExtFlags; //fat32扩展标志 INT16U BPB_FSVer; //fat32特有,高位为fat32的主版本号,底位为次版本号 INT32U BPB_RootClus; //根目录簇号 INT16U BPB_FSInfo; //文件系统信息扇区号 INT16U BPB_BKBootSec; //引导扇区备份号 INT8U BPB_Reserved[12]; //保留空间 INT8U BS_drvNum; //物理驱动器号 INT8U BS_Reservd1; //保留 INT8U BS_BootSig; //扩展引导标签 INT32U BS_VolID; //分区序号 INT8U BS_VolLab[11]; //卷标 INT8U BS_FilSysType[8]; //系统ID //////////////////////////////////////////////////////////////////////////////// //目录信息 //////////////////////////////////////////////////////////////////////////////// INT8U deName[8]; INT8U deExtension[3]; INT32U Clust; //当前目录的簇号 INT16U Nums; //仅FAT12—FAT16中的根目录区有效 INT32U Index; //当前的BLOCK中目录项索引 INT32U FileSize; //文件长度 //////////////////////////////////////////////////////////////////////////////// //文件信息 //////////////////////////////////////////////////////////////////////////////// INT8U DIR_Name[11]; //文件名,没有. INT8U DIR_Attr; //文件属性,自低至高,只读、隐藏、系统、卷标、子目录、归档 INT8U DIR_NTRes; //系统保留 INT8U DIR_CrtTimeTenth; //创建时间的10毫秒位 INT16U DIR_CrtTime; //创建时间 INT16U DIR_CrtDate; //创建日期 INT16U DIR_LastAccDate; //最后访问日期 INT16U DIR_FstClusHI; //文件起始簇号高16位 INT16U DIR_WrtTime; //最近修改时间 INT16U DIR_WrtDate; //最近修改日期 INT16U DIR_FstClusLO; //文件起始簇号的低16位 INT32U DIR_FileSize; //文件长度 //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// INT32U FAT1Sec; //FAT1表的位置 INT32U FAT2Sec; INT32U FirstDataSector; //第一个根目录位置,区号为2 INT32U FirstDirSector; //////////////////////////////////////////////////////////////////////////////// INT8U BUFFER[512]; INT8U MP3_BUFFER[512]; INT8U TEXT[512]; INT8U filetype[][3] ={ {"MP3"},{"WMA"},{"MID"},{"LRC"}}; INT32U FAT_MASK; INT16U RootDirEnts; // 根目录总的项数(FAT12&FAT16) INT8U Fat_Init(void) { uint32 j; SD_ReadBlock(0,BUFFER); for(j=0;j<512 0="" 0x05="" 0x0b="" 0xe5="" 16="" 1="" 24="" 2="" 3="" 4bytes="" 8="" a="" amp="" artinfo.prstartlba="" artition_parttype="=" artition_startlba="" attr_directory="" attr_long_filename="" bits="" bpb710="" bpb="" bpb_bkbootsec="BUFFER[50]" bpb_bytespersec="BUFFER[11]" bpb_extflags="BUFFER[40]" bpb_fatsz16="BUFFER[22]" bpb_fatsz32="BUFFER[36]" bpb_fsinfo="BUFFER[48]" bpb_fsver="BUFFER[42]" bpb_hiddsec="BUFFER[28]" bpb_media="BUFFER[21];" bpb_numfats="BUFFER[16];" bpb_numheads="BUFFER[26]" bpb_rootclus="BUFFER[44]" bpb_rootentcnt="BUFFER[17]" bpb_rsvdseccnt="BUFFER[14]" bpb_secperclus="BUFFER[13];" bpb_secpertrk="BUFFER[24]" bpb_totsec16="BUFFER[19]" bpb_totsec32="BUFFER[32]" break="" bs_bootsig="BUFFER[66];" bs_drvnum="BUFFER[64];" bs_oemname="" bs_reservd1="BUFFER[65];" bs_volid="BUFFER[67]" buffer="" clust="(BUFFER[tem+20]<<16)" cluster="" deextension="" dename="" directory="" do="" ector="" eserved="BUFFER[52];" fat1sec="BPB_RsvdSecCnt+Partition_StartLBA;" fat2sec="FAT1Sec+BPB_FATSz32;" fat32="" fat_mask="FAT32_MASK;" fatnextcluster="" fatoffset="" filesize="(BUFFER[tem+28])" filetype="" firstdatasector="FAT2Sec+BPB_FATSz32;" for="" getfileclust="" i="" if="" ilsystype="" index="0;" int16u="" int32u="" int8u="" irstdatasector="" is="" ismusicfile="" it="" j="" message="" ndex="" nextcluster="0;" offset="0;" ollab="" part_type_fat32="" partion="" partition_parttype="BUFFER[450];" partition_size="BUFFER[458]+(BUFFER[459]<<8)+(BUFFER[460]<<16)+(BUFFER[461]<<24);" partition_startlba="BUFFER[454]+(BUFFER[455]<<8)+(BUFFER[456]<<16)+(BUFFER[457]<<24);" read="" readblockforcluster="" return="" sd_readblock="" sector="FAT1Sec" smusicfile="" strname="" struct="" tem="" text="" tmp="" void="" while="" x0200="" x02="" x08="" x0fffffff="" x20="" xf9="" ytespersec="">>9); // 计算FAT扇区号 offset = fatOffset % BPB_BytesPerSec; // 计算FAT扇区号中表项的偏移地址 nextCluster = ReadBlockforCluster(sector,offset); // 读取下一个簇号 // } /* else if(Partition_PartType == PART_TYPE_FAT16) // 一个表项为 2bytes(16 bits) { fatOffset = cluster << 1; // 计算FAT扇区号 //sector = FirstFATSector + (fatOffset / BPB_BytesPerSec); offset = fatOffset % BPB_BytesPerSec; // 计算FAT扇区号中表项的偏移地址 nextCluster = ReadBlockforCluster(sector,offset); } */ if (nextCluster >= (CLUST_EOFS & FAT_MASK)) // 是否文件的结束簇 { nextCluster = CLUST_EOFE; } return nextCluster; } void GetMusicFile(void) { uint8 i; fcount=0; while(1) { GetFileClust(); if(Index==0) break; for(i=0;i<8 deextension="" dename="" fcount="" fname="" for="" i="" if="">=65) fext[fcount][i]=deExtension[i]+0x20; else fext[fcount][i]=deExtension[i]; } fclust[fcount]=Clust; fsize[fcount]=FileSize; fcount++; } }8>512>
沒有留言:
張貼留言