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 + -
显示快捷键?