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