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

📄 libdrive.lst

📁 威望公司MP3 + USB MCU 的参考软件
💻 LST
📖 第 1 页 / 共 4 页
字号:
 219   1      
 220   1      //      WDT = 0X1F;
 221   1              if(drv->Flag.Fat32 != 1){       // FAT16
 222   2                      bFatEntrySizeExp = FAT16ENTRY_SIZEEXP;
 223   2                      bFatEntry512BExp = FAT16ENTRY_512B_EXP;
 224   2      
 225   2              }else{                                  // FAT32
 226   2                      bFatEntrySizeExp = FAT32ENTRY_SIZEEXP;
 227   2                      bFatEntry512BExp = FAT32ENTRY_512B_EXP;
 228   2              }       
 229   1      
 230   1              bFatEntPerSectorExp = drv->bBytesPerSectorExp - bFatEntrySizeExp;//exp of FAT ENTRY size 
 231   1              offset512 = (cluster>>bFatEntry512BExp) & drv->bMaxOffset; //exp of 256
 232   1              if(FatCaching(drv, cluster>>bFatEntPerSectorExp, (BYTE )offset512) != FS_SUCCEED)         //// 256 fat entry pe
C51 COMPILER V8.01   LIBDRIVE                                                              04/17/2008 09:46:00 PAGE 5   

             -r 512b
 233   1                      return 0xffffffff;
 234   1              // cluster&((1<<(FAT_CACHE_SIZEEXP + 8)) - 1) //the fat entry offset of cluster in fat cache buffer, in f
             -at entry unit(2byte) 
 235   1              addr = drv->FatCacheBuffer + 
 236   1                         ((cluster&((1<<(FAT_CACHE_SIZEEXP + bFatEntry512BExp)) - 1)) << bFatEntrySizeExp ); //<< 1, fat entry
             - unit -> byte unit
 237   1                              
 238   1      
 239   1              if(drv->Flag.Fat32 != 1){       // FAT16                
 240   2                      content = (UDWORD)LoadAlien16(addr);    //取出cluster号对应的FAT Entry的content.
 241   2                      if(content >= 0xfff8)    content = 0xffffffff; //content >= 0xfff8表示文件最后一个簇            
 242   2              }else{                                  // FAT32
 243   2                      LoadAlien32(addr, &content);                    //content = (UDWORD)LoadAlien32(addr);
 244   2                      if(content >= 0x0ffffff8)        content = 0xffffffff;
 245   2              }       
 246   1              
 247   1              return content; 
 248   1      #endif
 249   1      }
 250          
 251          #if 0
              static void ScanFat(DRIVE *drv)
              {
                      UDWORD cluster;
              
                      // if FreeClusters = 0xffffffff, need to scan fat    
                      if(drv->FreeClusters != 0xffffffff) return;
              
                      drv->FreeClusters = 0;
                      drv->LastCluster = 0;
                      //the first two cluster is reserved. why drv->TotalClusters + 2???        
                      for(cluster = 2; cluster < drv->TotalClusters + 2; cluster ++){
                              //drv->FatRead(drv, cluster):读取cluster号对应的FAT Entry的content
                              //if(!drv->FatRead(drv, cluster))    //0x00表示该cluster可用
                              if(!ReadFatxx(drv, cluster))    //0x00表示该cluster可用
                              {
                                      drv->FreeClusters ++;
                                      if(!drv->LastCluster)    drv->LastCluster = cluster - 1;
                              }
                      }
              
                      return;
              }
              #endif
 275          
 276          //读取分析系统引导记录DBR,DBR_LBA=MBR.PT[0].RelativeSectors
 277          ///@param DWORD start           The DBR_LBA
 278          static BYTE BootRecordRead(DRIVE *sDrv, UDWORD start)
 279          {
 280   1              BOOT_SECTOR * data boot_sector;
 281   1      //      FSINFO *fsinfo;
 282   1      //      BYTE temp;//UDWORD temp;
 283   1              BYTE *buffer;//UDWORD buffer;
 284   1      //      BYTE exp;
 285   1      //      DWORD size;
 286   1              DRIVE *data drv = sDrv;
 287   1      
 288   1              UartOutText("BootRecordRead() \r\n");                                                             
 289   1              // read the sector that contain the partition table????
 290   1              //假定扇区大小为512bytes
 291   1              buffer = DBUF;    
C51 COMPILER V8.01   LIBDRIVE                                                              04/17/2008 09:46:00 PAGE 6   

 292   1              if(DriveRead((BYTE *)buffer, start, 0) != FS_SUCCEED)
 293   1                      return DRIVE_ACCESS_FAIL;
 294   1              //判断结束标识0xaa55,字节序问题        
 295   1              if(*(WORD *)(buffer + 0x1fe) != 0x55aa){
 296   2                      //drv->Flag.NotFormated = 1;    // toggle this drive is not formated
 297   2                      return FS_SCAN_FAIL;             // not formated sector, return fail 
 298   2              }
 299   1      
 300   1              //Write test
 301   1      #ifdef WRITE_ENABLE_FLAG
                      memcopy(buffer+0x1fe-0x08, "VAION1", 6);
                      DriveWrite(drv, DBUF, start);
                      //UartOutText("-I-: Write Test! \r\n");
              #endif
 306   1      
 307   1              boot_sector = (BOOT_SECTOR *)buffer;
 308   1              UartOutText("boot sector size: ");
 309   1              UartOutValue(sizeof(BOOT_SECTOR), 2);
 310   1              
 311   1              drv->ClusterSize = boot_sector->SectorsPerCluster;
 312   1              // calculate the exponent of 2 for sector-per-cluster
 313   1      #if 0   
                      temp = drv->ClusterSize >> 1;
                      drv->ClusterExp = 0;
                      while(temp){ temp >>= 1;    drv->ClusterExp ++;}
              #else
 318   1              drv->ClusterExp = Value2Exp(drv->ClusterSize);
 319   1      #endif
 320   1      
 321   1              drv->NumberOfFat = boot_sector->NumberOfFATs;
 322   1              //FAT_LBA = DBR_LBA + BPB_wReservedSec
 323   1              drv->FatStart = start + LoadAlien16(&boot_sector->ReservedSectors);
 324   1      
 325   1              drv->FatSize = LoadAlien16(&boot_sector->SectorsPerFAT);
 326   1              if(!drv->FatSize)    LoadAlien32(&boot_sector->BigSectorPerFAT, &drv->FatSize);//drv->FatSize = LoadAlien
             -32(&boot_sector->BigSectorPerFAT);
 327   1      
 328   1      //      drv->TotalClusters = LoadAlien16(&boot_sector->TotalSectors);
 329   1      //      if(!drv->TotalClusters)    LoadAlien32(&boot_sector->BigTotalSectors, &drv->TotalClusters);//drv->Total
             -Clusters = LoadAlien32(&boot_sector->BigTotalSectors);
 330   1      
 331   1              // re-check the FAT type, larger than 12 sectors, must be the FAT16
 332   1              // larger than 256 sectors, must be the FAT32
 333   1              ////must modify to microsoft way(using total cluster count)
 334   1      #if 0   
                      if(drv->FatSize <= 12){
                      //        drv->FatRead = NULL;
                      //        drv->FatWrite = NULL;
                          drv->Flag.Fat32 = 0;
                      }else if(drv->FatSize > 256){
                      //        drv->FatRead = ReadFat32;
                      //        drv->FatWrite = WriteFat32;
                          drv->Flag.Fat32 = 1;
                      }else{
                      //        drv->FatRead = ReadFat16;
                      //        drv->FatWrite = WriteFat16;
                          drv->Flag.Fat32 = 0;
                      }
              #elif 1
 349   1              //drv->Flag.Fat32 = 0;
 350   1              if(drv->bBytesPerSectorExp == 0x09){//for 512b sector we should do the following checking.
 351   2                      if(drv->FatSize > 256){//
C51 COMPILER V8.01   LIBDRIVE                                                              04/17/2008 09:46:00 PAGE 7   

 352   3              //        drv->FatRead = ReadFat32;
 353   3              //        drv->FatWrite = WriteFat32;
 354   3                  drv->Flag.Fat32 = 1;
 355   3                      }
 356   2                      else{
 357   3              //        drv->FatRead = ReadFat16;
 358   3              //        drv->FatWrite = WriteFat16;
 359   3                  drv->Flag.Fat32 = 0;
 360   3              }
 361   2              }
 362   1      #endif
 363   1                  
 364   1      #if 0                   
                      drv->wBytesPerSector = drv->wPhyBlkSize;        //LoadAlien16(&boot_sector->BytesPerSector); 
                      drv->bBytesPerSectorExp = Value2Exp(drv->wBytesPerSector);
                      drv->bMaxOffset = ((1<<(drv->bBytesPerSectorExp - BLKSIZE_512_EXP)) - 1);       
              #endif
 369   1      
 370   1                  
 371   1              if(drv->Flag.Fat32){    //FAT32         
 372   2                  LoadAlien32(&boot_sector->RootDirStartCluster, &drv->RootStart);//drv->RootStart = LoadAlien32(&boot_
             -sector->RootDirStartCluster);
 373   2              //Sector number of FSINFO structure in the reserved area of the FAT32 volume            
 374   2              //    drv->FsInfoAddr = LoadAlien16(&boot_sector->FSInfoSector);
 375   2              //    if(drv->FsInfoAddr != 0xffffffff)    drv->FsInfoAddr += start;//The DBR_LBA+drv->FsInfoAddr
 376   2              //文件目录表FDT的LBA        
 377   2                  //drv->DataStart = drv->FatStart + drv->FatSize * drv->NumberOfFat;
 378   2                  drv->DataStart = drv->FatStart + (drv->FatSize<<1);
 379   2              }else{                            // if  0 mean FAT12 or FAT16          
 380   2                  //drv->RootStart = drv->FatStart + drv->FatSize * drv->NumberOfFat;        
 381   2                  drv->RootStart = drv->FatStart + (drv->FatSize<<1);        
 382   2              //DATA_LBA = FDT_LBA +( 32 * BPB_wRootEntry )/ BPB_wBytesPerSec,假定BPB_wBytesPerSec为512BYTES               
 383   2              //    drv->DataStart = drv->RootStart + (LoadAlien16(&boot_sector->RootEntries) >> 4);
 384   2                  drv->DataStart = drv->RootStart + (LoadAlien16(&boot_sector->RootEntries) >> (drv->bBytesPerSectorExp
             --5));//5 is the exponent of 32
 385   2              //    drv->FsInfoAddr = 0xffffffff;
 386   2              }
 387   1                  
 388   1      //      drv->TotalClusters = (drv->TotalClusters - (drv->DataStart - start)) >> drv->ClusterExp;
 389   1      #if 0
                      drv->FreeClusters = 0xffffffff;
                      if(drv->FsInfoAddr != 0xffffffff){
                              if(DriveRead(drv, (BYTE *)buffer, drv->FsInfoAddr) != FS_SUCCEED)
                                      return DRIVE_ACCESS_FAIL;
                          
                              fsinfo = (FSINFO *)(buffer + FSINFO_OFFSET);
                              if(fsinfo->Signature == FSINFO_SIGNATURE){
                                      LoadAlien32(&fsinfo->FreeClusters, &drv->FreeClusters);//drv->FreeClusters = LoadAlien32(&fsinfo
             -->FreeClusters);
                                      LoadAlien32(&fsinfo->NextFree, &drv->LastCluster);//drv->LastCluster = LoadAlien32(&fsinfo->Next
             -Free);
                              }
                      }
              #endif  
 402   1      
 403   1      #if 1
 404   1              UartOutText("drv->ClusterSize: ");                      UartOutValue(drv->ClusterSize, 2);
 405   1              UartOutText("drv->NumberOfFat: ");              UartOutValue(drv->NumberOfFat, 2);
 406   1              UartOutText("drv->RootStart: ");                        UartOutValue(drv->RootStart, 8);
 407   1              UartOutText("drv->FatStart: ");                         UartOutValue(drv->FatStart, 8);
 408   1              UartOutText("drv->FatSize: ");                          UartOutValue(drv->FatSize, 8);
 409   1      //      UartOutText("drv->TotalClusters: ");            UartOutValue(drv->TotalClusters, 8);
