📄 disk.c
字号:
/*
;*****************************************************************************************************
;* Copyright (c) 2006 by JiaoJinXing.
;* All rights reserved.
;*
;*---- 文件信息 --------------------------------------------------------------------------------------
;* 文 件 名 : Disk.c
;* 创 建 人 : 焦进星
;* 描 述 : 磁盘管理文件
;*
;*---- 历史版本信息 ----------------------------------------------------------------------------------
;* 日 期 : 2008年 12 月 15 日
;* 创 建 人 : 焦进星
;* 描 述 : 建立版本 V1.0.0
;*
;*---- 联系方式 --------------------------------------------------------------------------------------
;* Email : wyoujtg@163.com
;* Web : http://wyoujtg.blog.163.com
;*****************************************************************************************************
;*/
#include "minifs.h"
/*
;*****************************************************************************************************
;* 函数名称 : Disk_Init
;* 描 述 : 磁盘初始化
;* 输 入 : 无
;*
;* 输 出 : TRUE OR FALSE
;*****************************************************************************************************
;*/
uint8 Disk_Init(void)
{
uint8 *Buf;
uint8 NumFATs;
uint32 RootSecCnt;
uint32 FATSz;
uint32 TotSec;
if (!Init_IDE())
{
return FALSE;
}
Buf = OpenSector(0);
if (Buf == NULL)
{
return FALSE;
}
/* 每扇区字节数 */
if (GET_UINT16(Buf, BPB_BytsPerSec) != 512) /* 必须为512 */
{
return FALSE;
}
/* 检查0扇区末尾是否为0xAA55 */
if (GET_UINT16(Buf, 510) != 0xAA55)
{
return FALSE;
}
/* 保留扇区数 */
/* 第一张FAT表开始扇区 */
FS_FATStartSec = GET_UINT16(Buf, BPB_RsvdSecCnt);
/* FAT表数 */
NumFATs = Buf[BPB_NumFATs];
/* 每张FAT表占扇区数 */
FATSz = GET_UINT16(Buf, BPB_FATSz16);
if (FATSz == 0)
FATSz = GET_UINT32(Buf, BPB_FATSz32);
/* 根目录目录项数 */
FS_RootEntCnt = GET_UINT16(Buf, BPB_RootEntCnt);
/* 根目录开始扇区 */
FS_RootDirStartSec = FS_FATStartSec + FATSz * NumFATs;
/* 根目录占扇区数 */
RootSecCnt = (FS_RootEntCnt * 32 + 511) / 512;
/* 数据区开始扇区 */
FS_DataStartSec = FS_RootDirStartSec + RootSecCnt;
/* 总扇区数 */
TotSec = GET_UINT16(Buf, BPB_TotSec16);
if (TotSec == 0)
TotSec = GET_UINT32(Buf, BPB_TotSec32);
/* 每簇扇区数 */
FS_SecPerClus = Buf[BPB_SecPerClus];
/* 数据区簇数 */
FS_MaxClus = (TotSec - FS_DataStartSec)/FS_SecPerClus;
#ifdef WINDOWS
printf("FS INFO:\n");
printf("FS_FATStartSec = 0x%x\n", FS_FATStartSec);
printf("NumFATs = 0x%x\n", NumFATs);
printf("FATSz = 0x%x\n", FATSz);
printf("FS_RootEntCnt = 0x%x\n", FS_RootEntCnt);
printf("FS_RootDirStartSec = 0x%x\n", FS_RootDirStartSec);
printf("RootSecCnt = 0x%x\n", RootSecCnt);
printf("FS_DataStartSec = 0x%x\n", FS_DataStartSec);
printf("TotSec = 0x%x\n", TotSec);
printf("FS_SecPerClus = 0x%x\n", FS_SecPerClus);
printf("FS_MaxClus = 0x%x\n", FS_MaxClus);
#endif
if (FS_MaxClus < 4085 || FS_MaxClus >= 65525) /* 不支持FAT12和FAT32 */
{
#ifdef WINDOWS
printf("FS TYPE IS NOT FAT16!\n");
#endif
return FALSE;
}
#ifdef WINDOWS
printf("FS TYPE IS FAT16\n");
#endif
return TRUE;
}
/*
;*****************************************************************************************************
;* End of File
;*****************************************************************************************************
;*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -