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

📄 tpbulk.c

📁 ls811的USB FAT文件系统
💻 C
字号:
/*******************************Copyright (c)***************************************

                              桑海为实业发展有限公司
                         自  动  化  钢  琴  研  究  所
                           http://www.pianoshw.com
                           E-mail:shw@pianoshw.com

----------------------------------文件信息-------------------------------------------

文  件  名 : TPBULK.C
创  建  人 : 吴应斌
创 建 日 期: 2004-6-7 9:43
功 能 描 述: SL811文件操作函数集合

************************************************************************************/
#include <COMMON.H>
#include <SL811.H>
#include <TPBULK.H>
#include <HAL.H>
#include <HPI.H>

extern unsigned char xdata DBUF[BUFFER_LENGTH];
extern XXGPKG usbstack;
extern SYS_INFO_BLOCK xdata DeviceInfo;
extern FILE_INFO xdata ThisFile;
extern FREE_FAT_INFO xdata FreeFat;
extern unsigned char xdata CurFatSector[512];

TPBLK_STRUC idata 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

unsigned char EnumMassDev(void)
{
	
	PMBR_BLOCK pMBR;
	PBPB_BLOCK pBPB;

	if(!SPC_Inquiry())
		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)DBUF;
	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,DBUF))
		return FALSE;
		
	if(DBUF[0]==0xeb||DBUF[0]==0xe9)
	{
		DeviceInfo.StartSector=0;
	}
	else
	{
		DeviceInfo.StartSector=SwapINT32(pMBR->StartSector);
	}
	pBPB=(PBPB_BLOCK)DBUF;
	
	if(!RBC_Read(DeviceInfo.StartSector,1,DBUF))
		return FALSE;
		
	DeviceInfo.BPB_BytesPerSec=SwapINT16(pBPB->BPB_BytesPerSec);
	DeviceInfo.BPB_SecPerClus=pBPB->BPB_SecPerClus;
	DeviceInfo.BPB_NumFATs=pBPB->BPB_NumFATs;
	DeviceInfo.BPB_RootEntCnt=SwapINT16(pBPB->BPB_RootEntCnt);
	DeviceInfo.BPB_TotSec16=SwapINT16(pBPB->BPB_TotSec16);
	DeviceInfo.BPB_FATSz16=SwapINT16(pBPB->BPB_FATSz16);
	DeviceInfo.BPB_TotSec32=SwapINT32(pBPB->BPB_TotSec32);
	DeviceInfo.FatStartSector=DeviceInfo.StartSector+1;
	DeviceInfo.RootStartSector=DeviceInfo.StartSector+2*DeviceInfo.BPB_FATSz16+1;
	DeviceInfo.FirstDataSector=DeviceInfo.FatStartSector+2*DeviceInfo.BPB_FATSz16+32;
	
	ThisFile.bFileOpen=0;	
	return TRUE;
}

unsigned char SPC_Inquiry(void)
{
#define cdbInquirySPC RBC_CDB.SpcCdb_Inquiry
	TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
	TPBulk_CBW.dCBW_Tag=0x60a624de;
	TPBulk_CBW.dCBW_DataXferLen=0x24000000;
	TPBulk_CBW.bCBW_Flag=0x80;
	TPBulk_CBW.bCBW_LUN=0;
	TPBulk_CBW.bCBW_CDBLen=sizeof(INQUIRY_SPC);
	
	cdbInquirySPC.OperationCode=SPC_CMD_INQUIRY;
	cdbInquirySPC.EnableVPD=0;
	cdbInquirySPC.CmdSupportData=0;
	cdbInquirySPC.PageCode=0;
	cdbInquirySPC.AllocationLen=0x24;
	cdbInquirySPC.Control=0;

	if(!epBulkSend((unsigned char *)&TPBulk_CBW,sizeof(TPBulk_CBW)))
		return FALSE;
	
	if(!epBulkRcv(DBUF,38))
		return FALSE;
		
	if(!epBulkRcv((unsigned char *)&TPBulk_CSW,13))
		return FALSE;

	return TRUE;	
#undef cdbInquirySPC
}

unsigned char SPC_RequestSense(void)
{
#define cdbRequestSenseSPC RBC_CDB.SpcCdb_RequestSense	
	TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
	TPBulk_CBW.dCBW_Tag=0x60a624de;
	TPBulk_CBW.dCBW_DataXferLen=0x0e000000;
	TPBulk_CBW.bCBW_Flag=0x80;
	TPBulk_CBW.bCBW_LUN=0;
	TPBulk_CBW.bCBW_CDBLen=sizeof(REQUEST_SENSE_SPC);
		
	cdbRequestSenseSPC.OperationCode=SPC_CMD_REQUESTSENSE;
	cdbRequestSenseSPC.AllocationLen=0x0e;

	if(!epBulkSend((unsigned char *)&TPBulk_CBW,sizeof(TPBulk_CBW)))
		return FALSE;
	
	if(!epBulkRcv(DBUF,18))
		return FALSE;
	
	if(!epBulkRcv((unsigned char *)&TPBulk_CSW,13))
		return FALSE;
		
	return TRUE;
	
#undef cdbRequestSenseSPC
}
unsigned char SPC_TestUnit(void)
{
#define cdbTestUnit RBC_CDB.SpcCdb_TestUnit	
	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=sizeof(TEST_UNIT_SPC);

	cdbTestUnit.OperationCode=SPC_CMD_TESTUNITREADY;
	
	if(!epBulkSend((unsigned char *)&TPBulk_CBW,sizeof(TPBulk_CBW)))
		return FALSE;
	
	if(!epBulkRcv((unsigned char *)&TPBulk_CSW,13))
		return FALSE;
		
#undef cdbTestUnit
	return TRUE;
}
unsigned char SPC_LockMedia(void)
{
#define cdbLockSPC RBC_CDB.SpcCdb_Remove	
	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=sizeof(MEDIA_REMOVAL_SPC);

	cdbLockSPC.OperationCode=SPC_CMD_PRVENTALLOWMEDIUMREMOVAL;
	cdbLockSPC.Prevent=1;

	if(!epBulkSend((unsigned char *)&TPBulk_CBW,sizeof(TPBulk_CBW)))
		return FALSE;
		
	if(!epBulkRcv((unsigned char *)&TPBulk_CSW,13))
		return FALSE;
		
#undef cdbLockSPC
	return TRUE;
}
unsigned char RBC_ReadCapacity(void)
{
#define cdbReadCap RBC_CDB.RbcCdb_ReadCapacity	
	TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
	TPBulk_CBW.dCBW_Tag=0x60a624de;
	TPBulk_CBW.bCBW_LUN=0;
	TPBulk_CBW.dCBW_DataXferLen=0x08000000;
	TPBulk_CBW.bCBW_Flag=0x80;
	
	TPBulk_CBW.bCBW_CDBLen=sizeof(READ_CAPACITY_RBC);
	cdbReadCap.OperationCode=RBC_CMD_READCAPACITY;
	if(!epBulkSend((unsigned char *)&TPBulk_CBW,sizeof(TPBulk_CBW)))
		return FALSE;
	
	if(!epBulkRcv(DBUF,8))
		return FALSE;
		
	if(!epBulkRcv((unsigned char *)&TPBulk_CSW,13))
		return FALSE;
		
#undef cdbReadCap
	return TRUE;
}
unsigned char RBC_Read(unsigned long lba,unsigned char len,unsigned char *pBuffer)
{
#define cdbRead RBC_CDB.RbcCdb_Read	
	TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
	TPBulk_CBW.dCBW_Tag=0x60a624de;
	TPBulk_CBW.dCBW_DataXferLen=SwapINT32(len*DeviceInfo.BPB_BytesPerSec);
	TPBulk_CBW.bCBW_Flag=0x80;
	TPBulk_CBW.bCBW_LUN=0;
	TPBulk_CBW.bCBW_CDBLen=sizeof(READ_RBC);

	cdbRead.OperationCode=RBC_CMD_READ10;
	cdbRead.VendorSpecific=0;
	cdbRead.LBA.LBA_W32=lba;
	cdbRead.XferLength=len;

	if(!epBulkSend((unsigned char *)&TPBulk_CBW,sizeof(TPBulk_CBW)))
		return FALSE;
	
	if(!epBulkRcv(pBuffer,len*DeviceInfo.BPB_BytesPerSec))
		return FALSE;

	if(!epBulkRcv((unsigned char *)&TPBulk_CSW,13))
		return FALSE;
		
#undef cdbRead
	return TRUE;
}

unsigned char RBC_Write(unsigned long lba,unsigned char len,unsigned char *pBuffer)
{
#define cdbWrite RBC_CDB.RbcCdb_Write	
	TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
	TPBulk_CBW.dCBW_Tag=0xb4D977c1;
	TPBulk_CBW.dCBW_DataXferLen=SwapINT32(len*DeviceInfo.BPB_BytesPerSec);
	TPBulk_CBW.bCBW_Flag=0x0;
	TPBulk_CBW.bCBW_LUN=0;
	TPBulk_CBW.bCBW_CDBLen=sizeof(WRITE_RBC);

	cdbWrite.OperationCode=RBC_CMD_WRITE10;
	cdbWrite.VendorSpecific=0;
	cdbWrite.LBA.LBA_W32=lba;
	cdbWrite.XferLength=len;
	cdbWrite.Reserved2=0;
	cdbWrite.Control=0;

	if(!epBulkSend((unsigned char *)&TPBulk_CBW,sizeof(TPBulk_CBW)))
		return FALSE;
	DelayMs(35);
	
	if(!epBulkSend(pBuffer,len*DeviceInfo.BPB_BytesPerSec))
		return FALSE;
	
	if(!epBulkRcv((unsigned char *)&TPBulk_CSW,13))
		return FALSE;
	
#undef cdbWrite

	return TRUE;
}

⌨️ 快捷键说明

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