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

📄 massop.c

📁 可以实现44B0的底层所有通信
💻 C
📖 第 1 页 / 共 2 页
字号:

#include "..\inc\44blib.h"
#include "..\inc\DataType.h"
#include "..\inc\SL811.H"
#include "..\inc\MassOp.h"
//////////////////////////////////
extern TJHPKG usbstack;
SYS_INFO_BLOCK DeviceInfo;
FILE_INFO ThisFile;
DIR_INFO ThisDir;

U8 CurFatSector[512];
extern TJHFLAGS bTJHFlags;
U8 FATBUF[512];
U32 FreeClusterNum,FreeSecNum;

TPBLK_STRUC TPBulk_Block;
#define     TPBulk_CBW		TPBulk_Block.TPBulk_CommandBlock
#define	   CBW_wXferLen		TPBulk_CBW.dCBW_DataXferLen
#define	   RBC_CDB		TPBulk_CBW.cdbRBC
#define     RBC_LUN		TPBulk_CBW.bCBW_LUN
#define     TPBulk_CSW		TPBulk_Block.TPBulk_CommandStatus

///////////////////////////////////////////////////////////////////////////
U8 EnumMassDev(void)
{
	//PMBR_BLOCK pMBR;
	PBPB_BLOCK pBPB;
	PFSINFO_BLOCK pFSInfo;
	U32 StartSector;
	U16 FATSz16,FSInfo;
	U8 BUF[512];
	////////////////////////////////////////////////////
	//if(!TPBulk_GetMaxLUN())
	//	return FALSE;
	if(!SPC_Inquiry())
		return FALSE;
	//if(!SPC_READLONG())
	//	return FALSE;
	if(!SPC_TestUnit())
		return FALSE;
	if(!SPC_LockMedia())
		return FALSE;
	if(!SPC_RequestSense())
		return FALSE;
	if(!SPC_TestUnit())
		return FALSE;
	if(!RBC_ReadCapacity())
		return FALSE;
	////////////////////////////////////////////////////
	//pMBR=(PMBR_BLOCK)BUF;
	
	///////////////////////////////////////////////
	DeviceInfo.BPB_BytesPerSec=512; //暂假设为512
	///////////////////////////////////////////////////
	///////////////////////////////////////////////////
	if(!SPC_RequestSense())
		return FALSE;
	if(!SPC_TestUnit())
		return FALSE;
	if(!RBC_ReadCapacity())
		return FALSE;
	if(!RBC_Read(0x0,1,BUF))
		return FALSE;
	//////////////////////////////////
	if(BUF[0]==0xeb||BUF[0]==0xe9)
		{
		StartSector=0;
		//DeviceInfo.TotalSector=SwapINT32(pMBR->TotalSector);
		}
	else
		{
	//////////////////////////////////
		//StartSector=SwapINT32(pMBR->StartSector);
		StartSector=MakeU32(BUF[457],BUF[456],BUF[455],BUF[454]);
		//DeviceInfo.TotalSector=SwapINT32(pMBR->TotalSector);
		}
	///////////////////////////////////////////////////////
	pBPB=(PBPB_BLOCK)BUF;
	if(!RBC_Read(StartSector,1,BUF))
		return FALSE;
	DeviceInfo.BPB_BytesPerSec=MakeU16(BUF[12],BUF[11]);//SwapINT16(pBPB->BPB_BytesPerSec);
	DeviceInfo.BPB_SecPerClus=BUF[13];//pBPB->BPB_SecPerClus;
	//DeviceInfo.BPB_NumFATs=pBPB->BPB_NumFATs;
	DeviceInfo.BPB_RootEntCnt=MakeU16(BUF[18],BUF[17]);SwapINT16(pBPB->BPB_RootEntCnt);
	
	FATSz16=MakeU16(BUF[23],BUF[22]);SwapINT16(pBPB->BPB_FATSz16);
	//DeviceInfo.FatStartSector=StartSector+SwapINT16(pBPB->BPB_RsvdSecCn);
	if(FATSz16>0)	
	{
	DeviceInfo.FATSz=FATSz16;SwapINT16(pBPB->BPB_FATSz16);
	bTJHFlags.bIsFat32=0;
	DeviceInfo.FatStartSector=StartSector+MakeU16(BUF[15],BUF[14]);//SwapINT16(pBPB->BPB_RsvdSecCn);
	DeviceInfo.RootStartSector=DeviceInfo.FatStartSector+2*DeviceInfo.FATSz;
	DeviceInfo.FirstDataSector=DeviceInfo.RootStartSector+(DeviceInfo.BPB_RootEntCnt>>4);	//DeviceInfo.FirstSectorofCluster=;
	DeviceInfo.FSI_Nxt_Free=2;
	Led_Display(1,1);
	
	ThisDir.DepthIndex=0;
	ThisDir.bRootDir=1;
	
	ThisDir.Link[0]=DeviceInfo.RootStartSector;
	
	ThisDir.ParentStartCluster=0;
	ThisDir.StartCluster=0;
	ThisDir.StartSector=DeviceInfo.RootStartSector;
	
	//DeviceInfo.BPB_TotSec32=SwapINT32(pBPB->BPB_TotSec32);
	}
	else		//说明是FAT32系统
	{
	DeviceInfo.FATSz=MakeU32(BUF[39],BUF[38],BUF[37],BUF[36]);//SwapINT32(pBPB->fat16_32.fat32.BPB_FATSz32);//SwapINT16(pBPB->BPB_FATSz16);
	bTJHFlags.bIsFat32=1;
	FSInfo=MakeU16(BUF[49],BUF[48]);//SwapINT16(pBPB->fat16_32.fat32.BPB_FSInfo);
	DeviceInfo.FatStartSector=StartSector+MakeU16(BUF[15],BUF[14]);//SwapINT16(pBPB->BPB_RsvdSecCn);
	DeviceInfo.RootClusterNum=MakeU32(BUF[47],BUF[46],BUF[45],BUF[44]);//SwapINT32(pBPB->fat16_32.fat32.BPB_RootClus);
	DeviceInfo.FirstDataSector=DeviceInfo.FatStartSector+2*DeviceInfo.FATSz;
	
	ThisDir.DepthIndex=0;
	ThisDir.bRootDir=1;
	
	ThisDir.Link[0]=DeviceInfo.RootClusterNum;
	ThisDir.ParentStartCluster=0;
	ThisDir.StartCluster=DeviceInfo.RootClusterNum;
	
	
	///////////////////////////////////////////////////////'
	if(!RBC_Read(FSInfo,1,BUF))
		return FALSE;
	pFSInfo=(PFSINFO_BLOCK)BUF;
	
	DeviceInfo.FSI_Free_Count=MakeU32(BUF[491],BUF[490],BUF[489],BUF[488]);//SwapINT32(pFSInfo->FSI_Free_Count);
	if(DeviceInfo.FSI_Free_Count==0xFFFFFFFF)
		DeviceInfo.FSI_Free_Count=0;
	DeviceInfo.FSI_Nxt_Free=MakeU32(BUF[495],BUF[494],BUF[493],BUF[492]);//SwapINT32(pFSInfo->FSI_Nxt_Free);
	if(DeviceInfo.FSI_Nxt_Free==0xFFFFFFFF)
		DeviceInfo.FSI_Nxt_Free=0;
	//////////////////////////////////////////////////////
	Led_Display(1,0);
	}
	///////////////////////////////////////////////////////
	ThisFile.bFileOpen=0;
	ThisFile.FatSectorPointer=0;
	///////////////////////////////////////////////////////
	
	///////////////////////////////////////////////////////
	return TRUE;
}

