📄 fat.c
字号:
if((item->deName[0] != '.') && (item->deName[0] != 0x00) && (item->deName[0] != 0xe5) && (item->deAttributes != 0x0f))
{
if((item->deExtension[0] == 'b')&&(item->deExtension[1] == 'm')&&(item->deExtension[2] == 'p'))
{
CopyDirentruyItem(MusicInfo,item);
*type=1;
i++;
if(i==*Count){free(buffer);return 0;}
}
}
}
}
free(buffer);//release
}
else//other folders
{
tempclust=cluster;
while(1)
{
sector=FirstDataSector+(DWORD)(tempclust-2)*(DWORD)SectorsPerClust;//calculate the actual sector number
buffer=malloc(512);//apply memory
if(buffer==0)return 1;//if failed
for(cnt=0;cnt<SectorsPerClust;cnt++)
{
if(FAT_ReadSector(sector+cnt,buffer)){free(buffer);return 1;}
for(offset=0;offset<512;offset+=32)
{
item=(struct direntry *)(&buffer[offset]);
if((item->deName[0] != '.') && (item->deName[0] != 0x00) && (item->deName[0] != 0xe5) && (item->deAttributes != 0x0f))
{
if((item->deExtension[0] == 'b')&&(item->deExtension[1] == 'm')&&(item->deExtension[2] == 'p'))
{
CopyDirentruyItem(MusicInfo,item);
*type=1;
i++;
if(i==*Count){free(buffer);return 0;}
}
}
}
}
free(buffer);//release
tempclust=FAT_NextCluster(tempclust);//next cluster
if(tempclust == 0x0fffffff || tempclust == 0x0ffffff8 || (FAT32_Enable == 0 && tempclust == 0xffff))break;
}
}
if(*Count==0)*Count=i;
return 0;
}
#else
void WriteFolderCluster(WORD addr,DWORD cluster)
{
#if FAT_DEBUG
printf_P(PSTR("\r\nWrite EEPROM address:%d with value:%ld"),addr,cluster);
#endif
eeprom_write_byte(addr,cluster>>24);
eeprom_write_byte(addr+1,cluster>>16);
eeprom_write_byte(addr+2,cluster>>8);
eeprom_write_byte(addr+3,cluster>>0);
}
DWORD GetFolderCluster(WORD addr)
{
DWORD temp;
temp = eeprom_read_byte(addr);
temp <<= 8;
temp += eeprom_read_byte(addr+1);
temp <<= 8;
temp += eeprom_read_byte(addr+2);
temp <<= 8;
temp += eeprom_read_byte(addr+3);
#if FAT_DEBUG
printf_P(PSTR("\r\nRead EEPROM address: %d value is: %ld"),addr,temp);
#endif
return temp;
}
BYTE SearchFolder(DWORD cluster,WORD *addr)
{
BYTE *buffer;
//BYTE buff[3];
DWORD sector;
//DWORD cluster;
DWORD tempclust;
unsigned char cnt;
unsigned int offset;
//unsigned int i=0;
//unsigned char j;//long name buffer offset;
// unsigned char *p;//long name buffer pointer
struct direntry *item = 0;
//struct winentry *we =0;
if(cluster==0 && FAT32_Enable==0)// root directory
{
buffer=malloc(512);//apply memory
if(buffer==0)return 1;//if failed
for(cnt=0;cnt<RootDirSectors;cnt++)
{
if(FAT_ReadSector(FirstDirSector+cnt,buffer)){free(buffer);return 1;}
for(offset=0;offset<512;offset+=32)
{
item=(struct direntry *)(&buffer[offset]);//pointer convert
//find a valid item and display it
if((item->deName[0] != '.') && (item->deName[0] != 0x00) && (item->deName[0] != 0xe5))
{
if(item->deAttributes & ATTR_DIRECTORY )
{
#if FAT_DEBUG
printf_P(PSTR("\r\nFound a folder!"));
#endif
if(*addr==RECORD_ADDR_END)return 0;
else
{
WriteFolderCluster(*addr,item->deStartCluster+(((unsigned long)item->deHighClust)<<16));
*addr+=4;
}
}
}
}
}
free(buffer);//release
}
else//other folders
{
tempclust=cluster;
while(1)
{
sector=FirstDataSector+(DWORD)(tempclust-2)*(DWORD)SectorsPerClust;//calculate the actual sector number
buffer=malloc(512);//apply memory
if(buffer==0)return 1;//if failed
for(cnt=0;cnt<SectorsPerClust;cnt++)
{
if(FAT_ReadSector(sector+cnt,buffer)){free(buffer);return 1;}
for(offset=0;offset<512;offset+=32)
{
item=(struct direntry *)(&buffer[offset]);
if((item->deName[0] != '.') && (item->deName[0] != 0x00) && (item->deName[0] != 0xe5))
{
if(item->deAttributes & ATTR_DIRECTORY )
{
#if FAT_DEBUG
printf_P(PSTR("\r\nFound a folder!"));
#endif
if(*addr==RECORD_ADDR_END)return 0;
else
{
WriteFolderCluster(*addr,item->deStartCluster+(((unsigned long)item->deHighClust)<<16));
*addr+=4;
}
}
}
}
}
free(buffer);//release
tempclust=FAT_NextCluster(tempclust);//next cluster
if(tempclust == 0x0fffffff || tempclust == 0x0ffffff8 || (FAT32_Enable == 0 && tempclust == 0xffff))break;
}
}
return 0;
}
BYTE SearchInit()
{
WORD addr = RECORD_ADDR_START;
WORD temp_addr;
DWORD cluster;
#if FAT_DEBUG
printf_P(PSTR("\r\nSearchInit"));
#endif
if(FAT32_Enable)
WriteFolderCluster(addr,FirstDirClust);
else
WriteFolderCluster(RECORD_ADDR_START,0);
addr += 4;
WriteFolderCluster(addr, 0xffffffff);
temp_addr = addr;
addr = RECORD_ADDR_START;
while(1)
{
cluster = GetFolderCluster(addr);
if(cluster == 0xffffffff)return 0;
else
{
if(SearchFolder(cluster,&temp_addr))
{
#if FAT_DEBUG
printf_P(PSTR("\r\nERROR: search folder error"));
#endif
}
#if FAT_DEBUG
printf_P(PSTR("\r\nSearch one folder, write the end flag if the the value is not the right value"));
#endif
if(GetFolderCluster(temp_addr) != 0xffffffff)
WriteFolderCluster(temp_addr,0XFFFFFFFF);
if(temp_addr == RECORD_ADDR_END)
{
#if FAT_DEBUG
printf_P(PSTR("\r\nWARNING: EEPROM is full, no more space!"));
#endif
WriteFolderCluster(temp_addr - 4,0XFFFFFFFF);
break;
}
}
addr+=4;
}
#if FAT_DEBUG
printf_P(PSTR("\r\nSearch Completed!"));
#endif
}
//search the file , when *count = 0 it will bring the number whole songs, when *cout != 0 the *MusicInfo will bring the infomation of the file
BYTE Search(/*BYTE *dirWORD *music_record_addr,*/struct direntry *MusicInfo,WORD *Count,BYTE *type)//当COUNT为零时,有它带回这个目录下总共有多少首音乐
{ //不为零时有MusicInfo带回第Count首歌的详细文件信息
BYTE *buffer;
DWORD sector;
DWORD cluster;
DWORD tempclust;
unsigned char cnt;
unsigned int offset;
unsigned int i=0;
//unsigned char j;//long name buffer offset;
//unsigned char *p;//long name buffer pointer
struct direntry *item = 0;
//struct winentry *we =0;
//cluster = FAT_OpenDir(dir);
//if(cluster == 1)return 1;
BYTE file_type[3] ;
switch(*type)
{
case 1 : file_type[0] = 'B' ;
file_type[1] = 'M' ;
file_type[2] = 'P' ;
break ;
case 2 : file_type[0] = 'B' ;
file_type[1] = 'I' ;
file_type[2] = 'N' ;
break;
}
WORD addr = RECORD_ADDR_START;
while(1)
{
cluster = GetFolderCluster(addr);
addr += 4;
if(cluster == 0xffffffff) break;
else
{
//*music_record_addr = addr - 4; /* record in which record found the right file */
if(cluster==0 && FAT32_Enable==0)// root directory
{
buffer=malloc(512);//apply memory
if(buffer==0)return 1;//if failed
for(cnt=0;cnt<RootDirSectors;cnt++)
{
if(FAT_ReadSector(FirstDirSector+cnt,buffer)){free(buffer);return 1;}
for(offset=0;offset<512;offset+=32)
{
item=(struct direntry *)(&buffer[offset]);//pointer convert
//find a valid item and display it
if((item->deName[0] != '.') && (item->deName[0] != 0x00) && (item->deName[0] != 0xe5) && (item->deAttributes != 0x0f))
{
if((item->deExtension[0] == file_type[0])&&(item->deExtension[1] == file_type[1])&&(item->deExtension[2] == file_type[2]))
{
CopyDirentruyItem(MusicInfo,item);
i++;
if(i==*Count){free(buffer);return 0;}
}
}
}
}
free(buffer);//release
}
else//other folders
{
tempclust=cluster;
while(1)
{
sector=FirstDataSector+(DWORD)(tempclust-2)*(DWORD)SectorsPerClust;//calculate the actual sector number
buffer=malloc(512);//apply memory
if(buffer==0)return 1;//if failed
for(cnt=0;cnt<SectorsPerClust;cnt++)
{
if(FAT_ReadSector(sector+cnt,buffer)){free(buffer);return 1;}
for(offset=0;offset<512;offset+=32)
{
item=(struct direntry *)(&buffer[offset]);
if((item->deName[0] != '.') && (item->deName[0] != 0x00) && (item->deName[0] != 0xe5) && (item->deAttributes != 0x0f))
{
if((item->deExtension[0] == file_type[0])&&(item->deExtension[1] == file_type[1])&&(item->deExtension[2] == file_type[2]))
{
CopyDirentruyItem(MusicInfo,item);
i++;
if(i==*Count){free(buffer);return 0;}
}
}
}
}
free(buffer);//release
tempclust=FAT_NextCluster(tempclust);//next cluster
if(tempclust == 0x0fffffff || tempclust == 0x0ffffff8 || (FAT32_Enable == 0 && tempclust == 0xffff))break;
}
}
}
}
if(*Count==0)*Count=i;
/*
GUI_sprintf_chartohex(130,300,*type,0xffff,0x0000) ;
GUI_sprintf_chartohex(160,300,i,0xffff,0x0000) ;
GUI_sprintf_chartohex(190,300,*Count,0xffff,0x0000) ;
while(1) ;*/
return 0;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -