📄 rbc.c
字号:
return retStatus;
}
}else if(__cdbInquirySPC.CmdSupportData){ /* 可选命令的数据信息 */
__tpbulkErrorHandler(__CASECMDFAIL, 0);
__rbcBuildSenseData(__SCSI_SENSE_ILLEGAL_REQUEST, __SCSI_ADSENSE_ILLEGAL_COMMAND, 0x00);
__tpbulkCSWHandler(); /* 进入批量传输的状态处理阶段 */
return retStatus;
}else{
pucData = (__uint8*)&__GinquiryData; /* 标准请求数据 */
uiLen = sizeof(__STD_INQUIRYDATA);
}
retStatus = __MASS_SUCCESS;
if ( uiLen > __GdwCBWXferLen ){
uiLen = __GdwCBWXferLen;
__tpbulkErrorHandler(__CASE6, uiLen); /* 批量传输的错误检查和处理 */
__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0); /* 设置判别数据 */
}else if ( uiLen == __GdwCBWXferLen ){
__tpbulkErrorHandler(__CASE6, uiLen); /* 批量传输的错误检查和处理 */
__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0); /* 设置判别数据 */
}else{
__tpbulkErrorHandler(__CASE5, uiLen); /* 批量传输的错误检查和处理 */
__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0); /* 设置判别数据 */
}
__tpbulkSendSetting(__BOTXferAtROM, pucData, uiLen); /* 设置批量数据传输参数 */
return retStatus;
#undef __cdbInquirySPC
}
/*********************************************************************************************************
** Function name: __spcModeSelect
**
** Descriptions: 模式选择命令允许主机设置RBC设备的介质或设备参数。
**
** input parameters: 无
** output parameters: 无
** Returned value: __MASS_SUCCESS
**
*********************************************************************************************************/
#if 0
__uint8 __spcModeSelect (void)
{
#define __cdbModeSelectSPC __RBC_CDB.SpcCdb_ModeSelect
__tpbulkErrorHandler(__CASECMDFAIL, 0); /* 批量传输的错误检查和处理 */
/* 设置判别数据 */
__rbcBuildSenseData(__SCSI_SENSE_ILLEGAL_REQUEST, __SCSI_ADSENSE_INVALID_CDB, 0);
__tpbulkCSWHandler(); /* 进入批量传输的状态处理阶段 */
return __MASS_FAIL;
#undef __cdbModeSelectSPC
}
#endif
/*********************************************************************************************************
** Function name: __spcModeSense
**
** Descriptions: 模式判别命令允许RBC设备向主机报告介质或设备参数。
**
** input parameters: 无
** output parameters: 无
** Returned value: __MASS_SUCCESS
**
*********************************************************************************************************/
__uint8 __spcModeSense (void)
{
#define __cdbModeSenseSPC __RBC_CDB.SpcCdb_ModeSense
__uint8 retStatus = __MASS_FAIL;
__uint8 *pcuData = __MASS_NULL;
__uint32 uiLen;
if (__cdbModeSenseSPC.PageCode == __MODE_PAGE_RBC_DEVICE_PARAMETERS ||
__cdbModeSenseSPC.PageCode == __MODE_PAGE_ALL ){
/* 报告设备参数页 */
switch(__cdbModeSenseSPC.PageControl){
case __PAGECTRL_CHANGEABLE:
pcuData = (__uint8*) &__GparaHeadMask; /* 报告设备参数页掩码 */
uiLen = __PARAMETER_LIST_LENGTH;
break;
case __PAGECTRL_DEFAULT: /* 当前值和缺省值则报告缺省设 */
case __PAGECTRL_CURRENT: /* 备参数页 */
pcuData = (__uint8*)&__GdefaultParaPage;
uiLen = __PARAMETER_LIST_LENGTH;
break;
case __PAGECTRL_SAVED:
default: /* 不支持保存参数页 */
/* retStatus = __MASS_FAIL; */
__tpbulkErrorHandler(__CASECMDFAIL, 0);
__rbcBuildSenseData(__SCSI_SENSE_ILLEGAL_REQUEST, __SCSI_ADSENSE_SAVE_ERROR, 0);
__tpbulkCSWHandler(); /* 进入批量传输的状态处理阶段 */
break;
}
if (__GdwCBWXferLen < uiLen){
uiLen = __GdwCBWXferLen;
__tpbulkErrorHandler(__CASE6, uiLen); /* 批量传输的错误检查和处理 */
__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0); /* 设置判别数据 */
}else if(__GdwCBWXferLen == uiLen){
__tpbulkErrorHandler(__CASE6, uiLen); /* 批量传输的错误检查和处理 */
__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0); /* 设置判别数据 */
}else{
__tpbulkErrorHandler(__CASE5, uiLen); /* 批量传输的错误检查和处理 */
__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0); /* 设置判别数据 */
}
__tpbulkSendSetting(__BOTXferAtROM, pcuData, uiLen); /* 设置批量数据传输参数 */
retStatus = __MASS_SUCCESS;
}else{
/* retStatus = __MASS_FAIL; */
__tpbulkErrorHandler(__CASECMDFAIL, 0); /* 批量传输的错误检查和处理 */
__rbcBuildSenseData(__SCSI_SENSE_ILLEGAL_REQUEST, __SCSI_ADSENSE_INVALID_CDB, 0);
__tpbulkCSWHandler(); /* 进入批量传输的状态处理阶段 */
}
return retStatus;
#undef __cdbModeSenseSPC
}
/*********************************************************************************************************
** Function name: __spcLockMedia
**
** Descriptions: 禁止/允许介质移除
**
** input parameters: 无
** output parameters: 无
** Returned value: __MASS_SUCCESS
**
*********************************************************************************************************/
__uint8 __spcLockMedia (void)
{
#define __cdbLockSPC __RBC_CDB.SpcCdb_Remove
__GrbcPropertyData.bits.MediumRemovFlag = __cdbLockSPC.Prevent; /* 保存禁止/允许介质移除状态 */
__tpbulkErrorHandler(__CASE1, 0); /* 批量传输的错误检查和处理 */
__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0); /* 设置判别数据 */
__tpbulkCSWHandler(); /* 进入批量传输的状态处理阶段 */
return __MASS_SUCCESS;
#undef __cdbLockSPC
}
/*********************************************************************************************************
** Function name: __spcTestUnit
**
** Descriptions: 检查设备是否已经准备。
**
** input parameters: 无
** output parameters: 无
** Returned value: __MASS_SUCCESS
**
*********************************************************************************************************/
__uint8 __spcTestUnit (void)
{
#define __cdbTestUnit __RBC_CDB.SpcCdb_TestUnit
if ( msGetStatus() == __MS_READY ){
/* 设备准备好 */
__tpbulkErrorHandler(__CASE1, 0); /* 批量传输的错误检查和处理 */
__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0); /* 设置判别数据 */
}else{
__tpbulkErrorHandler(__CASECMDFAIL, 0); /* 批量传输的错误检查和处理 */
/* 设置判别数据 */
__rbcBuildSenseData(__SCSI_SENSE_NOT_READY, __SCSI_ADSENSE_NO_MEDIA_IN_DEVICE, 0);
}
__tpbulkCSWHandler(); /* 进入批量传输的状态处理阶段 */
return __MASS_SUCCESS;
#undef __cdbTestUnit
}
/*********************************************************************************************************
** Function name: __spcRequestSense
**
** Descriptions: 请求判别数据
**
** input parameters: 无
** output parameters: 无
** Returned value: __MASS_SUCCESS
** __MASS_FAIL
*********************************************************************************************************/
__uint8 __spcRequestSense (void)
{
#define __cdbRequestSenseSPC __RBC_CDB.SpcCdb_RequestSense
__tpbulkErrorHandler(__CASE6, 0x12); /* 批量传输的错误检查和处理 */
/* 发送判别数据回主机 */
/* 设置批量数据传输参数 */
__tpbulkSendSetting(__BOTXferAtRAM, (__uint8*)&__GrbcSenseData, 0x12);
return __MASS_SUCCESS;
#undef __cdbRequestSenseSPC
}
/*********************************************************************************************************
** Function name: __spcReadLong
**
** Descriptions: 读格式化容量命令,RBC设备在批量输入端口上返回一个容量列表到主机。
**
** input parameters: 无
** output parameters: 无
** Returned value: __MASS_SUCCESS
**
*********************************************************************************************************/
__uint8 __spcReadLong (void)
{
#define __cdbReadLong __RBC_CDB.RE_FM_Capacities
__PDISK_INFO pmsinfo = msGetInfo(); /* 取设备容量信息 */
__cdbReadLong.Length = 0x10; /* 容量列表长度 */
/* 当前块容量,按大端格式存放 */
__cdbReadLong.CapacityLBA[0] = (__uint8)(pmsinfo->uiCapacity>>24);
__cdbReadLong.CapacityLBA[1] = (__uint8)((pmsinfo->uiCapacity<<8)>>24);
__cdbReadLong.CapacityLBA[2] = (__uint8)((pmsinfo->uiCapacity<<16)>>24);
__cdbReadLong.CapacityLBA[3] = (__uint8)((pmsinfo->uiCapacity<<24)>>24);
__cdbReadLong.DescriptorCode = 0x02; /* 当前容量描述符 */
/* 当前块大小 */
__cdbReadLong.CapacityLength[0] = (__uint8)((pmsinfo->uiBlockLen<<8)>>24);
__cdbReadLong.CapacityLength[1] = (__uint8)((pmsinfo->uiBlockLen<<16)>>24);
__cdbReadLong.CapacityLength[2] = (__uint8)((pmsinfo->uiBlockLen<<24)>>24);
__cdbReadLong.FormattableLBA[0] = __cdbReadLong.CapacityLBA[0]; /* 可格式化块容量 */
__cdbReadLong.FormattableLBA[1] = __cdbReadLong.CapacityLBA[1]; /* 按大端格式存放 */
__cdbReadLong.FormattableLBA[2] = __cdbReadLong.CapacityLBA[2];
__cdbReadLong.FormattableLBA[3] = __cdbReadLong.CapacityLBA[3];
/* 可格式化块大小 */
__cdbReadLong.FormattableLength[0] = __cdbReadLong.CapacityLength[0];
__cdbReadLong.FormattableLength[1] = __cdbReadLong.CapacityLength[1];
__cdbReadLong.FormattableLength[2] = __cdbReadLong.CapacityLength[2];
/* 设置批量数据传输参数 */
__tpbulkSendSetting(__BOTXferAtRAM, (__uint8*)&__cdbReadLong, sizeof(__READ_FORMAT_CAPACITIES));
__tpbulkErrorHandler(__CASE1, sizeof(__READ_FORMAT_CAPACITIES)); /* 批量传输的错误检查和处理 */
__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0); /* 设置判别数据 */
return __MASS_SUCCESS;
#undef __cdbReadLong
}
/*********************************************************************************************************
** Function name: __rbcBuildSenseData
**
** Descriptions: 建立判别数据
**
** input parameters: ucSenseKey
** ucASC
** ucASCQ
** output parameters: 无
**
** Returned value: 无
**
*********************************************************************************************************/
void __rbcBuildSenseData (__uint8 ucSenseKey, __uint8 ucASC, __uint8 ucASCQ)
{
/*
* RBC_SenseData.ResponseCode = SCSI_RESPONSECODE_CURRENT_ERROR;
* RBC_SenseData.Valid = 0;
* //RBC_SenseData.SegmentNum = 0;
* RBC_SenseData.SenseKey = SenseKey;
* //RBC_SenseData.Reserved0 = 0;
* //RBC_SenseData.WrongLenIndicator = 0;
* //RBC_SenseData.EndofMedium = 0;
* //RBC_SenseData.FileMark = 0;
* //RBC_SenseData.Info_0 = 0;
* //RBC_SenseData.Info_1 = 0;
* //RBC_SenseData.Info_2 = 0;
* //RBC_SenseData.Info_3 = 0;
* RBC_SenseData.AdditionalSenseLen = 0xa;
* //RBC_SenseData.CommandSpecInfo_0 = 0;
* //RBC_SenseData.CommandSpecInfo_1 = 0;
* //RBC_SenseData.CommandSpecInfo_2 = 0;
* //RBC_SenseData.CommandSpecInfo_3 = 0;
* RBC_SenseData.ASC = ASC;
* RBC_SenseData.ASCQ = ASCQ;
* //RBC_SenseData.FieldReplacableUnitCode = 0;
* //RBC_SenseData.SenseKeySpec_0 = 0;
* //RBC_SenseData.SenseKeySpecValid = 0;
* //RBC_SenseData.SenseKeySpec_1 = 0;
* //RBC_SenseData.SenseKeySpec_2 = 0;
*/
__GrbcSenseData.ResponseCode = __SCSI_RESPONSECODE_CURRENT_ERROR;
__GrbcSenseData.Valid = 0;
__GrbcSenseData.SenseKey = ucSenseKey;
__GrbcSenseData.AdditionalSenseLen = 0xa;
__GrbcSenseData.ASC = ucASC;
__GrbcSenseData.ASCQ = ucASCQ;
}
/*********************************************************************************************************
End of file
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -