main.c
来自「AT91SAM7X256」· C语言 代码 · 共 659 行 · 第 1/2 页
C
659 行
*/
//----------------------------------
void _show_free(const char *device) {
FS_DISKFREE_T disk_data;
int x;
_log("Disk information of ");
_log(device);
_log("\r\n");
AT91F_DBGU_Printk("Show Disk information:\r\n") ;
x = FS_IoCtl(device,FS_CMD_GET_DISKFREE,0,(void*) &disk_data);
if (x==0) {
sprintf(mybuffer,"total clusters : %lu\navailable clusters : %lu\nsectors/cluster : %u\nbytes per sector : %u\n",
disk_data.total_clusters, disk_data.avail_clusters, disk_data.sectors_per_cluster, disk_data.bytes_per_sector);
_log(mybuffer);
AT91F_DBGU_Printk(mybuffer) ; //显示磁盘信息
}
else {
_error("Invalid drive specified\n");
AT91F_DBGU_Printk("Invalid drive specified\n") ;
}
}
/*********************************************************************
*
* Global functions
*
**********************************************************************
*/
//------------ 检测磁盘是否被改变过 ----------
/*
* DiskChange
*/
//---------------------------------------------------------------------
#if (((FS_USE_SMC_DRIVER) && (FS_SMC_HW_NEEDS_POLL)) || ((FS_USE_MMC_DRIVER) && (FS_MMC_HW_NEEDS_POLL)) \
|| ((FS_USE_IDE_DRIVER) && (FS_IDE_HW_NEEDS_POLL)))
void DiskChange(void) {
char name[8];
int i;
while (1) {
#if ((FS_USE_SMC_DRIVER) && (FS_SMC_HW_NEEDS_POLL))
for (i=0;i<FS_SMC_MAXUNIT;i++) {
sprintf(name,"smc:%d:",i);
FS_IoCtl(name,FS_CMD_CHK_DSKCHANGE,0,0); /* check smc socket periodically */
}
#endif
#if ((FS_USE_MMC_DRIVER) && (FS_MMC_HW_NEEDS_POLL))
for (i=0;i<FS_MMC_MAXUNIT;i++) {
sprintf(name,"mmc:%d:",i);
FS_IoCtl(name,FS_CMD_CHK_DSKCHANGE,0,0); /* check mmc socket periodically */
}
#endif
#if ((FS_USE_IDE_DRIVER) && (FS_IDE_HW_NEEDS_POLL))
for (i=0;i<FS_IDE_MAXUNIT;i++) {
sprintf(name,"ide:%d:",i);
FS_IoCtl(name,FS_CMD_CHK_DSKCHANGE,0,0); /* check ide socket periodically */
}
#endif
#if (FS_OS_EMBOS)
OS_Delay (300);
#endif
}
}
#endif
//********************************************************************
/*void delay(int n)
{
for(;n>1;)
n-- ;
}
*/
//*******************************************************************
//一旦对目标进行文件操作,就会出现段定义的错误,可能是没有设置好环境
void main(void)
{
char ch;
AT91F_DBGU_Init() ;
// AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; //禁止所有中断
BSP_Init(); //初始化时钟节拍(Timer0)
OSInit(); //初始化 "uC/OS-II, 实时操作系统内核"
if(FS_Init())
AT91F_DBGU_Printk("File sys Init fault !") ;
else
AT91F_DBGU_Printk("File sys Init OK !") ;
for(int n=100;n>0;n--)
{
if(disk_initialize()==0x0)
{
AT91F_DBGU_Printk("SD/MMC inited OK !");
break ;
}
}
//************************
Print_FS_Option_description() ; //打印文件操作功能表
while(1)
{
ch=GetChar() ;
if((ch>='a') && (ch<='z'))
ch=ch-'a'+'A' ;
if((ch>='A') && (ch<='Z'))
{
Menu_FS_mmc_SD(ch) ;
ch=0 ;
}
}
}
//-------------- 操作界面 ---------------
void Menu_FS_mmc_SD(char option)
{
//**************** define some variables *******************
// FS_FILE *myfile ;
char *TxtBuff ; //要写入文件的内容 ,同时作为提示信息
char *FileName; //要操作的文件名
char Temp[50] ; //由于指针操作时,后面的指针内容会替换先前的指针,所以用中间变量中专
char *FolderName; //要操作的文件夹名 ( 需要全路径 )
unsigned long x ; //返回状态
// const char * Device ; //磁盘盘符
char Getch ;
//********************** end define ***********************
//文件系统的可开始操作接口
switch (option)
{
case 'T' :
Print_FS_Option_description() ; //打印文件操作功能表
for(int cn=0;cn<10000;cn++) ; //暂停等待
break ;
case 'W' : //写(建立)文件
{
//************ get paraters***********/
AT91F_DBGU_Printk("\r\n Input file name : \r\n") ;
FileName=AT91F_DBGU_scanf("%x") ;
for(int n=0;FileName[n]!='\0';n++) //保留第一个参数的副本
{
Temp[n]=FileName[n] ;
Temp[n+1]='\0' ;
}
AT91F_DBGU_Printk("\r\n Input file data : ") ;
TxtBuff=AT91F_DBGU_scanf("%x") ;
FileName=Temp ; //恢复第一个参数
AT91F_DBGU_Printk("\r\n now ,filename are:\r\n") ;
AT91F_DBGU_Printk(FileName) ;
AT91F_DBGU_Printk("\r\n now ,fileText are:\r\n") ;
AT91F_DBGU_Printk(TxtBuff) ;
_write_file(FileName, TxtBuff) ; //写如数据
/* myfile = FS_FOpen(FileName, "w");
if (!myfile)
{
_error("Could not write file");
AT91F_DBGU_Printk("Could not write file \r\n") ;
}
else
{
FS_FWrite(TxtBuff,1,strlen(TxtBuff), myfile);
FS_FClose(myfile);
AT91F_DBGU_Printk(FileName) ;
AT91F_DBGU_Printk(" created ok! \r\n") ;
}
*/
}
break ;
case 'R' : // 读文件内容
{
/*测试一个写入的文件*/
FileName="" ;
AT91F_DBGU_Printk("Input file name : \r\n") ;
FileName=AT91F_DBGU_scanf("%x") ;
// _dump_file(FileName) ;
myfile = FS_FOpen(FileName,"r") ;
if (myfile)
{
// read until EOF has been reached
do {
x = FS_FRead((void *)TxtBuff,1,sizeof(TxtBuff)-1,myfile);
TxtBuff[x]=0;
if (x)
{
_log((const char *)TxtBuff);
}
} while (x);
FS_FClose(myfile) ;
AT91F_DBGU_Printk((char *)TxtBuff) ;
}
else
AT91F_DBGU_Printk("\r\ncan't read the file or no such a file.\r\n") ;
}
break ;
case 'S' : // 读显示磁盘空间 (show space )
{
/* AT91F_DBGU_Printk("now,show the free space of Device: mmc: \r\n") ;
_show_free("mmc") ;
*/
AT91F_DBGU_Printk("Input the directory : \r\n") ;
FileName=AT91F_DBGU_scanf("%x") ;
_show_directory(FileName) ;
}
break ;
case 'G' : // 检测磁盘介质的改变
{
#if (((FS_USE_SMC_DRIVER) && (FS_SMC_HW_NEEDS_POLL)) || ((FS_USE_MMC_DRIVER) && (FS_MMC_HW_NEEDS_POLL)) \
|| ((FS_USE_IDE_DRIVER) && (FS_IDE_HW_NEEDS_POLL)))
AT91F_DBGU_Printk("now check the change of mmc: \r\n") ;
char name[8];
int i;
while (1)
{
#if ((FS_USE_MMC_DRIVER) && (FS_MMC_HW_NEEDS_POLL))
for (i=0;i<FS_MMC_MAXUNIT;i++)
{
sprintf(name,"mmc:%d:",i);
if(FS_IoCtl(name,FS_CMD_CHK_DSKCHANGE,0,0)!=(-1)); /* check mmc socket periodically */
{
; // juge the slote
}
}
#endif
}
#endif
}
case 'F': //Format the current disk
{
x = FS_IoCtl("mmc:",FS_CMD_FORMAT_MEDIA,FS_MEDIA_SD_128MB,0);
// x = FS_IoCtl("mmc:",FS_CMD_FORMAT_AUTO,FS_MEDIA_SD_128MB,0);
if (x!=0)
{
_error("Cannot format mmc disk.\n");
AT91F_DBGU_Printk("can't format mmc disk ok.\r\n") ;
}
else
AT91F_DBGU_Printk("mmc disk Formated OK.\r\n") ;
}
break ;
case 'X': // 显示当前文件所有的文件
{ /*
需要遍历所有的目录,方法如下:1:FS_OpenDir() ;2:FS_ReadDir(); 3:FS_RewindDir();
2 , 3步反复遍历 ,结束后调用 4:FS_CloseDir() ;关闭目录
*/
}
break ;
case 'M': // 建立目录 (Make Dir)
{
AT91F_DBGU_Printk("\r\n enter folder name to create. \r\n") ;
for(int cn=0;cn<2000;cn++) ;
// FolderName :要建立的文件夹的路径,如:mp3 ,但是不要给出盘符,如
// 文件:mmc:\\dir1\asp.txt .此时需要去掉 mmc:\\
FolderName=AT91F_DBGU_scanf("%x") ; //需要给出文件夹的全路径
AT91F_DBGU_Printk("\r\nThe FolderName are:\r\n");
AT91F_DBGU_Printk(FolderName) ;
/* for(int j=0;(FolderName[j]!='\0');j++) //调试中检查输入是否错误
{
if((FolderName[j]=='\r') ||(FolderName[j]=='\n'))
{
AT91F_DBGU_Printk("FolderName has \\ r or \\ n !") ;
break ;
}
}
*/
if(FS_MkDir(FolderName)==0)
AT91F_DBGU_Printk("New Folder created. \r\n") ;
else
AT91F_DBGU_Printk("Can't create the Folder. \r\n") ;
}
break ;
case 'D': // 删除文件或文件夹(Delete )
{
AT91F_DBGU_Printk("remove file or folder ? \r\n 1: folder ; 2: file \r\n") ;
for(int cn=0;cn<2000;cn++) ; //延时等待
Getch=GetChar() ;
if(Getch=='1') // 删除文件夹
{
AT91F_DBGU_Printk("Enter the folder name that you want remove. \r\n") ;
FolderName=AT91F_DBGU_scanf("%x") ; //
if(FS_RmDir(FolderName)==0 )
AT91F_DBGU_Printk("Folder has been removed. \r\n") ;
else
AT91F_DBGU_Printk("No such a Folder or not be removed. \r\n") ;
}
else if(Getch=='2') //删除文件
{
AT91F_DBGU_Printk("Please enter the File name that you want Remove. \r\n") ;
FileName=AT91F_DBGU_scanf("%x") ;
if(FS_Remove(FileName)==0) //正确,返回 0
AT91F_DBGU_Printk("The file Removed . \r\n") ;
else //报错
AT91F_DBGU_Printk("No such a File,or cannot be Remove . \r\n") ;
}
}
break ;
default :
{
AT91F_DBGU_Printk("Not a avalid command(a~z),please try it again.\r\n") ;
for(int cn=0;cn<5000;cn++) ;
}
break ;
}
} // end main func
//_______________________________产生操作的提示输入信息__________________________
void Print_FS_Option_description(void)
{
//建立文件 C 可以在写入文件 W 操作中完成
AT91F_DBGU_Printk("\r\n*** mmc FS option tables :*** \r\n \
T: show mmc FS option table\r\n \
W: write or create a file. \r\n \
R: Read a existent file . \r\n \
S: Show mmc/sdc directory. \r\n \
G: Check mmc disk change . \r\n \
F: Format the mmc/sd . \r\n \
M: Make a directory . \r\n \
D: Del a exist file or DIR.\r\n ");
}
//____________________________end Print_FS_Option_description()__________________
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?