U8 TPBulk_GetMaxLUN(void)
{
	U8 BUF[512];
	usbstack.setup.bmRequest=0xa1;
	usbstack.setup.bRequest=0xfe;
	usbstack.setup.wValue=0;
	usbstack.setup.wIndex=0;
	usbstack.setup.wLength=1;
	usbstack.buffer=BUF;
	return ep0Xfer();

}

U8 SPC_Inquiry(void)
{
#define cdbInquirySPC RBC_CDB.SpcCdb_Inquiry
	U8 BUF[512];
	//U8 retStatus=FALSE;
	TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
	TPBulk_CBW.dCBW_Tag=0x60a624de;
	TPBulk_CBW.dCBW_DataXferLen=0x24;
	TPBulk_CBW.bCBW_Flag=0x80;
	TPBulk_CBW.bCBW_LUN=0;
	TPBulk_CBW.bCBW_CDBLen=6;
	TPBulk_CBW.OperationCode=SPC_CMD_INQUIRY;

	/////////////////////////////////
	//cdbInquirySPC.OperationCode=SPC_CMD_INQUIRY;
	//cdbInquirySPC.EnableVPD=0;
	//cdbInquirySPC.CmdSupportData=0;
	cdbInquirySPC.Reserved0=0;
	cdbInquirySPC.PageCode=0;
	cdbInquirySPC.AllocationLen=0x24;
	cdbInquirySPC.Control=0;
	////////////////////////////////
	if(!epBulkSend((U8 *)&TPBulk_CBW,31))
		return FALSE;

	if(!epBulkRcv(BUF,38))
		return FALSE;
	if(!epBulkRcv((U8 *)&TPBulk_CSW,13))
		return FALSE;
	////////////////////////////////
	return TRUE;
#undef cdbInquirySPC
}

