📄 mass.c
字号:
if((SenseData.ASC==0x28)&&(SenseData.ASCQ==0x00))
{/* NOT READY TO READY TRANSITION-MEDIA CHANGED */
}
}
}
else
return NULL;
}
else
return hMedLUNPtr; /* 正常退出 */
}
}
return NULL;
}
//********************************************************************************
//函数名称:Creat_Medium
//输入参数:hMedLUNPtr,逻辑单元描述符指针
// LUNIndex,逻辑单元索引,0为第1个逻辑单元
//输出参数:无
//功能描述:关闭逻辑单元
//********************************************************************************
void Close_Medium(hMedLUN *hMedLUNPtr,unsigned char LUNIndex)
{
if(hMedLUNPtr==NULL)
return;
if(hMedLUNPtr->MSC ==NULL) /* 检验类描述结构指针*/
return ;
if(hMedLUNPtr->MSC->LUN < LUNIndex) /* 检验逻辑单元索引 */
return ;
hMedLUNPtr->MSC->LUN_infor_ptr[LUNIndex]->LastLogicalBlookAddress =0;
hMedLUNPtr->MSC->LUN_infor_ptr[LUNIndex]->BlockLengthInBytes=0;
}
//******************************************************************************************
// 函数名称:CommandBlockHandle
// 输入参数:tr_with_rbc_ptr,传输控制描述信息数据结构指针
// 输出参数:COMMAND_PASSED,命令完成
// COMMAND_FAILED,命令失败
// PHASE_ERROR,相位出错
// PERSISTENT_FAILURE,严重出错
// 功能描述:大容量命令块处理,包括Bulk_Only和CBI-Only两个协议。
//******************************************************************************************
uint8 CommandBlockHandle(TR_With_RBC *tr_with_rbc_ptr)
{
uint8 Statue;
/* 单批量传输协议*/
if( 0x50 == tr_with_rbc_ptr->MSC->ProtocolCode)
{
Statue = BulkOnlyComHandle( tr_with_rbc_ptr);
}
else
/* CBI传输协议 */
{
Statue = CBIOnlyComHandle( tr_with_rbc_ptr);
}
return Statue;
}
//******************************************************************************************
//函数名称:GetThisInquiryData
//输入参数:hMedLUNPtr,逻辑单元描述符指针
// DataBuff_ptr,查询数据存放的结构指针
//输出参数:COMMAND_PASSED,命令完成
// COMMAND_FAILED,命令失败
// PHASE_ERROR,相位出错
// PERSISTENT_FAILURE,严重出错
//功能描述:查询媒介信息,如厂商信息、产品信息及产品版本号。
//******************************************************************************************
unsigned char GetThisInquiryData(hMedLUN * hMedLUNPtr )
{
TR_With_RBC tr_with_rbc;
unsigned char InquiryDataBuf[36];
unsigned char Status;
if(hMedLUNPtr->MSC==NULL)
return PERSISTENT_FAILURE;
MCom_INQUIRY(hMedLUNPtr->MSC->RBC_BuffPtr); // 命令设置
tr_with_rbc.MSC = hMedLUNPtr->MSC;
tr_with_rbc.LUN = hMedLUNPtr->LUN;
tr_with_rbc.CBLength = (hMedLUNPtr->MSC->ProtocolCode==0x50)? 6:12;
tr_with_rbc.DataTransferLength = 36;
tr_with_rbc.Data_BuffPtr = InquiryDataBuf;
tr_with_rbc.RBC_BuffPtr = hMedLUNPtr->MSC->RBC_BuffPtr;
tr_with_rbc.TrDirection = IN_DATA;
Status = CommandBlockHandle( &tr_with_rbc );
if( Status == COMMAND_PASSED)
{
memcpy(hMedLUNPtr->VendorInfo, &InquiryDataBuf[8], 8);
memcpy(hMedLUNPtr->ProductInfo, &InquiryDataBuf[16], 16);
memcpy(hMedLUNPtr->ProductRev, &InquiryDataBuf[32], 4);
}
else
{ memset(hMedLUNPtr->VendorInfo,0,8) ;
memset(hMedLUNPtr->ProductInfo,0,8) ;
memset(hMedLUNPtr->ProductRev,0,8) ;
}
return Status;
}
//*****************************************************************************
//功能描述:GetThisMediumCapacity
//输入参数:hMedLUNPtr
//输出参数:COMMAND_PASSED,命令完成
// COMMAND_FAILED,命令失败
// PHASE_ERROR,相位出错
// PERSISTENT_FAILURE,严重出错
//功能描述:获取媒介的容量,块字节数及最后块地址.
//****************************************************************************
unsigned char GetThisMediumCapacity(hMedLUN * hMedLUNPtr )
{
TR_With_RBC tr_with_rbc;
unsigned char CapacityDataBuf[8];
unsigned char Status;
if(hMedLUNPtr->MSC==NULL)
return PERSISTENT_FAILURE;
MCom_ReadCapacity(hMedLUNPtr->MSC->RBC_BuffPtr);
tr_with_rbc.MSC = hMedLUNPtr->MSC;
tr_with_rbc.LUN = hMedLUNPtr->LUN;
tr_with_rbc.CBLength = (hMedLUNPtr->MSC->ProtocolCode==0x50)? 10:12; /* 命令长度 */
tr_with_rbc.DataTransferLength = 0x08; /* 传输数据长度为8字节 */
tr_with_rbc.Data_BuffPtr = CapacityDataBuf;
tr_with_rbc.RBC_BuffPtr = hMedLUNPtr->MSC->RBC_BuffPtr;
tr_with_rbc.TrDirection = IN_DATA;
Status = CommandBlockHandle( &tr_with_rbc );
if( Status == COMMAND_PASSED)
{
hMedLUNPtr->BlockLengthInBytes // 媒介块长度(字节数)
= CapacityDataBuf[7] +
CapacityDataBuf[6]*0x100 +
CapacityDataBuf[5]*0x10000+
CapacityDataBuf[4]*0x1000000;
hMedLUNPtr->LastLogicalBlookAddress // 媒介最后块地址
= CapacityDataBuf[3] +
CapacityDataBuf[2]*0x100 +
CapacityDataBuf[1]*0x10000+
CapacityDataBuf[0]*0x1000000;
}
else
{
hMedLUNPtr->BlockLengthInBytes = 0;
hMedLUNPtr->LastLogicalBlookAddress =0;
}
return Status;
}
//*****************************************************************************
//功能描述:GetRequestSense
//输入参数:hMedLUNPtr,逻辑单元描述数据结构指针
// SenseDataPtr,判别代码数据结构批针,保存返回数据
//输出参数:COMMAND_PASSED,命令完成
// COMMAND_FAILED,命令失败
// PHASE_ERROR,相位出错
// PERSISTENT_FAILURE,严重出错
//功能描述:获取媒介的容量,块字节数及最后块地址.
//****************************************************************************
unsigned char GetRequestSense(hMedLUN * hMedLUNPtr, SENSE_DATA *SenseDataPtr)
{
TR_With_RBC tr_with_rbc;
unsigned char SenseDataBuf[18];
unsigned char Status;
if(hMedLUNPtr->MSC==NULL)
return PERSISTENT_FAILURE;
MCom_RequestSense(hMedLUNPtr->MSC->RBC_BuffPtr);
tr_with_rbc.MSC = hMedLUNPtr->MSC;
tr_with_rbc.LUN = hMedLUNPtr->LUN;
tr_with_rbc.CBLength = (hMedLUNPtr->MSC->ProtocolCode==0x50)? 0x0c:12; /* 命令长度 */
tr_with_rbc.DataTransferLength = 0x12; /* 传输数据长度为8字节 */
tr_with_rbc.Data_BuffPtr = SenseDataBuf;
tr_with_rbc.RBC_BuffPtr = hMedLUNPtr->MSC->RBC_BuffPtr;
tr_with_rbc.TrDirection = IN_DATA;
Status = CommandBlockHandle( &tr_with_rbc );
if( Status == COMMAND_PASSED)
{
SenseDataPtr->SenseKey = SenseDataBuf[2]&0x0f;
SenseDataPtr->ASC = SenseDataBuf[12];
SenseDataPtr->ASCQ = SenseDataBuf[13];
}
return Status;
}
//****************************************************************************
//函数名称:ReadBlockData
//输入参数:MediumPtr,操作媒体句柄
// BufferPtr,存缓数据缓冲区指针
// LBA,逻辑块地址
// TrBLength,逻辑块数目(1~0xffff)。
//输出参数:实际读入的字节数,设备不存在或未准备好返回0.
//功能描述:读逻辑单元块数据。
//***************************************************************************
unsigned short ReadBlockData(hMedLUN *MediumPtr,
unsigned char *BufferPtr,
unsigned int LBA,
unsigned short TrBLength)
{
TR_With_RBC tr_with_rbc;
unsigned char Status;
SENSE_DATA SenseData;
if(MediumPtr->MSC==NULL)
return 0;
if( (MediumPtr->BlockLengthInBytes==0x00)||
(MediumPtr->LastLogicalBlookAddress == 0x00) )
return (0);
MCom_Read10(MediumPtr->MSC->RBC_BuffPtr, LBA, TrBLength);
tr_with_rbc.MSC = MediumPtr->MSC;
tr_with_rbc.LUN = MediumPtr->LUN;
tr_with_rbc.CBLength = (MediumPtr->MSC->ProtocolCode==0x50)? 0x0A:12; /* 命令长度 */
tr_with_rbc.DataTransferLength = TrBLength * MediumPtr->BlockLengthInBytes; /* 传输数据长度为8字节 */
tr_with_rbc.Data_BuffPtr = BufferPtr;
tr_with_rbc.RBC_BuffPtr = MediumPtr->MSC->RBC_BuffPtr;
tr_with_rbc.TrDirection = IN_DATA;
Status = CommandBlockHandle( &tr_with_rbc );
if( Status == COMMAND_PASSED)
{
return tr_with_rbc.DataTransferLength; // 返回传输的数据长度(字节)
}
else
{
if(GetRequestSense(MediumPtr, &SenseData))
return NULL;
else
{ /* 这里分析出错原因 */
if((SenseData.ASC==0x3a)&&(SenseData.ASCQ==0x00))
{/* MEDIUM NOT PRESENT */
MediumPtr->BlockLengthInBytes = NULL;
MediumPtr->LastLogicalBlookAddress = NULL;
}
}
}
return (0); // 出错返回0
}
//****************************************************************************
//函数名称:WriteBlockData
//输入参数:MediumPtr,操作媒体句柄
// BufferPtr,存缓数据缓冲区指针
// LBA,逻辑块地址
// TrBLength,逻辑块数目(1~0xffff)。
//输出参数:实际读入的字节数,设备不存在或未准备好返回NULL.
//功能描述:写逻辑单元块数据。
//***************************************************************************
unsigned short WriteBlockData(hMedLUN *MediumPtr,
unsigned char *BufferPtr,
unsigned int LBA,
unsigned short TrBLength)
{
TR_With_RBC tr_with_rbc;
unsigned char Status;
SENSE_DATA SenseData;
if(MediumPtr->MSC==NULL)
return (0);
if( (MediumPtr->BlockLengthInBytes==0x00)||
(MediumPtr->LastLogicalBlookAddress == 0x00) )
return (0);
MCom_Write10(MediumPtr->MSC->RBC_BuffPtr, LBA, TrBLength);
tr_with_rbc.MSC = MediumPtr->MSC;
tr_with_rbc.LUN = MediumPtr->LUN;
tr_with_rbc.CBLength = (MediumPtr->MSC->ProtocolCode==0x50)? 0x0A:12; /* 命令长度 */
tr_with_rbc.DataTransferLength = TrBLength * MediumPtr->BlockLengthInBytes; /* 传输数据长度为8字节 */
tr_with_rbc.Data_BuffPtr = BufferPtr;
tr_with_rbc.RBC_BuffPtr = MediumPtr->MSC->RBC_BuffPtr;
tr_with_rbc.TrDirection = OUT_DATA;
Status = CommandBlockHandle( &tr_with_rbc );
if( Status == COMMAND_PASSED)
{
return tr_with_rbc.DataTransferLength; // 返回传输的数据长度(字节)
}
else
{
if(GetRequestSense(MediumPtr, &SenseData))
return NULL;
else
{ /* 这里分析出错原因 */
if((SenseData.ASC==0x3a)&&(SenseData.ASCQ==0x00))
{/* MEDIUM NOT PRESENT */
MediumPtr->BlockLengthInBytes = NULL;
MediumPtr->LastLogicalBlookAddress = NULL;
}
}
}
return (0); // 出错返回0
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -