📄 tpbulk.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 + -