U8 SPC_RequestSense(void)
{
#define cdbRequestSenseSPC RBC_CDB.SpcCdb_RequestSense
	//U8 retStatus=FALSE;
	U8 BUF[512];
	TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
	TPBulk_CBW.dCBW_Tag=0x60a624de;
	TPBulk_CBW.dCBW_DataXferLen=0x0e;
	TPBulk_CBW.bCBW_Flag=0x80;
	TPBulk_CBW.bCBW_LUN=0;
	TPBulk_CBW.bCBW_CDBLen=12;
	TPBulk_CBW.OperationCode=SPC_CMD_REQUESTSENSE;
	/////////////////////////////////////
	//cdbRequestSenseSPC.OperationCode=SPC_CMD_REQUESTSENSE;
	cdbRequestSenseSPC.AllocationLen=0x0e;
	//////////////////////////////////////
	if(!epBulkSend((U8 *)&TPBulk_CBW,31))
		return FALSE;

	if(!epBulkRcv(BUF,18))
		return FALSE;

	if(!epBulkRcv((U8 *)&TPBulk_CSW,13))
		return FALSE;
/////////////////////////////
	return TRUE;

#undef cdbRequestSenseSPC
}
U8 SPC_TestUnit(void)
{
#define cdbTestUnit RBC_CDB.SpcCdb_TestUnit
	//U8 retStatus=FALSE;
	TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
	TPBulk_CBW.dCBW_Tag=0x60a624de;
	TPBulk_CBW.dCBW_DataXferLen=0x00000000;
	TPBulk_CBW.bCBW_Flag=0x00;
	TPBulk_CBW.bCBW_LUN=0;
	TPBulk_CBW.bCBW_CDBLen=12;
	TPBulk_CBW.OperationCode=SPC_CMD_TESTUNITREADY;

	/////////////////////////////////////

	//////////////////////////////////////
	if(!epBulkSend((U8 *)&TPBulk_CBW,31))
		return FALSE;

	if(!epBulkRcv((U8 *)&TPBulk_CSW,13))
		return FALSE;
#undef cdbTestUnit
////////////////////////////
	return TRUE;
}
U8 SPC_LockMedia(void)
{
#define cdbLockSPC RBC_CDB.SpcCdb_Remove
	//U8 retStatus=FALSE;
	TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
	TPBulk_CBW.dCBW_Tag=0x60a624de;
	TPBulk_CBW.dCBW_DataXferLen=0x00000000;
	TPBulk_CBW.bCBW_Flag=0x00;
	TPBulk_CBW.bCBW_LUN=0;
	TPBulk_CBW.bCBW_CDBLen=12;
	TPBulk_CBW.OperationCode=SPC_CMD_PRVENTALLOWMEDIUMREMOVAL;
	///////////////////////////////////////////
	//cdbLockSPC.OperationCode=SPC_CMD_PRVENTALLOWMEDIUMREMOVAL;
	cdbLockSPC.Prevent=1;
	///////////////////////////////////////////
	if(!epBulkSend((U8 *)&TPBulk_CBW,31))
		return FALSE;

	if(!epBulkRcv((U8 *)&TPBulk_CSW,13))
		return FALSE;
#undef cdbLockSPC
/////////////////////////////
	return TRUE;
}
U8 RBC_ReadCapacity(void)
{
#define cdbReadCap RBC_CDB.RbcCdb_ReadCapacity
	//U8 retStatus=FALSE;
	U8 BUF[512];
	TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
	TPBulk_CBW.dCBW_Tag=0x60a624de;
	TPBulk_CBW.bCBW_LUN=0;
	TPBulk_CBW.dCBW_DataXferLen=0x08;
	TPBulk_CBW.bCBW_Flag=0x80;

	TPBulk_CBW.bCBW_CDBLen=12;
	TPBulk_CBW.OperationCode=RBC_CMD_READCAPACITY;
	if(!epBulkSend((U8 *)&TPBulk_CBW,31))
		return FALSE;

	if(!epBulkRcv(BUF,8))
		return FALSE;
	if(!epBulkRcv((U8 *)&TPBulk_CSW,13))
		return FALSE;
#undef cdbReadCap
/////////////////////////////
	return TRUE;
}
U8 RBC_Read(U32 lba,U8 len,U8 *pBuffer)
{
#define cdbRead RBC_CDB.RbcCdb_Read
	TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
	TPBulk_CBW.dCBW_Tag=0x60a624de;
	TPBulk_CBW.dCBW_DataXferLen=len*512;
	TPBulk_CBW.bCBW_Flag=0x80;
	TPBulk_CBW.bCBW_LUN=0;
	TPBulk_CBW.bCBW_CDBLen=12;
	TPBulk_CBW.OperationCode=RBC_CMD_READ10;
	/////////////////////////////////////
	
	cdbRead.VendorSpecific=0;
	cdbRead.LBA_0=lba;
	cdbRead.LBA_1=lba>>8;
	cdbRead.LBA_2=lba>>16;
	cdbRead.LBA_3=lba>>24;

	cdbRead.XferLength=WordSwap(len);
	//////////////////////////////////////
	if(!epBulkSend((U8 *)&TPBulk_CBW,31))
		return FALSE;

	if(!epBulkRcv(pBuffer,len*512))
		return FALSE;
	if(!epBulkRcv((U8 *)&TPBulk_CSW,13))
		return FALSE;
#undef cdbRead
/////////////////////////////
	return TRUE;
}

⌨️ 快捷键说明

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