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

📄 disk.c

📁 用串口来显示和操作的基于ucos的以sd卡为存储介质的mp3源码
💻 C
字号:
#define IN_FAT
#include "User.h"

#define MAX_DRIVES 1

Disk_Info DiskInfo[MAX_DRIVES];

void DiskInit(void)
{//初始化逻辑盘信息管理模块

	INT8U i;
	
	for(i=0; i<MAX_DRIVES; i++)
	{
		DiskInfo[i].DriveID 			= EMPTY_DRIVE;
		DiskInfo[i].BytsPerSec			= 0;
		DiskInfo[i].SecPerClus			= 0;
		DiskInfo[i].RsvdSecCnt			= 0;
		DiskInfo[i].NumFATs				= 0;
		DiskInfo[i].RootEntCnt			= 0;
		DiskInfo[i].TotSec16			= 0;
		DiskInfo[i].FATSz16				= 0;
		DiskInfo[i].HiddSec				= 0;
		DiskInfo[i].TotSec32			= 0;
		DiskInfo[i].FilSysType			= 0;
		DiskInfo[i].FATSz32				= 0;
		DiskInfo[i].RootClus			= 0;
		DiskInfo[i].RelaStaSect			= 0;
		DiskInfo[i].RootDirSectors		= 0;
		DiskInfo[i].FirstDataSector		= 0;
		DiskInfo[i].DiskDrive			= NULL;
	}
}

Disk_Info * GetDiskInfo(INT8U DriveID)
{//获取逻辑盘信息

    Disk_Info *Rt;
    INT8U i;
    
    Rt = NULL;
    
    for (i=0; i < MAX_DRIVES; i++)
    {
        if (DiskInfo[i].DriveID == DriveID)
        {
            Rt = DiskInfo + i;
            break;
        }
    }
    return Rt;
}

Disk_Info * GetEmptyDiskInfoAddr(void)
{//获取空闲逻辑盘管理模块

    INT8U i;
    Disk_Info *Rt;
    
    Rt = NULL;
    for (i = 0; i < MAX_DRIVES; i++)
    {
        if (DiskInfo[i].DriveID == EMPTY_DRIVE)     // 逻辑盘号空闲
        {
            Rt = DiskInfo + i;
            break;
        }
    }
    return Rt;
}

void RemoveFileDriver(INT8U DriveID)
{//移除一个逻辑盘
	INT8U i;
    
    for (i=0; i < MAX_DRIVES; i++)
    {
        if (DiskInfo[i].DriveID == DriveID)
        {
            break;
        }
    }
    if (i <= MAX_DRIVES)
    if (DiskInfo[DriveID].DriveID != EMPTY_DRIVE)
    {
		DiskInfo[i].DriveID 		= EMPTY_DRIVE;
		DiskInfo[i].BytsPerSec		= 0;
		DiskInfo[i].SecPerClus		= 0;
		DiskInfo[i].RsvdSecCnt		= 0;
		DiskInfo[i].NumFATs			= 0;
		DiskInfo[i].RootEntCnt		= 0;
		DiskInfo[i].TotSec16		= 0;
		DiskInfo[i].FATSz16			= 0;
		DiskInfo[i].HiddSec			= 0;
		DiskInfo[i].TotSec32		= 0;
		DiskInfo[i].FilSysType		= 0;
		DiskInfo[i].FATSz32			= 0;
		DiskInfo[i].RootClus		= 0;
		DiskInfo[i].RelaStaSect		= 0;
		DiskInfo[i].RootDirSectors	= 0;
		DiskInfo[i].FirstDataSector	= 0;
		DiskInfo[i].DiskDrive		= NULL;
    }
}

