📄 znfat.lst
字号:
144 - 函数属性:内部
145 - 参数说明:cluster:要清空的簇的簇号
146 - 返回说明:无
147 **************************************************************************/
148 #ifdef ZNFAT_EMPTY_CLUSTER
void znFAT_Empty_Cluster(UINT32 Cluster)
{
UINT32 iSec;
UINT16 i;
for(i=0;i<pArg->BytesPerSector;i++)
{
znFAT_Buffer[i]=0;
}
for(iSec=SOC(Cluster);iSec<SOC(Cluster)+pArg->SectorsPerClust;iSec++)
{
znFAT_WriteSector(iSec,znFAT_Buffer);
}
}
#endif
165 /***********************************************************************
166 - 功能描述:获取剩余容量
167 - 隶属模块:znFAT文件系统模块
168 - 函数属性:外部,使用户使用
169 - 参数说明:无
170 - 返回说明:剩余容量,单位字节
171 - 注:从FSInfo中读取空闲簇数,而从计算得到剩余的容量,单位字节
172 ***********************************************************************/
173 #ifdef znFAT_GET_REMAIN_CAP
UINT32 znFAT_Get_Remain_Cap(void)
{
znFAT_ReadSector(1+pArg->BPB_Sector_No,znFAT_Buffer);
if(((struct FSInfo *)znFAT_Buffer)->Free_Cluster[0]==0xff
&& ((struct FSInfo *)znFAT_Buffer)->Free_Cluster[1]==0xff
C51 COMPILER V8.09 ZNFAT 05/19/2011 23:29:42 PAGE 4
&& ((struct FSInfo *)znFAT_Buffer)->Free_Cluster[2]==0xff
&& ((struct FSInfo *)znFAT_Buffer)->Free_Cluster[3]==0xff)
return pArg->Total_Size;
else
return LE2BE(((struct FSInfo *)znFAT_Buffer)->Free_Cluster,4)*pArg->SectorsPerClust*pArg->BytesPerSector;
-
}
#endif
188
189 //--------------------------------------------
190
191 /******************************************************************
192 - 功能描述:将小字字符转为大写
193 - 隶属模块:znFAT文件系统模块
194 - 函数属性:内部
195 - 参数说明:c:要转换为大写的字符
196 - 返回说明:要转换的字节的相应的大写字符
197 - 注:只对小写字符有效,如果不是a~z的小写字符,将直接返回
198 ******************************************************************/
199
200 INT8 L2U(INT8 c)
201 {
202 1 if(c>='a' && c<='z') return c+'A'-'a';
203 1 else return c;
204 1 }
205
206 /***********************************************************************
207 - 功能描述:得到DBR所在的扇区号(如果没有MBR,则DBR就在0扇区)
208 - 隶属模块:znFAT文件系统模块
209 - 函数属性:内部
210 - 参数说明:无
211 - 返回说明:DBR的扇区地址
212 - 注:DBR中包含了很多有用的参数信息,因此正确定位DBR扇区的位置,是极为
213 重要的,后面将有专门的函数对DBR进行解析,正确解析DBR是实现znFAT的
214 基础
215 ***********************************************************************/
216
217 UINT16 znFAT_Find_DBR(void)
218 {
219 1 UINT16 sec_dbr;
220 1 znFAT_ReadSector(0,znFAT_Buffer);
221 1 if(znFAT_Buffer[0]!=0xeb)
222 1 {
223 2 sec_dbr=LE2BE(((((struct PartSector *)(znFAT_Buffer))->Part[0]).StartLBA),4);
224 2 }
225 1 else
226 1 {
227 2 sec_dbr=0;
228 2 }
229 1 return sec_dbr;
230 1 }
231
232 /***********************************************************************
233 - 功能描述:获取分区的总容量
234 - 隶属模块:znFAT文件系统模块
235 - 函数属性:外部,使用户使用
236 - 参数说明:无
237 - 返回说明:分区容量值,单位为字节
238 - 注:这里得到的总容量是znFAT分区的容量,一定小于实际的物理容量
239 ***********************************************************************/
240 #ifdef ZNFAT_GET_TOTAL_SIZE
C51 COMPILER V8.09 ZNFAT 05/19/2011 23:29:42 PAGE 5
UINT32 znFAT_Get_Total_Size(void)
{
return pArg->Total_Size;
}
#endif
248 /***********************************************************************
249 - 功能描述:读取FSInfo获取最近的一个可用空闲簇
250 - 隶属模块:znFAT文件系统模块
251 - 函数属性:内部
252 - 参数说明:无
253 - 返回说明:最近的一个可用空闲簇
254 - 注:znFAT中的FSInfo扇区(绝对1扇区)中记录了最近的一个可用空闲簇
255 ***********************************************************************/
256
257 UINT32 Search_Last_Usable_Cluster(void)
258 {
259 1 znFAT_ReadSector(1+pArg->BPB_Sector_No,znFAT_Buffer);
260 1 return LE2BE(((struct FSInfo *)znFAT_Buffer)->Last_Cluster,4);
261 1 }
262
263 /***********************************************************************
264 - 功能描述:znFAT文件系统初始化
265 - 隶属模块:znFAT文件系统模块
266 - 函数属性:外部,使用户使用
267 - 参数说明:znFAT_Init_Arg类型的结构体指针,用于装载一些重要的参数信息,
268 以备后面使用
269 - 返回说明:无
270 - 注:在使用znFAT前,这个函数是必须先被调用的,将很多参数信息装入到
271 arg指向的结构体中,比如扇区大小、根目录的位置、FAT表大小等等。
272 这些参数绝大部分是来自于DBR的BPB中,因此此函数主要在作对DBR的参数解析
273 ***********************************************************************/
274
275 void znFAT_Init(void)
276 {
277 1 struct znFAT_BPB *bpb;
278 1
279 1 bpb=(struct znFAT_BPB *)(znFAT_Buffer); //将数据缓冲区指针转为struct znFAT_BPB 型指针
280 1
281 1 pArg->DEV_No=Dev_No; //装入设备号
282 1
283 1 pArg->BPB_Sector_No =znFAT_Find_DBR(); //znFAT_FindBPB()可以返回BPB所在的扇区号
284 1
285 1 znFAT_ReadSector(pArg->BPB_Sector_No,znFAT_Buffer);
286 1
287 1 pArg->FATsectors =LE2BE((bpb->BPB_FATSz32) ,4);//装入FAT表占用的扇区数到FATsectors中
288 1 pArg->FirstDirClust =LE2BE((bpb->BPB_RootClus) ,4);//装入根目录簇号到FirstDirClust中
289 1 pArg->BytesPerSector =LE2BE((bpb->BPB_BytesPerSec),2);//装入每扇区字节数到BytesPerSector中
290 1 pArg->SectorsPerClust =LE2BE((bpb->BPB_SecPerClus) ,1);//装入每簇扇区数到SectorsPerClust 中
291 1 pArg->FirstFATSector =LE2BE((bpb->BPB_RsvdSecCnt) ,2)+pArg->BPB_Sector_No;//装入第一个FAT表扇区号到First
-FATSector 中
292 1 pArg->FirstDirSector =(pArg->FirstFATSector)+(bpb->BPB_NumFATs[0])*(pArg->FATsectors); //装入第一个目录
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -