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

📄 disk.c

📁 AT89C51 MP3源程序AT89C51 MP3源程序 SD AT89C51 MP3源程序AT89C51 MP3源程序 SD
💻 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 + -