The Firest Version

This commit is contained in:
Qiea
2024-11-01 22:38:48 +08:00
parent 8dc9a9f472
commit a19f47efca
416 changed files with 240428 additions and 0 deletions

407
FATFS/exfuns/exfuns.c Normal file
View File

@@ -0,0 +1,407 @@
#include "string.h"
#include "exfuns.h"
#include "fattester.h"
#include "malloc.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
//ALIENTEK STM32<33><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//FATFS <20><>չ<EFBFBD><D5B9><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2016/1/7
//<2F><EFBFBD><E6B1BE>V1.1
//<2F><>Ȩ<EFBFBD><C8A8><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
//Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾ 2014-2024
//All rights reserved
//********************************************************************************
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
//V1.1
//<2F><><EFBFBD><EFBFBD>exf_copy<70><79><EFBFBD><EFBFBD>,<2C>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bug
//////////////////////////////////////////////////////////////////////////////////
#define FILE_MAX_TYPE_NUM 7 //<2F><><EFBFBD><EFBFBD>FILE_MAX_TYPE_NUM<55><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define FILE_MAX_SUBT_NUM 4 //<2F><><EFBFBD><EFBFBD>FILE_MAX_SUBT_NUM<55><4D>С<EFBFBD><D0A1>
//<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
u8*const FILE_TYPE_TBL[FILE_MAX_TYPE_NUM][FILE_MAX_SUBT_NUM]=
{
{"BIN"}, //BIN<49>ļ<EFBFBD>
{"LRC"}, //LRC<52>ļ<EFBFBD>
{"NES","SMS"}, //NES/SMS<4D>ļ<EFBFBD>
{"TXT","C","H"}, //<2F>ı<EFBFBD><C4B1>ļ<EFBFBD>
{"WAV","MP3","APE","FLAC"},//֧<>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
{"BMP","JPG","JPEG","GIF"},//ͼƬ<CDBC>ļ<EFBFBD>
{"AVI"}, //<2F><>Ƶ<EFBFBD>ļ<EFBFBD>
};
///////////////////////////////<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>,ʹ<><CAB9>malloc<6F><63>ʱ<EFBFBD><CAB1>////////////////////////////////////////////
FATFS *fs[_VOLUMES];//<2F>߼<EFBFBD><DFBC><EFBFBD><EFBFBD>̹<EFBFBD><CCB9><EFBFBD><EFBFBD><EFBFBD>.
FIL *file; //<2F>ļ<EFBFBD>1
FIL *ftemp; //<2F>ļ<EFBFBD>2.
UINT br,bw; //<2F><>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
FILINFO fileinfo; //<2F>ļ<EFBFBD><C4BC><EFBFBD>Ϣ
DIR dir; //Ŀ¼
u8 *fatbuf; //SD<53><44><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
///////////////////////////////////////////////////////////////////////////////////////
//Ϊexfuns<6E><73><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>
//1,ʧ<><CAA7>
u8 exfuns_init(void)
{
u8 i;
for(i=0;i<_VOLUMES;i++)
{
fs[i]=(FATFS*)mymalloc(SRAMIN,sizeof(FATFS)); //Ϊ<><CEAA><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
if(!fs[i])break;
}
file=(FIL*)mymalloc(SRAMIN,sizeof(FIL)); //Ϊfile<6C><65><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
ftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL)); //Ϊftemp<6D><70><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
fatbuf=(u8*)mymalloc(SRAMIN,512); //Ϊfatbuf<75><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
if(i==_VOLUMES&&file&&ftemp&&fatbuf)return 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ʧ<EFBFBD><CAA7>,<2C><>ʧ<EFBFBD><CAA7>.
else return 1;
}
//<2F><>Сд<D0A1><D0B4>ĸתΪ<D7AA><CEAA>д<EFBFBD><D0B4>ĸ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>򱣳ֲ<F2B1A3B3><D6B2><EFBFBD>.
u8 char_upper(u8 c)
{
if(c<'A')return c;//<2F><><EFBFBD><EFBFBD>,<2C><><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD>.
if(c>='a')return c-0x20;//<2F><>Ϊ<EFBFBD><CEAA>д.
else return c;//<2F><>д,<2C><><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD>
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//fname:<3A>ļ<EFBFBD><C4BC><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:0XFF,<2C><>ʾ<EFBFBD>޷<EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD>.
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>С<EFBFBD><D0A1>.
u8 f_typetell(u8 *fname)
{
u8 tbuf[5];
u8 *attr='\0';//<2F><>׺<EFBFBD><D7BA>
u8 i=0,j;
while(i<250)
{
i++;
if(*fname=='\0')break;//ƫ<>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
fname++;
}
if(i==250)return 0XFF;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>.
for(i=0;i<5;i++)//<2F>õ<EFBFBD><C3B5><EFBFBD>׺<EFBFBD><D7BA>
{
fname--;
if(*fname=='.')
{
fname++;
attr=fname;
break;
}
}
strcpy((char *)tbuf,(const char*)attr);//copy
for(i=0;i<4;i++)tbuf[i]=char_upper(tbuf[i]);//ȫ<><C8AB><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>д
for(i=0;i<FILE_MAX_TYPE_NUM;i++) //<2F><><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD>
{
for(j=0;j<FILE_MAX_SUBT_NUM;j++)//<2F><><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD>
{
if(*FILE_TYPE_TBL[i][j]==0)break;//<2F><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD>û<EFBFBD>пɶԱȵij<C8B5>Ա<EFBFBD><D4B1>.
if(strcmp((const char *)FILE_TYPE_TBL[i][j],(const char *)tbuf)==0)//<2F>ҵ<EFBFBD><D2B5><EFBFBD>
{
return (i<<4)|j;
}
}
}
return 0XFF;//û<>ҵ<EFBFBD>
}
//<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//drv:<3A><><EFBFBD>̱<EFBFBD><CCB1><EFBFBD>("0:"/"1:")
//total:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>λKB<4B><42>
//free:ʣ<><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>λKB<4B><42>
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C><><EFBFBD><EFBFBD>.<2E><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 exf_getfree(u8 *drv,u32 *total,u32 *free)
{
FATFS *fs1;
u8 res;
u32 fre_clust=0, fre_sect=0, tot_sect=0;
//<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>
res =(u32)f_getfree((const TCHAR*)drv, (DWORD*)&fre_clust, &fs1);
if(res==0)
{
tot_sect=(fs1->n_fatent-2)*fs1->csize; //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fre_sect=fre_clust*fs1->csize; //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#if _MAX_SS!=512 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>512<31>ֽ<EFBFBD>,<2C><>ת<EFBFBD><D7AA>Ϊ512<31>ֽ<EFBFBD>
tot_sect*=fs1->ssize/512;
fre_sect*=fs1->ssize/512;
#endif
*total=tot_sect>>1; //<2F><>λΪKB
*free=fre_sect>>1; //<2F><>λΪKB
}
return res;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
//ע<><D7A2><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>С<EFBFBD><D0A1>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>4GB.
//<2F><>psrc<72>ļ<EFBFBD>,copy<70><79>pdst.
//fcpymsg,<2C><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>,<2C><><EFBFBD><EFBFBD>ʵ<EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ʾ
// pname:<3A>ļ<EFBFBD>/<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
// pct:<3A>ٷֱ<D9B7>
// mode:
// [0]:<3A><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
// [1]:<3A><><EFBFBD>°ٷֱ<D9B7>pct
// [2]:<3A><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
// [3~7]:<3A><><EFBFBD><EFBFBD>
//psrc,pdst:Դ<>ļ<EFBFBD><C4BC><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD>
//totsize:<3A>ܴ<EFBFBD>С(<28><>totsizeΪ0<CEAA><30>ʱ<EFBFBD><CAB1>,<2C><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>)
//cpdsize:<3A>Ѹ<EFBFBD><D1B8><EFBFBD><EFBFBD>˵Ĵ<CBB5>С.
//fwmode:<3A>ļ<EFBFBD>д<EFBFBD><D0B4>ģʽ
//0:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD>е<EFBFBD><D0B5>ļ<EFBFBD>
//1:<3A><><EFBFBD><EFBFBD>ԭ<EFBFBD>е<EFBFBD><D0B5>ļ<EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>,0XFF,ǿ<><C7BF><EFBFBD>˳<EFBFBD>
u8 exf_copy(u8(*fcpymsg)(u8*pname,u8 pct,u8 mode),u8 *psrc,u8 *pdst,u32 totsize,u32 cpdsize,u8 fwmode)
{
u8 res;
u16 br=0;
u16 bw=0;
FIL *fsrc=0;
FIL *fdst=0;
u8 *fbuf=0;
u8 curpct=0;
unsigned long long lcpdsize=cpdsize;
fsrc=(FIL*)mymalloc(SRAMIN,sizeof(FIL));//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
fdst=(FIL*)mymalloc(SRAMIN,sizeof(FIL));
fbuf=(u8*)mymalloc(SRAMIN,8192);
if(fsrc==NULL||fdst==NULL||fbuf==NULL)res=100;//ǰ<><C7B0><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>fatfs
else
{
if(fwmode==0)fwmode=FA_CREATE_NEW;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else fwmode=FA_CREATE_ALWAYS; //<2F><><EFBFBD>Ǵ<EFBFBD><C7B4>ڵ<EFBFBD><DAB5>ļ<EFBFBD>
res=f_open(fsrc,(const TCHAR*)psrc,FA_READ|FA_OPEN_EXISTING); //<2F><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>ļ<EFBFBD>
if(res==0)res=f_open(fdst,(const TCHAR*)pdst,FA_WRITE|fwmode); //<2F><>һ<EFBFBD><D2BB><EFBFBD>򿪳ɹ<F2BFAAB3>,<2C>ſ<EFBFBD>ʼ<EFBFBD>򿪵ڶ<F2BFAAB5><DAB6><EFBFBD>
if(res==0)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򿪳ɹ<F2BFAAB3><C9B9><EFBFBD>
{
if(totsize==0)//<2F><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
{
totsize=fsrc->obj.objsize;
lcpdsize=0;
curpct=0;
}else curpct=(lcpdsize*100)/totsize; //<2F>õ<EFBFBD><C3B5>°ٷֱ<D9B7>
fcpymsg(psrc,curpct,0X02); //<2F><><EFBFBD>°ٷֱ<D9B7>
while(res==0)//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
{
res=f_read(fsrc,fbuf,8192,(UINT*)&br); //Դͷ<D4B4><CDB7><EFBFBD><EFBFBD>512<31>ֽ<EFBFBD>
if(res||br==0)break;
res=f_write(fdst,fbuf,(UINT)br,(UINT*)&bw); //д<><D0B4>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD>
lcpdsize+=bw;
if(curpct!=(lcpdsize*100)/totsize)//<2F>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>°ٷֱ<D9B7>
{
curpct=(lcpdsize*100)/totsize;
if(fcpymsg(psrc,curpct,0X02))//<2F><><EFBFBD>°ٷֱ<D9B7>
{
res=0XFF;//ǿ<><C7BF><EFBFBD>˳<EFBFBD>
break;
}
}
if(res||bw<br)break;
}
f_close(fsrc);
f_close(fdst);
}
}
myfree(SRAMIN,fsrc);//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
myfree(SRAMIN,fdst);
myfree(SRAMIN,fbuf);
return res;
}
//<2F>õ<EFBFBD>·<EFBFBD><C2B7><EFBFBD>µ<EFBFBD><C2B5>ļ<EFBFBD><C4BC><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:0,·<><C2B7><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD><C7B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD>,<2C>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
u8* exf_get_src_dname(u8* dpfn)
{
u16 temp=0;
while(*dpfn!=0)
{
dpfn++;
temp++;
}
if(temp<4)return 0;
while((*dpfn!=0x5c)&&(*dpfn!=0x2f))dpfn--; //׷<><D7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>"\"<22><><EFBFBD><EFBFBD>"/"<22><>
return ++dpfn;
}
//<2F>õ<EFBFBD><C3B5>ļ<EFBFBD><C4BC>д<EFBFBD>С
//ע<><D7A2><EFBFBD>ļ<EFBFBD><C4BC>д<EFBFBD>С<EFBFBD><D0A1>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>4GB.
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ļ<EFBFBD><C4BC>д<EFBFBD>СΪ0,<2C><><EFBFBD>߶<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD>.
// <20><><EFBFBD><EFBFBD>,<2C>ļ<EFBFBD><C4BC>д<EFBFBD>С.
u32 exf_fdsize(u8 *fdname)
{
#define MAX_PATHNAME_DEPTH 512+1 //<2F><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>+<2B>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 res=0;
DIR *fddir=0; //Ŀ¼
FILINFO *finfo=0; //<2F>ļ<EFBFBD><C4BC><EFBFBD>Ϣ
u8 * pathname=0; //Ŀ<><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>·<EFBFBD><C2B7>+<2B>ļ<EFBFBD><C4BC><EFBFBD>
u16 pathlen=0; //Ŀ<><C4BF>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u32 fdsize=0;
fddir=(DIR*)mymalloc(SRAMIN,sizeof(DIR));//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
finfo=(FILINFO*)mymalloc(SRAMIN,sizeof(FILINFO));
if(fddir==NULL||finfo==NULL)res=100;
if(res==0)
{
pathname=mymalloc(SRAMIN,MAX_PATHNAME_DEPTH);
if(pathname==NULL)res=101;
if(res==0)
{
pathname[0]=0;
strcat((char*)pathname,(const char*)fdname); //<2F><><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
res=f_opendir(fddir,(const TCHAR*)fdname); //<2F><><EFBFBD><EFBFBD>ԴĿ¼
if(res==0)//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF>ɹ<EFBFBD>
{
while(res==0)//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>
{
res=f_readdir(fddir,finfo); //<2F><>ȡĿ¼<C4BF>µ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD>
if(res!=FR_OK||finfo->fname[0]==0)break; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><>ĩβ<C4A9><CEB2>,<2C>˳<EFBFBD>
if(finfo->fname[0]=='.')continue; //<2F><><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD>Ŀ¼
if(finfo->fattrib&0X10)//<2F><><EFBFBD><EFBFBD>Ŀ¼(<28>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>,0X20,<2C><EFBFBD>ļ<EFBFBD>;0X10,<2C><>Ŀ¼;)
{
pathlen=strlen((const char*)pathname); //<2F>õ<EFBFBD><C3B5><EFBFBD>ǰ·<C7B0><C2B7><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
strcat((char*)pathname,(const char*)"/"); //<2F><>б<EFBFBD><D0B1>
strcat((char*)pathname,(const char*)finfo->fname); //Դ·<D4B4><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD>
//printf("\r\nsub folder:%s\r\n",pathname); //<2F><>ӡ<EFBFBD><D3A1>Ŀ¼<C4BF><C2BC>
fdsize+=exf_fdsize(pathname); //<2F>õ<EFBFBD><C3B5><EFBFBD>Ŀ¼<C4BF><C2BC>С,<2C>ݹ<EFBFBD><DDB9><EFBFBD><EFBFBD><EFBFBD>
pathname[pathlen]=0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}else fdsize+=finfo->fsize; //<2F><>Ŀ¼,ֱ<>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>Ĵ<EFBFBD>С
}
}
myfree(SRAMIN,pathname);
}
}
myfree(SRAMIN,fddir);
myfree(SRAMIN,finfo);
if(res)return 0;
else return fdsize;
}
//<2F>ļ<EFBFBD><C4BC>и<EFBFBD><D0B8><EFBFBD>
//ע<><D7A2><EFBFBD>ļ<EFBFBD><C4BC>д<EFBFBD>С<EFBFBD><D0A1>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>4GB.
//<2F><>psrc<72>ļ<EFBFBD><C4BC><EFBFBD>,copy<70><79>pdst<73>ļ<EFBFBD><C4BC><EFBFBD>.
//pdst:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"X:"/"X:XX"/"X:XX/XX"֮<><D6AE><EFBFBD><EFBFBD>.<2E><><EFBFBD><EFBFBD>Ҫʵ<D2AA><CAB5>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC>д<EFBFBD><D0B4><EFBFBD>
//fcpymsg,<2C><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>,<2C><><EFBFBD><EFBFBD>ʵ<EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ʾ
// pname:<3A>ļ<EFBFBD>/<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
// pct:<3A>ٷֱ<D9B7>
// mode:
// [0]:<3A><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
// [1]:<3A><><EFBFBD>°ٷֱ<D9B7>pct
// [2]:<3A><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
// [3~7]:<3A><><EFBFBD><EFBFBD>
//psrc,pdst:Դ<>ļ<EFBFBD><C4BC>к<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//totsize:<3A>ܴ<EFBFBD>С(<28><>totsizeΪ0<CEAA><30>ʱ<EFBFBD><CAB1>,<2C><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>)
//cpdsize:<3A>Ѹ<EFBFBD><D1B8><EFBFBD><EFBFBD>˵Ĵ<CBB5>С.
//fwmode:<3A>ļ<EFBFBD>д<EFBFBD><D0B4>ģʽ
//0:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD>е<EFBFBD><D0B5>ļ<EFBFBD>
//1:<3A><><EFBFBD><EFBFBD>ԭ<EFBFBD>е<EFBFBD><D0B5>ļ<EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;0XFF,ǿ<><C7BF><EFBFBD>˳<EFBFBD>
u8 exf_fdcopy(u8(*fcpymsg)(u8*pname,u8 pct,u8 mode),u8 *psrc,u8 *pdst,u32 *totsize,u32 *cpdsize,u8 fwmode)
{
#define MAX_PATHNAME_DEPTH 512+1 //<2F><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>+<2B>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 res=0;
DIR *srcdir=0; //ԴĿ¼
DIR *dstdir=0; //ԴĿ¼
FILINFO *finfo=0; //<2F>ļ<EFBFBD><C4BC><EFBFBD>Ϣ
u8 *fn=0; //<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
u8 * dstpathname=0; //Ŀ<><C4BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>·<EFBFBD><C2B7>+<2B>ļ<EFBFBD><C4BC><EFBFBD>
u8 * srcpathname=0; //Դ<>ļ<EFBFBD><C4BC><EFBFBD>·<EFBFBD><C2B7>+<2B>ļ<EFBFBD><C4BC><EFBFBD>
u16 dstpathlen=0; //Ŀ<><C4BF>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u16 srcpathlen=0; //Դ·<D4B4><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
srcdir=(DIR*)mymalloc(SRAMIN,sizeof(DIR));//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
dstdir=(DIR*)mymalloc(SRAMIN,sizeof(DIR));
finfo=(FILINFO*)mymalloc(SRAMIN,sizeof(FILINFO));
if(srcdir==NULL||dstdir==NULL||finfo==NULL)res=100;
if(res==0)
{
dstpathname=mymalloc(SRAMIN,MAX_PATHNAME_DEPTH);
srcpathname=mymalloc(SRAMIN,MAX_PATHNAME_DEPTH);
if(dstpathname==NULL||srcpathname==NULL)res=101;
if(res==0)
{
dstpathname[0]=0;
srcpathname[0]=0;
strcat((char*)srcpathname,(const char*)psrc); //<2F><><EFBFBD><EFBFBD>ԭʼԴ<CABC>ļ<EFBFBD>·<EFBFBD><C2B7>
strcat((char*)dstpathname,(const char*)pdst); //<2F><><EFBFBD><EFBFBD>ԭʼĿ<CABC><C4BF><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>
res=f_opendir(srcdir,(const TCHAR*)psrc); //<2F><><EFBFBD><EFBFBD>ԴĿ¼
if(res==0)//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF>ɹ<EFBFBD>
{
strcat((char*)dstpathname,(const char*)"/");//<2F><><EFBFBD><EFBFBD>б<EFBFBD><D0B1>
fn=exf_get_src_dname(psrc);
if(fn==0)//<2F><><EFBFBD><EFBFBD><EABFBD>
{
dstpathlen=strlen((const char*)dstpathname);
dstpathname[dstpathlen]=psrc[0]; //<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
dstpathname[dstpathlen+1]=0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}else strcat((char*)dstpathname,(const char*)fn);//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
fcpymsg(fn,0,0X04);//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
res=f_mkdir((const TCHAR*)dstpathname);//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>,<2C>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD><EFBFBD>.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ھʹ<DABE><CDB4><EFBFBD><EFBFBD>µ<EFBFBD><C2B5>ļ<EFBFBD><C4BC><EFBFBD>.
if(res==FR_EXIST)res=0;
while(res==0)//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>
{
res=f_readdir(srcdir,finfo); //<2F><>ȡĿ¼<C4BF>µ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD>
if(res!=FR_OK||finfo->fname[0]==0)break; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><>ĩβ<C4A9><CEB2>,<2C>˳<EFBFBD>
if(finfo->fname[0]=='.')continue; //<2F><><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD>Ŀ¼
fn=(u8*)finfo->fname; //<2F>õ<EFBFBD><C3B5>ļ<EFBFBD><C4BC><EFBFBD>
dstpathlen=strlen((const char*)dstpathname); //<2F>õ<EFBFBD><C3B5><EFBFBD>ǰĿ<C7B0><C4BF>·<EFBFBD><C2B7><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
srcpathlen=strlen((const char*)srcpathname); //<2F>õ<EFBFBD>Դ·<D4B4><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
strcat((char*)srcpathname,(const char*)"/");//Դ·<D4B4><C2B7><EFBFBD><EFBFBD>б<EFBFBD><D0B1>
if(finfo->fattrib&0X10)//<2F><><EFBFBD><EFBFBD>Ŀ¼(<28>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>,0X20,<2C><EFBFBD>ļ<EFBFBD>;0X10,<2C><>Ŀ¼;)
{
strcat((char*)srcpathname,(const char*)fn); //Դ·<D4B4><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD>
res=exf_fdcopy(fcpymsg,srcpathname,dstpathname,totsize,cpdsize,fwmode); //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
}else //<2F><>Ŀ¼
{
strcat((char*)dstpathname,(const char*)"/");//Ŀ<><C4BF>·<EFBFBD><C2B7><EFBFBD><EFBFBD>б<EFBFBD><D0B1>
strcat((char*)dstpathname,(const char*)fn); //Ŀ<><C4BF>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
strcat((char*)srcpathname,(const char*)fn); //Դ·<D4B4><C2B7><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
fcpymsg(fn,0,0X01);//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
res=exf_copy(fcpymsg,srcpathname,dstpathname,*totsize,*cpdsize,fwmode);//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
*cpdsize+=finfo->fsize;//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>С
}
srcpathname[srcpathlen]=0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dstpathname[dstpathlen]=0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
myfree(SRAMIN,dstpathname);
myfree(SRAMIN,srcpathname);
}
}
myfree(SRAMIN,srcdir);
myfree(SRAMIN,dstdir);
myfree(SRAMIN,finfo);
return res;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

66
FATFS/exfuns/exfuns.h Normal file
View File

@@ -0,0 +1,66 @@
#ifndef __EXFUNS_H
#define __EXFUNS_H
#include <sys.h>
#include "ff.h"
//////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
//ALIENTEK STM32<33><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//FATFS <20><>չ<EFBFBD><D5B9><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2016/1/7
//<2F><EFBFBD><E6B1BE>V1.1
//<2F><>Ȩ<EFBFBD><C8A8><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
//Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾ 2014-2024
//All rights reserved
//********************************************************************************
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
//V1.1
//<2F><><EFBFBD><EFBFBD>exf_copy<70><79><EFBFBD><EFBFBD>,<2C>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bug
//////////////////////////////////////////////////////////////////////////////////
extern FATFS *fs[_VOLUMES];
extern FIL *file;
extern FIL *ftemp;
extern UINT br,bw;
extern FILINFO fileinfo;
extern DIR dir;
extern u8 *fatbuf;//SD<53><44><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
//f_typetell<6C><6C><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>
//<2F><><EFBFBD>ݱ<EFBFBD>FILE_TYPE_TBL<42><4C><EFBFBD><EFBFBD>.<2E><>exfuns.c<><63><EFBFBD><EFBFBD><E6B6A8>
#define T_BIN 0X00 //bin<69>ļ<EFBFBD>
#define T_LRC 0X10 //lrc<72>ļ<EFBFBD>
#define T_NES 0X20 //nes<65>ļ<EFBFBD>
#define T_SMS 0X21 //sms<6D>ļ<EFBFBD>
#define T_TEXT 0X30 //.txt<78>ļ<EFBFBD>
#define T_C 0X31 //.c<>ļ<EFBFBD>
#define T_H 0X32 //.h<>ļ<EFBFBD>
#define T_WAV 0X40 //WAV<41>ļ<EFBFBD>
#define T_MP3 0X41 //MP3<50>ļ<EFBFBD>
#define T_APE 0X42 //APE<50>ļ<EFBFBD>
#define T_FLAC 0X43 //FLAC<41>ļ<EFBFBD>
#define T_BMP 0X50 //bmp<6D>ļ<EFBFBD>
#define T_JPG 0X51 //jpg<70>ļ<EFBFBD>
#define T_JPEG 0X52 //jpeg<65>ļ<EFBFBD>
#define T_GIF 0X53 //gif<69>ļ<EFBFBD>
#define T_AVI 0X60 //avi<76>ļ<EFBFBD>
u8 exfuns_init(void); //<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
u8 f_typetell(u8 *fname); //ʶ<><CAB6><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
u8 exf_getfree(u8 *drv,u32 *total,u32 *free); //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u32 exf_fdsize(u8 *fdname); //<2F>õ<EFBFBD><C3B5>ļ<EFBFBD><C4BC>д<EFBFBD>С
u8* exf_get_src_dname(u8* dpfn);
u8 exf_copy(u8(*fcpymsg)(u8*pname,u8 pct,u8 mode),u8 *psrc,u8 *pdst,u32 totsize,u32 cpdsize,u8 fwmode); //<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
u8 exf_fdcopy(u8(*fcpymsg)(u8*pname,u8 pct,u8 mode),u8 *psrc,u8 *pdst,u32 *totsize,u32 *cpdsize,u8 fwmode);//<2F>ļ<EFBFBD><C4BC>и<EFBFBD><D0B8><EFBFBD>
#endif

316
FATFS/exfuns/fattester.c Normal file
View File

@@ -0,0 +1,316 @@
#include "fattester.h"
#include "sdio_sdcard.h"
#include "usmart.h"
#include "usart.h"
#include "exfuns.h"
#include "malloc.h"
#include "ff.h"
#include "string.h"
//////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
//ALIENTEK STM32<33><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//FATFS <20><><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2016/1/7
//<2F><EFBFBD><E6B1BE>V1.0
//<2F><>Ȩ<EFBFBD><C8A8><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
//Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾ 2014-2024
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//Ϊ<><CEAA><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><E1B9A4><EFBFBD><EFBFBD>
//path:<3A><><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"0:"<22><>"1:"
//mt:0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>Ժ<EFBFBD>ע<EFBFBD><EFBFBD><E1A3A9>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>
//<2F><><EFBFBD><EFBFBD>ֵ:ִ<>н<EFBFBD><D0BD><EFBFBD>
u8 mf_mount(u8* path,u8 mt)
{
return f_mount(fs[1],(const TCHAR*)path,mt);
}
//<2F><><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD>µ<EFBFBD><C2B5>ļ<EFBFBD>
//path:·<><C2B7>+<2B>ļ<EFBFBD><C4BC><EFBFBD>
//mode:<3A><><EFBFBD><EFBFBD>ģʽ
//<2F><><EFBFBD><EFBFBD>ֵ:ִ<>н<EFBFBD><D0BD><EFBFBD>
u8 mf_open(u8*path,u8 mode)
{
u8 res;
res=f_open(file,(const TCHAR*)path,mode);//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
return res;
}
//<2F>ر<EFBFBD><D8B1>ļ<EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:ִ<>н<EFBFBD><D0BD><EFBFBD>
u8 mf_close(void)
{
f_close(file);
return 0;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//len:<3A><><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:ִ<>н<EFBFBD><D0BD><EFBFBD>
u8 mf_read(u16 len)
{
u16 i,t;
u8 res=0;
u16 tlen=0;
printf("\r\nRead file data is:\r\n");
for(i=0;i<len/512;i++)
{
res=f_read(file,fatbuf,512,&br);
if(res)
{
printf("Read Error:%d\r\n",res);
break;
}else
{
tlen+=br;
for(t=0;t<br;t++)printf("%c",fatbuf[t]);
}
}
if(len%512)
{
res=f_read(file,fatbuf,len%512,&br);
if(res) //<2F><><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD><EFBFBD>
{
printf("\r\nRead Error:%d\r\n",res);
}else
{
tlen+=br;
for(t=0;t<br;t++)printf("%c",fatbuf[t]);
}
}
if(tlen)printf("\r\nReaded data len:%d\r\n",tlen);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
printf("Read data over\r\n");
return res;
}
//д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//dat:<3A><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
//len:д<><EFBFBD><EBB3A4>
//<2F><><EFBFBD><EFBFBD>ֵ:ִ<>н<EFBFBD><D0BD><EFBFBD>
u8 mf_write(u8*dat,u16 len)
{
u8 res;
printf("\r\nBegin Write file...\r\n");
printf("Write data len:%d\r\n",len);
res=f_write(file,dat,len,&bw);
if(res)
{
printf("Write Error:%d\r\n",res);
}else printf("Writed data len:%d\r\n",bw);
printf("Write data over.\r\n");
return res;
}
//<2F><><EFBFBD><EFBFBD>Ŀ¼
//path:·<><C2B7>
//<2F><><EFBFBD><EFBFBD>ֵ:ִ<>н<EFBFBD><D0BD><EFBFBD>
u8 mf_opendir(u8* path)
{
return f_opendir(&dir,(const TCHAR*)path);
}
//<2F>ر<EFBFBD>Ŀ¼
//<2F><><EFBFBD><EFBFBD>ֵ:ִ<>н<EFBFBD><D0BD><EFBFBD>
u8 mf_closedir(void)
{
return f_closedir(&dir);
}
//<2F><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:ִ<>н<EFBFBD><D0BD><EFBFBD>
u8 mf_readdir(void)
{
u8 res;
res=f_readdir(&dir,&fileinfo); //<2F><>ȡһ<C8A1><D2BB><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ϣ
if(res!=FR_OK)return res; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
printf("\r\n DIR info:\r\n");
printf("dir.dptr:%d\r\n",dir.dptr);
printf("dir.obj.id:%d\r\n",dir.obj.id);
printf("dir.obj.sclust:%d\r\n",dir.obj.sclust);
printf("dir.obj.objsize:%lld\r\n",dir.obj.objsize);
printf("dir.obj.c_ofs:%d\r\n",dir.obj.c_ofs);
printf("dir.clust:%d\r\n",dir.clust);
printf("dir.sect:%d\r\n",dir.sect);
printf("dir.blk_ofs:%d\r\n",dir.blk_ofs);
printf("\r\n");
printf("File Name is:%s\r\n",fileinfo.fname);
printf("File Size is:%lld\r\n",fileinfo.fsize);
printf("File data is:%d\r\n",fileinfo.fdate);
printf("File time is:%d\r\n",fileinfo.ftime);
printf("File Attr is:%d\r\n",fileinfo.fattrib);
printf("\r\n");
return 0;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
//path:·<><C2B7>
//<2F><><EFBFBD><EFBFBD>ֵ:ִ<>н<EFBFBD><D0BD><EFBFBD>
u8 mf_scan_files(u8 * path)
{
FRESULT res;
res = f_opendir(&dir,(const TCHAR*)path); //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ŀ¼
if (res == FR_OK)
{
printf("\r\n");
while(1)
{
res = f_readdir(&dir, &fileinfo); //<2F><>ȡĿ¼<C4BF>µ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD>
if (res != FR_OK || fileinfo.fname[0] == 0) break; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><>ĩβ<C4A9><CEB2>,<2C>˳<EFBFBD>
//if (fileinfo.fname[0] == '.') continue; //<2F><><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD>Ŀ¼
printf("%s/", path);//<2F><>ӡ·<D3A1><C2B7>
printf("%s\r\n",fileinfo.fname);//<2F><>ӡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
}
}
return res;
}
//<2F><>ʾʣ<CABE><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//drv:<3A>̷<EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:ʣ<><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28>ֽ<EFBFBD>)
u32 mf_showfree(u8 *drv)
{
FATFS *fs1;
u8 res;
u32 fre_clust=0, fre_sect=0, tot_sect=0;
//<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>
res = f_getfree((const TCHAR*)drv,(DWORD*)&fre_clust, &fs1);
if(res==0)
{
tot_sect = (fs1->n_fatent - 2) * fs1->csize;//<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fre_sect = fre_clust * fs1->csize; //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#if _MAX_SS!=512
tot_sect*=fs1->ssize/512;
fre_sect*=fs1->ssize/512;
#endif
if(tot_sect<20480)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>10M
{
/* Print free space in unit of KB (assuming 512 bytes/sector) */
printf("\r\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%d KB\r\n"
"<EFBFBD><EFBFBD><EFBFBD>ÿռ<EFBFBD>:%d KB\r\n",
tot_sect>>1,fre_sect>>1);
}else
{
/* Print free space in unit of KB (assuming 512 bytes/sector) */
printf("\r\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%d MB\r\n"
"<EFBFBD><EFBFBD><EFBFBD>ÿռ<EFBFBD>:%d MB\r\n",
tot_sect>>11,fre_sect>>11);
}
}
return fre_sect;
}
//<2F>ļ<EFBFBD><C4BC><EFBFBD>дָ<D0B4><D6B8>ƫ<EFBFBD><C6AB>
//offset:<3A><><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ<EFBFBD><D6B7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:ִ<>н<EFBFBD><D0BD><EFBFBD>.
u8 mf_lseek(u32 offset)
{
return f_lseek(file,offset);
}
//<2F><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ǰ<EFBFBD><C7B0>дָ<D0B4><D6B8><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>.
//<2F><><EFBFBD><EFBFBD>ֵ:λ<><CEBB>
u32 mf_tell(void)
{
return f_tell(file);
}
//<2F><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>С
//<2F><><EFBFBD><EFBFBD>ֵ:<3A>ļ<EFBFBD><C4BC><EFBFBD>С
u32 mf_size(void)
{
return f_size(file);
}
//<2F><><EFBFBD><EFBFBD>Ŀ¼
//pname:Ŀ¼·<C2BC><C2B7>+<2B><><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:ִ<>н<EFBFBD><D0BD><EFBFBD>
u8 mf_mkdir(u8*pname)
{
return f_mkdir((const TCHAR *)pname);
}
//<2F><>ʽ<EFBFBD><CABD>
//path:<3A><><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"0:"<22><>"1:"
//mode:ģʽ
//au:<3A>ش<EFBFBD>С
//<2F><><EFBFBD><EFBFBD>ֵ:ִ<>н<EFBFBD><D0BD><EFBFBD>
u8 mf_fmkfs(u8* path,u8 mode,u16 au)
{
return f_mkfs((const TCHAR*)path,mode,au);//<2F><>ʽ<EFBFBD><CABD>,drv:<3A>̷<EFBFBD>;mode:ģʽ;au:<3A>ش<EFBFBD>С
}
//ɾ<><C9BE><EFBFBD>ļ<EFBFBD>/Ŀ¼
//pname:<3A>ļ<EFBFBD>/Ŀ¼·<C2BC><C2B7>+<2B><><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:ִ<>н<EFBFBD><D0BD><EFBFBD>
u8 mf_unlink(u8 *pname)
{
return f_unlink((const TCHAR *)pname);
}
//<2F>޸<EFBFBD><DEB8>ļ<EFBFBD>/Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC>ͬ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6>ļ<EFBFBD>Ŷ!)
//oldname:֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//newname:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:ִ<>н<EFBFBD><D0BD><EFBFBD>
u8 mf_rename(u8 *oldname,u8* newname)
{
return f_rename((const TCHAR *)oldname,(const TCHAR *)newname);
}
//<2F><>ȡ<EFBFBD>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD>
//path:<3A><><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"0:"<22><>"1:"
void mf_getlabel(u8 *path)
{
u8 buf[20];
u32 sn=0;
u8 res;
res=f_getlabel ((const TCHAR *)path,(TCHAR *)buf,(DWORD*)&sn);
if(res==FR_OK)
{
printf("\r\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD>%s <20><><EFBFBD>̷<EFBFBD>Ϊ:%s\r\n",path,buf);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>%s <20><><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD>:%X\r\n\r\n",path,sn);
}else printf("\r\n<EFBFBD><EFBFBD>ȡʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%X\r\n",res);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD>11<31><31><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><D6A7><EFBFBD><EFBFBD><EFBFBD>ֺʹ<D6BA>д<EFBFBD><D0B4>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>ֵ<EFBFBD>
//path:<3A><><EFBFBD>̺<EFBFBD>+<2B><><EFBFBD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD><EFBFBD>"0:ALIENTEK"<22><>"1:OPENEDV"
void mf_setlabel(u8 *path)
{
u8 res;
res=f_setlabel ((const TCHAR *)path);
if(res==FR_OK)
{
printf("\r\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD>:%s\r\n",path);
}else printf("\r\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%X\r\n",res);
}
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡһ<C8A1><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
//size:Ҫ<><D2AA>ȡ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
void mf_gets(u16 size)
{
TCHAR* rbuf;
rbuf=f_gets((TCHAR*)fatbuf,size,file);
if(*rbuf==0)return ;//û<><C3BB><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>
else
{
printf("\r\nThe String Readed Is:%s\r\n",rbuf);
}
}
//<2F><>Ҫ_USE_STRFUNC>=1
//дһ<D0B4><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ļ<EFBFBD>
//c:Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:ִ<>н<EFBFBD><D0BD><EFBFBD>
u8 mf_putc(u8 c)
{
return f_putc((TCHAR)c,file);
}
//д<>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
//c:Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:д<><D0B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 mf_puts(u8*c)
{
return f_puts((TCHAR*)c,file);
}

70
FATFS/exfuns/fattester.h Normal file
View File

@@ -0,0 +1,70 @@
#ifndef __FATTESTER_H
#define __FATTESTER_H
#include "sys.h"
#include "ff.h"
//////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
//ALIENTEK STM32<33><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//FATFS <20><><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2016/1/7
//<2F><EFBFBD><E6B1BE>V1.0
//<2F><>Ȩ<EFBFBD><C8A8><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
//Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾ 2014-2024
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
u8 mf_mount(u8* path,u8 mt);
u8 mf_open(u8*path,u8 mode);
u8 mf_close(void);
u8 mf_read(u16 len);
u8 mf_write(u8*dat,u16 len);
u8 mf_opendir(u8* path);
u8 mf_closedir(void);
u8 mf_readdir(void);
u8 mf_scan_files(u8 * path);
u32 mf_showfree(u8 *drv);
u8 mf_lseek(u32 offset);
u32 mf_tell(void);
u32 mf_size(void);
u8 mf_mkdir(u8*pname);
u8 mf_fmkfs(u8* path,u8 mode,u16 au);
u8 mf_unlink(u8 *pname);
u8 mf_rename(u8 *oldname,u8* newname);
void mf_getlabel(u8 *path);
void mf_setlabel(u8 *path);
void mf_gets(u16 size);
u8 mf_putc(u8 c);
u8 mf_puts(u8*c);
#endif