⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libdir.lst

📁 威望公司MP3 + USB MCU 的参考软件
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.01   LIBDIR                                                                04/17/2008 09:45:58 PAGE 1   


C51 COMPILER V8.01, COMPILATION OF MODULE LIBDIR
OBJECT MODULE PLACED IN .\Debug\libdir.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE file\libdir.c LARGE OPTIMIZE(9,SIZE) NOINTPROMOTE INCDIR(.\common;.\e2prom;
                    -.\file;.\fmtx;.\ir;.\keyboard;.\lcm;.\led;.\main;.\matrixkey;.\mp3ctrl;.\sd;.\usbhost;.\include;.\lib) DEBUG OBJECTEXTEN
                    -D PRINT(.\Debug\libdir.lst) OBJECT(.\Debug\libdir.obj)

line level    source

   1          /****************************************************************
   2          *                      Viaon Technology (Suzhou) Co.,Ltd
   3          *
   4          *    Copyright 2007, Viaon Technology (Suzhou) Co.,Ltd,Suzhou,China
   5          *                    All rights reserved.
   6          *
   7          *
   8          * Filename:             libdir.c
   9          *
  10          * Programmer:           Greg 
  11          *
  12          * Created:              1/2/2008
  13          *
  14          * Description:          public functions 
  15          *              
  16          *        
  17          * Change History (most recent first):   2008.1.2
  18          ****************************************************************/
  19          //#include <string.h>
  20          
  21          #include "utiltypedef.h"
  22          #include "common.h"
  23          #include "va4010reg.h"
  24          #include "libfat.h"
  25          #include "libdir.h"
  26          #include "libdrive.h"
  27          #include "libchain.h"
  28          #include "libfile.h"
  29          
  30          //static BYTE LongNameFdbCount;
  31          
  32          /////////////////////////////////
  33          static BYTE DirCaching(DRIVE *drv)
  34          {
  35   1      #if 0
                      CHAIN *dir;
                      DWORD sector;
                      //In function DirReset(), drv->DirStackPoint has been set to zero.
                      dir = (CHAIN *)((BYTE *)drv->DirStackBuffer + drv->DirStackPoint);      
                      //获得dir所在的sector number
                      sector = ChainCurrentSector(drv, dir);
                      
                      //该sector不在DirCacheBuffer中
                      if(sector != drv->DirCachePoint){
                              if(DriveRead(drv, (BYTE *)drv->DirCacheBuffer, sector, 0)){
                                      return DRIVE_ACCESS_FAIL;
                              }
                              //drv->Flag.DirCacheChanged = 0;                
                              drv->DirCachePoint = sector;            // update dir cache lba                 
                      }
              
                      drv->Node = (FDB *)((BYTE *)drv->DirCacheBuffer + ( dir->Point & 0x000001ffL ) );
                      return FS_SUCCEED;
C51 COMPILER V8.01   LIBDIR                                                                04/17/2008 09:45:58 PAGE 2   

              #else
  55   1              CHAIN *dir;
  56   1              DWORD sector;
  57   1              DWORD offset;
  58   1      
  59   1              //UartOutText("DirCaching() start \r\n");
  60   1              
  61   1              //In function DirReset(), drv->DirStackPoint has been set to zero.
  62   1      //      WDT = 0X1F;
  63   1              dir = (CHAIN *)((BYTE *)drv->DirStackBuffer + drv->DirStackPoint);      
  64   1              //获得dir所在的sector number
  65   1              sector = ChainCurrentSector(dir);
  66   1              offset = ChainGetOffset(dir);
  67   1              //offset = (dir->Point >> BLKSIZE_512_EXP)&((1<<(drv->bBytesPerSectorExp - BLKSIZE_512_EXP)) - 1);
  68   1      #if 0   
                      UartOutText("dir sector: ");UartOutValue(sector, 8);
                      UartOutText("dir offset: ");UartOutValue(offset, 8);    
                      UartOutText("dir->Current: ");UartOutValue(dir->Current, 8);    
                      UartOutText("dir->Start: ");UartOutValue(dir->Start, 8);        
                      UartOutText("dir->Point: ");UartOutValue(dir->Point, 8);        
                      UartOutText("dir->Size: ");UartOutValue(dir->Size, 8);          
              #endif  
  76   1              //该sector不在DirCacheBuffer中
  77   1              if((sector != drv->DirCachePoint)||(offset != drv->DirCacheOffset)){
  78   2                      //if(DriveRead512(drv, (BYTE *)drv->DirCacheBuffer, sector, offset)){
  79   2                      if(DriveRead((BYTE *)drv->DirCacheBuffer, sector, offset)){
  80   3                              return DRIVE_ACCESS_FAIL;
  81   3                      }
  82   2                      //drv->Flag.DirCacheChanged = 0;                
  83   2                      drv->DirCachePoint = sector;            // update dir cache lba 
  84   2                      drv->DirCacheOffset = offset; 
  85   2              }
  86   1      
  87   1              drv->Node = (FDB *)((BYTE *)drv->DirCacheBuffer + ( dir->Point & 0x000001ffL ) );
  88   1      //      UartOutText("dir Point: ");UartOutValue(dir->Point, 8);         
  89   1              return FS_SUCCEED;
  90   1      
  91   1      #endif  
  92   1      }
  93          
  94          #if 0
              // scanning down the FDB one by one to extract out the file name
              BYTE ScanFileName(DRIVE *drv)
              {
                      WORD *point16;
                      BYTE *name;
                      FDB *node;
                      LONG_NAME *lnode;
                      BYTE victim;
                      
                      node = (FDB *)(drv->Node);
                      lnode = (LONG_NAME *)(drv->Node);               
                      victim = node->Name[0];
              
                      if(victim == 0x2e || victim == 0xe5)
                              return FILENAME_SCAN_CONTINUE;                          // if '.' or '..' or deleted then bypass
                              
                      else if(lnode->Attribute1 == 0x0f && lnode->Attribute2 == 0){
              #if 0           
                              // if first = 0x4n mean this node is the last node of this long file name, n is its order
                              if(victim & 0x40)       
                                      {
C51 COMPILER V8.01   LIBDIR                                                                04/17/2008 09:45:58 PAGE 3   

                                      drv->DirAuxPoint = ( victim - 0x41 ) * 13;
                                      LongNameFdbCount = victim - 0x40;
                                      }
                              else
                                      drv->DirAuxPoint -= 13;
                              
                              point16 = drv->Name + drv->DirAuxPoint;
                              point16 = LoadAlienArray16(point16, lnode->Name0, 10);
                              point16 = LoadAlienArray16(point16, lnode->Name1, 12);
                              point16 = LoadAlienArray16(point16, lnode->Name2, 4);
                              
                              if(victim & 0x40)
                                      {
                                      *point16 = 0;
                                      point16 -= 13;
                                      while(*point16 != 0x0000 && *point16 != 0xffff) point16 ++;
                                      *point16 = 0;
                                      
                                      drv->Flag.LongNameHit = 1;
                                      }
              #endif                                          
                              return FILENAME_SCAN_CONTINUE;
                      }else if(node->Attribute & FDB_LABEL)
                              return FILENAME_SCAN_CONTINUE;                          // if this node is a sub-dir then bypass
                      else{
                              if(!drv->Flag.LongNameHit){     // if long filename string not exist then read the short name
                                      point16 = drv->Name;
                                      name = &node->Name[0];
                                      for(victim = 0; victim<8 && *name!=0x20; victim ++){
                                              *point16 = *name;
                                              point16 ++;name ++;
                                      }
                                              
                                      if(node->Extension[0] != 0x20){
                                              *point16 = '.';
                                              //*point16 ++;//gregxu????
                                              point16 ++;
                                      
                                              name = &node->Extension[0];
                                              for(victim = 0; victim<3 && *name!=0x20; victim ++){
                                                      *point16 = *name;
                                                      point16 ++;             name ++;
                                              }
                                      }
                                              
                                      *point16 = 0;           // add a string terminator                      
              //                      LongNameFdbCount = 0;
                              }else{
                                      drv->Flag.LongNameHit = 0;
                              }
                                      
                              return FS_SUCCEED;
                      }
                              
              }
              #endif
 172          
 173          BYTE PreviousNode(DRIVE *drv)
 174          {
 175   1              CHAIN *dir;
 176   1              
 177   1              dir = (CHAIN *)((BYTE *)drv->DirStackBuffer + drv->DirStackPoint);
C51 COMPILER V8.01   LIBDIR                                                                04/17/2008 09:45:58 PAGE 4   

 178   1                                           
 179   1              // if at the first node then return 0                                
 180   1              if(!dir->Point) 
 181   1                      return BEGIN_OF_DIR;
 182   1      
 183   1              if(ChainSeek(dir, dir->Point - sizeof(FDB)) != FS_SUCCEED) 
 184   1                      return ABNORMAL_STATUS;
 185   1              
 186   1              if(DirCaching(drv) == FS_SUCCEED) 
 187   1                      return FS_SUCCEED;
 188   1              return ABNORMAL_STATUS;
 189   1      }
 190          
 191          ///
 192          ///@ingroup     DIRECTORY
 193          ///@brief       Move to next node
 194          ///
 195          ///@param       DRIVE *drv              The drive to access
 196          ///
 197          ///@return END_OF_DIR mean already at the last node
 198          ///@return ABNORMAL_STATUS move fail
 199          ///@return OUT_OF_RANGE mean at the end of chain
 200          ///@return FS_SUCCEED mean move successful
 201          BYTE NextNode(DRIVE *drv)
 202          {
 203   1              CHAIN *dir;
 204   1      
 205   1              dir = (CHAIN *)((BYTE *)drv->DirStackBuffer + drv->DirStackPoint);
 206   1                                
 207   1              // if Name[0]=0 mean there is no sequencial entry                         
 208   1              if(!drv->Node->Name[0])                 return END_OF_DIR;
 209   1      
 210   1              // if at the end of chain then quit
 211   1              //if(dir->Point + sizeof(FDB) >= dir->Size)             return OUT_OF_RANGE;
 212   1              if((dir->Point + sizeof(FDB)) > dir->Size)              return END_OF_DIR;
 213   1              
 214   1              if(ChainSeek(dir, dir->Point + sizeof(FDB)) != FS_SUCCEED) return ABNORMAL_STATUS;
 215   1              if(DirCaching(drv) != FS_SUCCEED) return ABNORMAL_STATUS;
 216   1      
 217   1              // if Name[0]=0 mean there is no sequencial entry                         
 218   1              if(!drv->Node->Name[0])         return END_OF_DIR;
 219   1      
 220   1              return FS_SUCCEED;
 221   1      }
 222          
 223          BYTE FirstNode(DRIVE *drv)
 224          {
 225   1              CHAIN *dir;
 226   1              
 227   1              dir = (CHAIN *)((BYTE *)drv->DirStackBuffer + drv->DirStackPoint);
 228   1              ChainSeekSet(dir);
 229   1              if(DirCaching(drv) != FS_SUCCEED)
 230   1                      return ABNORMAL_STATUS;
 231   1              
 232   1              return FS_SUCCEED;
 233   1      }
 234          
 235          BYTE DirReset(DRIVE *drv)
 236          {
 237   1              DWORD start, size;
 238   1      //      CHAIN *dir;
 239   1      //      WORD *string;
C51 COMPILER V8.01   LIBDIR                                                                04/17/2008 09:45:58 PAGE 5   

 240   1      
 241   1              drv->DirStackPoint = 0;
 242   1              drv->DirCachePoint = 0xffffffff;
 243   1              drv->DirCacheOffset = 0xff;     
 244   1              drv->Flag.LongNameHit = 0;
 245   1      #if 0   
                      string = drv->Path;
                      *string = 0x5c;
                      string ++;
              //      string = StringCopy0816(string, Mcard_GetDescriptor(drv->DevID));
                      string = StringCopy0816(string, "SD");
                      if(drv->Partition){
                              *string = 0x30 + drv->Partition;
                              string ++;
                      }
                      *string = 0x5c;
                      string ++;
                      *string = 0;
              #endif
 259   1      
 260   1              if(drv->Flag.Fat32)     {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -