SectorPerClus = buf[13] ; //每簇扇区数
reserved_sector = buf[14] ; //保留扇区,一般为32,但有的不是,
所以读出 }
//簇号转为逻辑扇区号
unsigned long int ClusToLba (unsigned long int clus) //ok {
return (unsigned long int)((clus-2) * (unsigned long int)SectorPerClus + DataStartSector); }
//通过当前簇,查找下一簇
unsigned long int SearchNextClus (unsigned long int this_clus, unsigned char *buf) {
if (buf[4 * offset + 3] == 0X0F ) return 0 ; //the end READ_SECTOR(FatStartSector + fat_offset, buf);
fat_offset = this_clus/128 ; //每扇区存放128个FAT项 offset = this_clus % 128 ; unsigned long int fat_offset ; unsigned char offset ; fat_size = buf[36]
+ buf[37]*256
+ buf[38]*65536 + buf[39]*65536*256;
fat_size = fat_size * 2;
FatStartSector = DosBootSector + reserved_sector; DataStartSector = FatStartSector + fat_size ;
} //
return (unsigned long int)( buf[4*offset]
+ buf[4*offset+1]*256
+ buf[4*offset+2]*65536 + buf[4*offset+3]*65536*256);
void InitFat (unsigned char *buf) {
RdMBR(buf); //读主引导扇区 RdDBR(buf);
//读操作系统引导扇区,获取该分区文件系统信息
sprintf(buf,\UartSendStr(buf);
sprintf(buf,\
int)SectorPerClus); }
#include \ file.c
//查找以index为索引的文件
unsigned char SearchFile (unsigned long int entry, {
unsigned int index, char *type, unsigned char *buf, FILE *pfile)
UartSendStr(buf);
sprintf(buf,\UartSendStr(buf);
sprintf(buf,\UartSendStr(buf);
unsigned char i ;
unsigned int file_num = 0 ; unsigned char sector_count = 0;
unsigned char *pdir; unsigned char dir_count;
unsigned long int addr = ClusToLba(entry);
while (1) {
if(sector_count++ < SectorPerClus) {
READ_SECTOR(addr++, buf);
} else { }
SearchNextClus(entry++, buf); addr = ClusToLba(entry); sector_count = 1 ;
READ_SECTOR(addr++, buf);
for (dir_count = 0; dir_count < 16; dir_count++) //每扇区有16个目录项 {
pdir = &buf[dir_count*32];
if (pdir[0] == 0) { //结束,未找到
return 0 ;
} else if ((pdir[0] != 0xe5) && //未删除
(pdir[8] == type[0]) &&
(pdir[9] == type[1]) && (pdir[10] == type[2])) {
if (++file_num == index) { //找到文件
for (i = 0; i < 11; i++) { // copy short name
pfile -> short_name[i] = pdir[i];
}
}
}
pfile -> short_name[11] = '\\0'; pfile -> attr = pdir[11] ; //属性字节 pfile -> start_clus = pdir[20]*65536
+ pdir[21]*256*65536
+ pdir[26] + pdir[27]*256;
pfile -> size = pdir[30]*65536 + pdir[31]*256*65536
+ pdir[28] + pdir[29]*256;
UartSendStr(\UartSendStr(pfile -> short_name);
}
}
}
//查找某一个目录下指定文件的个数
unsigned int StatFileNum (unsigned long int entry, //入口簇 {
while (1) {
if(sector_count++ < SectorPerClus) { idata unsigned int file_num = 0 ; idata unsigned char sector_count = 0;
unsigned char *pdir; idata unsigned char dir_count;
idata unsigned long int addr = ClusToLba(entry);
char *type, //查找类型 unsigned char *buf) //扇区缓冲区
READ_SECTOR(addr++, buf);
} else { }
SearchNextClus(entry++, buf); addr = ClusToLba(entry); sector_count = 1 ;
READ_SECTOR(addr++, buf);
for (dir_count = 0; dir_count < 16; dir_count++) //每扇区有16个目录项 {
pdir = &buf[dir_count*32];
if (pdir[0] == 0) { //查找结束,返回文件个
数
}
}
return file_num;
} else if ((pdir[0] != 0xe5) && //未删除 }
(pdir[8] == type[0]) &&
(pdir[9] == type[1]) && (pdir[10] == type[2])) {
file_num++; //找到文件 continue ;
1234+5vS1RXDDS2TXDT2/P1.0T2EX/P1.1P1.2P1.3P1.4P1.5P1.6P1.7RSTRXD/P3.0EATXD/P3.1ALE/PROGINT0 /P3.2PSENINT1 /P3.3T0/P3.4T1/P3.5WR /P3.6RD/P3.7XTAL2XTAL1GNDSTC89C58P2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A81819203130292827262524232221+5VVCCP0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7C240.1uDINCLKSCLKSI+3.3vSOR110k9S5T1SW-PBRXDTXDINT#INT1T0T1WR#RD#1011121314151617SW-PBS612345678SW-PBR124.7kU1+5V4039D038D137D236D335D434D533D632D7+C2347uVDDCLKDIND/CCSOCSGNDVOUTRSTSW-PB+3.3V1CLK2DIN3D/C45CS6+3.3VC22781049RSTFIX1FIX2141519U4NC2LED1ALED1KLED2ALED2KFIX3FIX4NC11011R11D1kS3INT1S4T0SW-PBSW-PB1213R101k5110 LCD1617180.1u+3.3vD/CXDCS/BSYNCDREQXRESETXCSCSA0RSTMICP1MICN2XRESET34CVDD05C6+2.5VIOVDD067DREQ80.1u9R3100k10R4100k111248LEFT470.1uC15C16+3.3v0.1uC17U3INT#CWR#RD#R22Y1C130MHz22pA0USBVCCD-D+GNDUD-UD+USBY2C312MHz22pB22pMK1uC12100pC13MICROPHONE2MICN1uC4C14MICP0.1uCH3751234UD+UD-0.01uC5+5vINT#RSTIWR#RD#TXDRXDNC。A0V3UD+UD-GNDXIXOVCCCS#RST#RSTACT#GNDD7D6D5D4D3D2D1D01234567891011121314+5v2827262524232221201918171615+3.3v464544GBUF4342RIG41HT40393837U2AGND3LEDFTAVD2CAARVDDP1BUAGGNDF2AGND1RIGHTAVDD0AGND0LINEINCC7+2.5VCVDD0C8+3.3VIOVDD00.1uXDCS/BSYNCMICPMICNXRESETDGND0CVDD0IOVDD0CVDD1DREQGPIO2/DCLKDPIO3/SDATANCNCIOVDD1DVGNC0D1XTALOXTALIIOVDD2VS1003NCNCGPIO1GPIO0/SPIBOOTTESTCVDD3SOSISCLKTXRXNCDGND2DGND3DGND4CXVDCSD2363534R6100K3332+3.3v31C180.1u30SO29SI+2.5v28SCLK2726+3.3v25B131415161718192021222324XDCS/BSYNCC11U6SPX1117VOUT2+3.3v+5v3VINVOUT2+2.5vXCSU5SPX1117+5vC2510u3VINGNDC19C20C2110nF10nF10nFR5R920C290.1uGND104R820+C28C300.1uR7201MC260.1uC270.1u1Y310uC912.288M22p22pJ11C10LEFT} ARIGHTGBUF TitlePHONEJACK STEREOSizeA4Date:File:123NumberARevision1-Dec-2011 I:\\PROTEL 99SE\\MP3.ddbSheet of Drawn By:4