📄 rbc.c
字号:
ucRetStatus = __spcReadLong(); /* 0x23 */
break;
default:
/* 无效 CBW */
__tpbulkErrorHandler(__CASECBW, 0); /* 批量传输的错误检查和处理 */
__rbcBuildSenseData(__SCSI_SENSE_ILLEGAL_REQUEST, /* 设置判别数据 */
__SCSI_ADSENSE_ILLEGAL_COMMAND,
0);
__tpbulkCSWHandler(); /* 进入批量传输的状态处理阶段 */
break;
}
return ucRetStatus;
#undef __cdbGeneric
}
/*********************************************************************************************************
Reduced Block Command Support
*********************************************************************************************************/
/*********************************************************************************************************
** Function name: __rbcFormat
**
** Descriptions: 格式化单元命令
**
** input parameters: 无
** output parameters: 无
** Returned value: __MASS_SUCCESS
** __MASS_FAIL
*********************************************************************************************************/
#if 0
__uint8 __rbcFormat(void)
{
__tpbulkErrorHandler(__CASECMDFAIL, 0); /* 不支持命令 */
/* 设置判别数据 */
__rbcBuildSenseData(__SCSI_SENSE_MEDIUM_ERROR, __SCSI_ADSENSE_FORMAT_ERROR, 0x01);
__tpbulkCSWHandler(); /* 进入批量传输的状态处理阶段 */
return __MASS_SUCCESS;
}
#endif
/*********************************************************************************************************
** Function name: __rbcRead
**
** Descriptions: 读(10)命令要求RBC设备传输数据到主机。记录在逻辑块地址的最新数据值将被返回。
**
** input parameters: 无
** output parameters: 无
** Returned value: TURE
**
*********************************************************************************************************/
__uint8 __rbcRead (void)
{
#define __cdbRead __RBC_CDB.RbcCdb_Read
__msReadSetting((((__uint32)__cdbRead.LBA[0])<<24) + /* RBC设备读数据块之前的设置 */
(((__uint32)__cdbRead.LBA[1])<<16) + /* 第1个参数为逻辑块地址 */
(((__uint32)__cdbRead.LBA[2])<<8) + /* 第2个参数为准备传输的块数 */
(__uint32)__cdbRead.LBA[3],
(((__uint32)__cdbRead.XferLength[0])<<8) +
(__uint32)__cdbRead.XferLength[1]);
__tpbulkSendSetting( __BOTXferAtATA,
__GpucMassStorageBuf,
__GdwCBWXferLen); /* 设置批量数据传输参数 */
__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0); /* 设置判别数据 */
/* 批量传输的错误检查和处理 */
__tpbulkErrorHandler(__CASE6, __GdwCBWXferLen); /* __GdwCBWXferLen 会被修改 */
return __MASS_SUCCESS;
#undef __cdbRead
}
/*********************************************************************************************************
** Function name: __rbcWrite
**
** Descriptions: 写(10)命令要求RBC设备写进从主机传输到介质的数据。
**
** input parameters: 无
** output parameters: 无
** Returned value: __MASS_SUCCESS
**
*********************************************************************************************************/
__uint8 __rbcWrite (void)
{
#define __cdbWrite __RBC_CDB.RbcCdb_Write
__msWriteSetting((((__uint32)__cdbWrite.LBA[0])<<24) + /* RBC设备写数据块之前的设置 */
(((__uint32)__cdbWrite.LBA[1])<<16) + /* 第1个参数为逻辑块地址 */
(((__uint32)__cdbWrite.LBA[2])<<8) + /* 第2个参数为准备传输的块数 */
(__uint32)__cdbWrite.LBA[3],
(((__uint32)__cdbWrite.XferLength[0])<<8) +
(__uint32)__cdbWrite.XferLength[1]);
__tpbulkRecvSetting(__BOTXferAtATA,
__GpucMassStorageBuf,
__GdwCBWXferLen); /* 设置批量数据传输参数 */
__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0); /* 设置判别数据 */
/* 批量传输的错误检查和处理 */
__tpbulkErrorHandler(__CASE12, __GdwCBWXferLen); /* __GdwCBWXferLen 会被修改 */
return __MASS_SUCCESS;
#undef __cdbWrite
}
/*********************************************************************************************************
** Function name: __rbcReadCapacity
**
** Descriptions: 读容量命令允许主机请求当前存储介质的容量(逻辑块数和块大小)。
**
** input parameters: 无
** output parameters: 无
** Returned value: __MASS_SUCCESS
**
*********************************************************************************************************/
__uint8 __rbcReadCapacity (void)
{
#define __cdbReadCap __RBC_CDB.RbcCdb_ReadCapacity
__uint32 tmp;
__PDISK_INFO pmsinfo = msGetInfo(); /* 取设备容量信息 */
tmp = pmsinfo->uiCapacity - 1; /* 最后扇区号码 */
__cdbReadCap.CapData.LBA[0] = (__uint8)(tmp>>24); /* 按大端格式存放 */
__cdbReadCap.CapData.LBA[1] = (__uint8)((tmp<<8)>>24);
__cdbReadCap.CapData.LBA[2] = (__uint8)((tmp<<16)>>24);
__cdbReadCap.CapData.LBA[3] = (__uint8)((tmp<<24)>>24);
/* 按大端格式存放 */
__cdbReadCap.CapData.BlockLen[0] = (__uint8)(pmsinfo->uiBlockLen>>24);
__cdbReadCap.CapData.BlockLen[1] = (__uint8)((pmsinfo->uiBlockLen<<8)>>24);
__cdbReadCap.CapData.BlockLen[2] = (__uint8)((pmsinfo->uiBlockLen<<16)>>24);
__cdbReadCap.CapData.BlockLen[3] = (__uint8)((pmsinfo->uiBlockLen<<24)>>24);
__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0); /* 设置判别数据 */
__tpbulkErrorHandler(__CASE6, sizeof(__READ_CAPACITY_DATA)); /* 批量传输的错误检查和处理 */
/* 设置批量数据传输参数 */
__tpbulkSendSetting(__BOTXferAtRAM, (__uint8*)&(__cdbReadCap.CapData), sizeof(__READ_CAPACITY_DATA));
return __MASS_SUCCESS;
#undef __cdbReadCap
}
#if 1
/*********************************************************************************************************
** Function name: __rbcOnOffUnit
**
** Descriptions: 停止/启动单元命令指示RBC设备允许或禁止介质访问操作,设置电源状态
**
** input parameters: 无
** output parameters: 无
** Returned value: __MASS_SUCCESS
**
*********************************************************************************************************/
__uint8 __rbcOnOffUnit (void)
{
#define __cdbOnOffUnit __RBC_CDB.RbcCdb_OnOffUnit
switch(__cdbOnOffUnit.PowerConditions){
case __PWR_NOCHANGE:
switch(__cdbOnOffUnit.MediumState){
case __MEDIUM_LOAD: /* 加载介质 */
break;
case __MEDIUM_UNLOAD: /* 卸载介质 */
break;
case __MEDIUM_STOP: /* 停止介质 */
break;
case __MEDIUM_READY: /* 准备介质 */
break;
}
break;
case __PWR_ACTIVE: /* 活动状态 */
break;
case __PWR_IDLE: /* 空闲状态 */
break;
case __PWR_STANDBY: /* 就绪状态 */
break;
case __PWR_SLEEP: /* 休眠状态 */
break;
case __PWR_DEVCTRL: /* default: 由设备控制 */
default:
break;
}
__GrbcPropertyData.bits.MediumState = __cdbOnOffUnit.MediumState; /* 保存介质访问设置 */
__GrbcPropertyData.bits.PowerState = __cdbOnOffUnit.PowerConditions;/* 保存电源状态 */
__tpbulkErrorHandler(__CASE1, 0); /* 批量传输的错误检查和处理 */
__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0); /* 设置判别数据 */
__tpbulkCSWHandler(); /* 进入批量传输的状态处理阶段 */
return __MASS_SUCCESS;
#undef __cdbOnOffUnit
}
/*********************************************************************************************************
** Function name: __rbcSyncCache
**
** Descriptions: 同步缓冲区数据,如果缓冲区数据比介质的新,则把缓冲区数据写入到介质。
**
** input parameters: 无
** output parameters: 无
** Returned value: __MASS_SUCCESS
**
*********************************************************************************************************/
__uint8 __rbcSyncCache (void)
{
#define __cdbSyncRBC __RBC_CDB.RbcCdb_SyncCache
__tpbulkErrorHandler(__CASE1, 0); /* 批量传输的错误检查和处理 */
__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0); /* 设置判别数据 */
__tpbulkCSWHandler(); /* 进入批量传输的状态处理阶段 */
return __MASS_SUCCESS;
#undef __cdbSyncRBC
}
/*********************************************************************************************************
** Function name: __rbcVerify
**
** Descriptions: 请求RBC设备验证介质上的数据。
**
** input parameters: 无
** output parameters: 无
** Returned value: __MASS_SUCCESS
**
*********************************************************************************************************/
__uint8 __rbcVerify (void)
{
#define __cdbVerifyRBC __RBC_CDB.RbcCdb_Verify
if( __GdwCBWXferLen == 0 ){ /* 没有逻辑块将被验证 */
__tpbulkErrorHandler(__CASE1, 0); /* 设置主机/设备数据传输情况 */
__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0); /* 设置判别数据 */
__tpbulkCSWHandler(); /* Goto USBFSM4BOT_CSWPROC; */
}else{
/*
* 根据主机发下来的数据验证介质上的数据(没有支持)
*/
__tpbulkErrorHandler(__CSW_FAIL, 0); /* 批量传输的错误检查和处理 */
/* 设置判别数据 */
__rbcBuildSenseData(__SCSI_SENSE_ILLEGAL_REQUEST, __SCSI_ADSENSE_INVALID_PARAMETER, 0);
__tpbulkCSWHandler(); /* 进入批量传输的状态处理阶段 */
return __MASS_FAIL;
}
return __MASS_SUCCESS;
#undef __cdbVerifyRBC
}
#endif
/*********************************************************************************************************
SCSI Primary Command Support
*********************************************************************************************************/
/*********************************************************************************************************
** Function name: __spcInquiry
**
** Descriptions: 查询命令请求发送到主机的RBC设备参数的信息。它用作主机上的驱动器访问RBC设备的
** 配置,特别是在接通电源和硬件复位之后使用。
**
** input parameters: 无
** output parameters: 无
** Returned value: __MASS_SUCCESS
**
*********************************************************************************************************/
__uint8 __spcInquiry (void)
{
#define __cdbInquirySPC __RBC_CDB.SpcCdb_Inquiry
__uint8 retStatus = __MASS_FAIL;
__uint8 *pucData = __MASS_NULL;
__uint32 uiLen = 0;
if(__cdbInquirySPC.EnableVPD){
switch(__cdbInquirySPC.PageCode){
/* 重要的设备数据信息 */
case __VPDPAGE_SERIAL_NUMBER: /* Unit Serial Number page */
pucData = (__uint8*)&__GserialPage;
uiLen = sizeof(__VPD_SERIAL_PAGE);
break;
case __VPDPAGE_DEVICE_IDENTITY: /* Device ID page */
retStatus = __MASS_SUCCESS;
pucData = (__uint8*)&__GdeviceIDPage;
uiLen = sizeof(__VPD_DEVICE_ID_PAGE);
break;
default:
__tpbulkErrorHandler(__CASECMDFAIL, 0);
/* 设置判别数据 */
__rbcBuildSenseData(__SCSI_SENSE_ILLEGAL_REQUEST, __SCSI_ADSENSE_ILLEGAL_COMMAND, 0x00);
__tpbulkCSWHandler(); /* 进入批量传输的状态处理阶段 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -