📄 massop.c
字号:
#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 + -