void AddFileDriver(INT8U DriveID, INT8U (* DiskDrive)(INT8U Cammand, void *Parameter))
{//为逻辑盘加载底层驱动,并读取逻辑盘DBR数据

	INT32U	TotSector;				//总扇区数
	INT32U  DataSector;				//数据区中扇区数
	INT32U	CountOfCluster;			//总簇数
	INT32U	FATSize;				//FAT表所占扇区数
	Disk_RW_Parameter DP;
	Disk_Info *pDI;
	INT8U Data_Buf[512];
	
	if(DiskDrive == NULL)
	{
		return;
	}
	pDI = GetEmptyDiskInfoAddr();
	pDI->DriveID = DriveID;
	pDI->DiskDrive = DiskDrive;
	DP.SectorIndex = 0;//扇区0
	DP.Buf = Data_Buf;//数据缓冲
	(* pDI->DiskDrive)(ReadSec, &DP);//读一扇区数据
	if((( Data_Buf[0]==0xEB)&&( Data_Buf[2]==0x90))||( Data_Buf[0] == 0xE9))
	{
		pDI->RelaStaSect = 0;
	}
	else
	{
		pDI->RelaStaSect =  (INT32U)(Data_Buf[455] << 8)  | 
					   		(INT32U)(Data_Buf[456] << 16) |
					   		(INT32U)(Data_Buf[457] << 24) |
					  	 	Data_Buf[454];
		DP.SectorIndex = pDI->RelaStaSect;
		DP.Buf = Data_Buf;//数据缓冲
		(* pDI->DiskDrive)(ReadSec, &DP);//读一扇区
    }
	
	pDI->BytsPerSec = ((INT16U)Data_Buf[OFBPB_BytsPerSec+1] << 8) | 
					  Data_Buf[OFBPB_BytsPerSec];
	pDI->SecPerClus = Data_Buf[OFBPB_SecPerClus];
	pDI->RsvdSecCnt = ((INT16U)Data_Buf[OFBPB_RsvdSecCnt+1] << 8) |
					  Data_Buf[OFBPB_RsvdSecCnt];
	pDI->NumFATs	= Data_Buf[OFBPB_NumFATs];
	pDI->RootEntCnt = ((INT16U)Data_Buf[OFBPB_RootEntCnt+1] << 8) | 
					  Data_Buf[OFBPB_RootEntCnt];
	pDI->TotSec16	= ((INT16U)Data_Buf[OFBPB_TotSec16+1] << 8) | 
	   				  Data_Buf[OFBPB_TotSec16];
	pDI->FATSz16    = ((INT16U)Data_Buf[OFBPB_FATSz16+1] << 8) | 
					  Data_Buf[OFBPB_FATSz16];
	pDI->HiddSec    = ((INT32U)Data_Buf[OFBPB_HiddSec+3] << 24) | 
					  ((INT32U)Data_Buf[OFBPB_HiddSec+2] << 16) | 
					  ((INT32U)Data_Buf[OFBPB_HiddSec+1] << 8)  | 
					  Data_Buf[OFBPB_HiddSec];
	pDI->TotSec32   = ((INT32U)Data_Buf[OFBPB_TotSec32+3] << 24) | 
					  ((INT32U)Data_Buf[OFBPB_TotSec32+2] << 16) | 
					  ((INT32U)Data_Buf[OFBPB_TotSec32+1] << 8)  | 
					  Data_Buf[OFBPB_TotSec32];
	pDI->FATSz32    = ((INT32U)Data_Buf[OFBPB_FATSz32+3] << 24) | 
					  ((INT32U)Data_Buf[OFBPB_FATSz32+2] << 16) | 
					  ((INT32U)Data_Buf[OFBPB_FATSz32+1] << 8)  | 
					  Data_Buf[OFBPB_FATSz32];
	pDI->RootClus   = ((INT32U)Data_Buf[OFBPB_RootClus+3] << 24) | 
					  ((INT32U)Data_Buf[OFBPB_RootClus+2] << 16) | 
					  ((INT32U)Data_Buf[OFBPB_RootClus+1] << 8)  | 
					  Data_Buf[OFBPB_RootClus];
	
	pDI->RootDirSectors = ((pDI->RootEntCnt * 32) + (pDI->BytsPerSec - 1)) / pDI->BytsPerSec;
	if(pDI->FATSz16 != 0)
		FATSize = pDI->FATSz16;
	else
		FATSize = pDI->FATSz32;
	pDI->FirstDataSector = pDI->RsvdSecCnt + (pDI->NumFATs * FATSize) + pDI->RootDirSectors + pDI->RelaStaSect;
	if(pDI->TotSec16 != 0)
		TotSector = pDI->TotSec16;
	else
		TotSector = pDI->TotSec32;
	DataSector = TotSector - (pDI->RsvdSecCnt + (pDI->NumFATs * FATSize) + pDI->RootDirSectors);
	CountOfCluster = DataSector / pDI->SecPerClus;
	if(CountOfCluster < 4085)
		pDI->FilSysType = FAT12;
	else if(CountOfCluster < 65525)
		pDI->FilSysType = FAT16;
	else 
		pDI->FilSysType = FAT32;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -