📄 libdrive.lst
字号:
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 + -