|
楼主 |
发表于 2009-10-22 22:37:52
|
显示全部楼层
*-----------------------------------------------------------------------
查询一个文件的开始簇
-----------------------------------------------------------------------*/
unsigned int baseentry = 0;
unsigned int entrycount = 0;
unsigned long fatGetDirEntry(unsigned int entry)
{
unsigned long sector;
struct direntry *de = 0; // 防止compiler warning
struct winentry *we;
unsigned int hasBuffer;
unsigned int b;
int i,index;
char *p;
entrycount = 0;
DirNameBuffer = 0;
// 读取目录区数据
sector = fatClustToSect(FirstDirSector);
hasBuffer = 0;
index = 16;
do
{
if(index == 16) // 是否该一人一扇区time for next sector ?
{
ReadBlock(sector++);
de = (struct direntry *)BUFFER;
index = 0;
}
if(*de->deName != 0xE5)
{
// 如果if not a deleted entry
if(de->deAttributes == ATTR_LONG_FILENAME)
{
// we have a long name entry
we = (struct winentry *) de;
b = 13 *( (we->weCnt-1) & 0x0f); // index into string
p = &LongNameBuffer;
for (i=0;i<5;i++) *p++ = we->wePart1[i*2]; // copy first part
for (i=0;i<6;i++) *p++ = we->wePart2[i*2]; // second part
for (i=0;i<2;i++) *p++ = we->wePart3[i*2]; // and third part
if (we->weCnt & 0x40) *p = 0; // in case dirnamelength is multiple of 13
if ((we->weCnt & 0x0f) == 1) hasBuffer = 1; // mark that we have a long entry
}
else
{
// we have a short name entry
// check if this is the end of a multi-part long name entry
if(hasBuffer)
{
// a long entry name has been collected
// is it a directory ?
if(de->deAttributes == ATTR_DIRECTORY)
{
unsigned long save = FirstDirSector;
unsigned int save2 = baseentry;
unsigned long rval;
strcpy(DirNameBuffer,LongNameBuffer);
strcat(DirNameBuffer,"/");
// rprintfStr(LongNameBuffer); rprintfProgStrM("/"); //EOL();
// call recursively
FirstDirSector = ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
rval = fatGetDirEntry(entry);
FirstDirSector = save;
baseentry = save2;
if (rval)
return rval;
else
{
// reload original sector
ReadBlock(sector-1);//ataReadSectors( DRIVE0, sector-1, 1, SectorBuffer);
entrycount--; // decrement entry counter
*DirNameBuffer = 0;
}
}
else // normal file entry
if(entrycount == entry)
break;
hasBuffer = 0; // clear buffer
entrycount++; // increment entry counter
}
// else ignore short_name_only entries
}
}
de++;
index++;
} while (*de->deName || index == 16); // 0 in de->deName[0] if no more entries
if (hasBuffer == 0) // end of entries
return 0;
FileSize = de->deFileSize;
return (unsigned long) ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
}
/*-----------------------------------------------------------------------
在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;
}
上面是fat文件程序,下面的是播放程序,麻烦哥哥给看看
void mp3_play(unsigned long FirstClust)
{
uint32 LBA,NextCluster;
uint16 i,data_pointer,rate;
uint8 n,t1;
NextCluster = FirstClust;
while (1)
{
LBA =fatClustToSect(NextCluster);
for (i=0;i<SectorsPerCluster;i++)
{
if(flag==0) ReadBlock(LBA+i); //读完后文件指针自动后移
//按键处理程序
//ST/PS键按下
if(!(PINE&STOP))
{
delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
if(!(PINE&STOP))
{
flag^=0x01;
}
}
//VOLUP键按下
if(!(PINE&VOLDOWN))
{
delay_nus(250);
if(!(PINE&VOLDOWN))
{
vol=vol+((uint)(2<<8)+2);
if(vol>=0xFAFA) vol=0xF0F0;
else vs1003_cmd_write(0x0b,vol); //每次左右声道VOL减2
}
}
//VOLDOWN键按下
if(!(PINE&VOLUP))
{
delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
if(!(PINE&VOLUP))
{
vol=vol-((uint)(2<<8)+2);
if(vol<=0x0505) vol=0x0505;
else vs1003_cmd_write(0x0b,vol); //每次左右声道VOL加2
}
}
//NEXT键按下
if(!(PINE&NEXTSONG))
{
delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
if(!(PINE&NEXTSONG)) goto NEXT; //跳到下一首歌曲
}
//PREV键按下
if(!(PINE&PREVSONG))
{
delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
if(!(PINE&PREVSONG))
{
t=t-2;goto NEXT; //返回前一首歌曲
}
}
data_pointer=0;
while(data_pointer<512)
{
if(PINB&MP3_DATA_REQ)
{
for(n=0;n<32;n++)
{
vs1003_data_write(BUFFER[data_pointer]);
data_pointer++;
}
}
if (data_pointer==511) break; //如果现在的数据不够了,则跳出来
}
}
NextCluster = fatNextCluster(NextCluster);
if (NextCluster >=(CLUST_RSRVD&FAT_MASK))break;
}
NEXT: delay_nus(1); /* 下一首歌曲*/
} |
|