C51 COMPILER V8.01   LIBDRIVE                                                              04/17/2008 09:46:00 PAGE 8   

 410   1              UartOutText("drv->wBytesPerSector: ");          UartOutValue(drv->wBytesPerSector, 4);  
 411   1              UartOutText("drv->bBytesPerSectorExp: ");       UartOutValue(drv->bBytesPerSectorExp, 2);               
 412   1      #endif
 413   1      
 414   1              return FS_SUCCEED;  
 415   1      }
 416          
 417          #if 1
 418          // Means that the first sector without partition table,
 419          // so check whether the first sector is boot record or not.
 420          // if yes , then check boot record. If not , then the card is
 421          // not formatted.
 422          static int FloppyCheck(DRIVE *drv)
 423                  {
 424   1          BYTE *buffer;
 425   1                                        
 426   1          // read the sector that contain the partition table??????
 427   1          //check whether the first sector is BPB/boot sector?
 428   1          //buffer = (BYTE *)OsTempMemAllocate(); 
 429   1              buffer = DBUF;
 430   1          if(DriveRead(buffer, 0, 0) != FS_SUCCEED)
 431   1              {
 432   2              //OsTempMemRelease((DWORD)buffer);
 433   2              return DRIVE_ACCESS_FAIL;
 434   2              }
 435   1          
 436   1          if(*(WORD *)(buffer + 0x1fe) != 0x55aa)
 437   1              {
 438   2                      //OsTempMemRelease((DWORD)buffer);
 439   2              return FS_SCAN_FAIL;                    // not formated sector, return fail
 440   2              }
 441   1          
 442   1          if(!memcomp(buffer + 0x36, "FAT12", 5)) //not support
 443   1              {

⌨️ 快捷键说明

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