📄 fat.c
字号:
#include "fat.h"
#include "..\\public\\public.h"
#include "..\\NandFlash\\nfApp.h"
#include "..\\NandFlash\\NFdrv.h"
extern unsigned int g_RWBuf[512];
extern unsigned int F_ReadNF();
#define FAT16 FAlSE
/*File Manage Function
*/
FILE fileHandler;
DIR_ENTRY fileDirEntry;
unsigned long int currentFileLocate;
unsigned int mpegBitrate;
// t_bitrate[V] [L] [BitrateIndex]
const unsigned int t_bitrate[2][3][15] = {{
{0,32,48,56,64,80,96,112,128,144,160,176,192,224,256},
{0,8,16,24,32,40,48,56,64,80,96,112,128,144,160},
{0,8,16,24,32,40,48,56,64,80,96,112,128,144,160}
},{
{0,32,64,96,128,160,192,224,256,288,320,352,384,416,448},
{0,32,48,56,64,80,96,112,128,160,192,224,256,320,384},
{0,32,40,48,56,64,80,96,112,128,160,192,224,256,320}
}};
unsigned int FAT_FileReWind()
{
currentFileLocate=ROOT_DIR_ADDR;
}
unsigned int FAT_FileFindNext(unsigned int *pch)
{
unsigned int i, ch[11],ic[2];
for(i=0; i<11; i++)
{
if(*pch == '.')
{
pch++;
i=8;
}
ch[i]=*pch++;
}
while(currentFileLocate < DATA_ADDR)
{
NF_ReadMultiByte(currentFileLocate, 32, (unsigned int)&fileDirEntry );
currentFileLocate+=0x20;
if( fileDirEntry.ExtName[0] == ch[8] &&
fileDirEntry.ExtName[1] == ch[9] &&
fileDirEntry.ExtName[2] == ch[10] )
{//Finded File
fileHandler.StartClus = fileDirEntry.StartClus[1]*0x100 + fileDirEntry.StartClus[0];
fileHandler.CurrentClus = fileHandler.StartClus;
#if FAT16
NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus-1)*2), 2, ic);
fileHandler.NextClus=(ic[1]&0xff)*0x100 + (ic[0]&0xff);
#else
NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus * 1.5)), 2, ic);
if(fileHandler.CurrentClus & 0x01)
{//Odd Number //Get IC[0].Hight 4 Bit
fileHandler.NextClus= ( (ic[0]>>4)&0x0f ) | ((ic[1]<<4)&0x0ff0);
}
else
{//Even Number
fileHandler.NextClus= ic[0] | ((ic[1]<<8) & 0x0f00);
}
#endif
fileHandler.FileLen = fileDirEntry.FileLength[0]
+ fileDirEntry.FileLength[1]*0x100
+ fileDirEntry.FileLength[2]*0x10000
+ fileDirEntry.FileLength[3]*0x1000000;
fileHandler.FileCount=0x0000;
return(TRUE);
}
}
return(FALSE); //Not Find File
}
unsigned int FAT_FileFindPrev(unsigned int *pch)
{
unsigned int i, ch[11], ic[2];
for(i=0; i<11; i++)
{
if(*pch == '.')
{
pch++;
i=8;
}
ch[i]=*pch++;
}
while(currentFileLocate > ROOT_DIR_ADDR)
{
NF_ReadMultiByte(currentFileLocate, 32, (unsigned int)&fileDirEntry );
currentFileLocate-=0x20;
if( fileDirEntry.ExtName[0] == ch[8] &&
fileDirEntry.ExtName[1] == ch[9] &&
fileDirEntry.ExtName[2] == ch[10] )
{//Finded File
fileHandler.StartClus = fileDirEntry.StartClus[1]*0x100 + fileDirEntry.StartClus[0];;
fileHandler.CurrentClus = fileHandler.StartClus;
#if FAT16
NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus-1)*2), 2, ic);
fileHandler.NextClus=(ic[1]&0xff)*0x100 + (ic[0]&0xff);
#else
NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus * 1.5)), 2, ic);
if(fileHandler.CurrentClus & 0x01)
{//Odd Number //Get IC[0].Hight 4 Bit
fileHandler.NextClus= ((ic[0]>>4)&0x0f ) | ((ic[1]<<4)&0x0ff0);
}
else
{//Even Number
fileHandler.NextClus= ic[0] | ((ic[1]<<8) & 0x0f00);
}
#endif
fileHandler.FileLen = fileDirEntry.FileLength[0]
+ fileDirEntry.FileLength[1]*0x100
+ fileDirEntry.FileLength[2]*0x10000
+ fileDirEntry.FileLength[3]*0x1000000;
fileHandler.FileCount=0x0000;
return(TRUE);
}
}
return(FALSE); //Not Find File
}
/*File Control Function
*/
unsigned int FAT_Open(unsigned int *pch)
{
unsigned int i[2];
currentFileLocate=ROOT_DIR_ADDR;
if (! FAT_FileFindNext(pch) )
return(FALSE);
else
return(TRUE);
}
void FAT_Close()
{
fileHandler.StartClus = NULL;
fileHandler.CurrentClus = NULL;
fileHandler.NextClus = NULL;
fileHandler.FileLen = NULL;
fileHandler.FileCount=NULL;
}
/*File Read/Write Function
*/
void FAT_Putc(unsigned char ch)
{
}
unsigned int FAT_Getc()
{
unsigned int ic[2];
if( 0x00 == (fileHandler.FileCount % 0x4000) && (0x00 != fileHandler.FileCount) )
{//New Block (but Not File First Byte)
fileHandler.CurrentClus=fileHandler.NextClus;
#if FAT16
NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus-1)*2), 2, ic);
fileHandler.NextClus=(ic[1]&0xff)*0x100 + (ic[0]&0xff);
#else
NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus * 1.5)), 2, ic);
if(fileHandler.CurrentClus & 0x01)
{//Odd Number //Get IC[0].Hight 4 Bit
fileHandler.NextClus= ((ic[0]>>4)&0x0f ) | ((ic[1]<<4)&0x0ff0);
}
else
{//Even Number
fileHandler.NextClus= ic[0] | ((ic[1]<<8) & 0x0f00);
}
#endif
}
NF_ReadMultiByte(((unsigned long int)(fileHandler.CurrentClus+1) * 0x4000) + (fileHandler.FileCount&0x3fff), 1, ic);
fileHandler.FileCount++;
return(ic[0]);
}
void FAT_WriteSector()
{
}
unsigned int FAT_ReadSector()
{
unsigned int i[2];
if( 0x00 == (fileHandler.FileCount % 0x4000) && (0x00 != fileHandler.FileCount) )
{//New Block (but Not File First Byte)
fileHandler.CurrentClus=fileHandler.NextClus;
#if FAT16
NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus-1)*2), 2, i);
fileHandler.NextClus=(i[1]&0xff)*0x100 + (i[0]&0xff);
#else
NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus * 1.5)), 2, i);
if(fileHandler.CurrentClus & 0x01)
{//Odd Number //Get IC[0].Hight 4 Bit
fileHandler.NextClus = ( (i[0]>>4)&0x0f ) | ((i[1]<<4)&0x0ff0);
}
else
{//Even Number
fileHandler.NextClus= i[0] | ((i[1]<<8) & 0x0f00);
}
#endif
}
NF_PageRead(0x00,((unsigned long int) (fileHandler.CurrentClus+1) * 0x20) + ((fileHandler.FileCount>>9) & 0x1f ), g_RWBuf);
if( (fileHandler.FileLen-fileHandler.FileCount) >= 512)
{
fileHandler.FileCount+=512;
return(512);
}
else
{
i[0]=fileHandler.FileLen-fileHandler.FileCount;
fileHandler.FileCount=fileHandler.FileLen;
return(i[0]);
}
}
/*File Operation Function
*/
void FAT_ReWind(FILE *fp)
{
}
/*File Check Function
*/
unsigned int FAT_Eof()
{
return(fileHandler.FileCount >= fileHandler.FileLen);
}
unsigned int FAT_FindMPEGHead()
{
FILE backFile;
MPEG_HEADER mpegHeader;
unsigned int i;
backFile=fileHandler;
mpegHeader.u32 = FAT_Getc();
mpegHeader.u32 <<= 8;
mpegHeader.u32 |= FAT_Getc();
mpegHeader.u32 <<= 8;
mpegHeader.u32 |= FAT_Getc();
do
{
mpegHeader.u32 <<=8;
i = FAT_Getc();
i &= 0x00ff;
mpegHeader.u32 |= i;
if( (mpegHeader.mpegHead.syncword == 0xfff) &&
(mpegHeader.mpegHead.layer != 0x00) &&
(mpegHeader.mpegHead.bitrate_index != 0x0f) &&
(mpegHeader.mpegHead.sampling_frequency != 0x03)
)
{
fileHandler=backFile;
mpegBitrate= t_bitrate[mpegHeader.mpegHead.ID][3-mpegHeader.mpegHead.layer][mpegHeader.mpegHead.bitrate_index];
return(TRUE);
}
}while( !FAT_Eof() );
return(FALSE); // */
}
/*F**************************************************************************
* NAME: fat_format
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
* Create single FAT12 or FAT16 partition and format the selected memory
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -