📄 drv_usb_scsi.c
字号:
+ cdbRead10.LogicalBlockAddress[i];
}
for(i=0; i<2; i++)
{
Bulk_Control_r.Transfer_Length = Bulk_Control_r.Transfer_Length * 0x100
+ cdbRead10.TransferLength[i];
}
Bulk_Control_r.BufCount = 0;
/* 将U盘上的数据写入DataBuf缓冲区(一次读取一页)*/
drv_sd_read(Bulk_Control_r.LogicalBlockAddress, (D_INT32 *)DataBuf, 1);
/*每次读U盘后,更新Transfer_Length、LogicalBlockAddress*/
Bulk_Control_r.Transfer_Length--;
Bulk_Control_r.LogicalBlockAddress++;
/*每次读U盘数据长度为512,写入USB端点64,所以需要多次写端点
Bulk_Control_r.BufCount用来标示下次写的数据在DataBuf中的起始位置*/
Bulk_Control_r.BufCount = 0;
bEPPflags.bits.bulk_state = BULK_DATA_TRANS;
/*设置CSW状态CSW_GOOD,CSW包在所有主机要求的数据传送完毕后才发送*/
Bulk_ErrorHandler(CSW_GOOD, CBW_bCBWCBLength);
/* 将缓冲区DataBuf中数据写入EP1(输入端点)*/
USB_WriteEndpoint(USB_ENDPOINT_TYPE_ISOCHRONOUS, EP1_PACKET_SIZE, DataBuf);
return TRUE;
#undef cdbRead10
}
/*************************************************
函数名称: D_BOOL RBC_ReadCapacity(void)
函数功能: 主机获取设备介质容量
被本函数调用的函数:
Bulk_ErrorHandler (): 错误状态控制
Bulk_CSWHandler (): 发送执行状态CSW
Bulk_code_transmit (): 批量发送函数
RBC_BuildSenseData():构造SenseData
调用本函数的函数: RBC_Handler():处理批量传输命令
访问到的全局变量: ReadCapacityData:设备容量数据
被修改的全局变量: 无
输入参数: 无
输出参数: 无
函数返回值: 无
其它: 无
*********************************************************/
D_BOOL RBC_ReadCapacity(void)
{
/*如果nomedia, status置CSW_FAIL, 并且返回CSW信息*/
if (NoMedia)
{
RBC_BuildSenseData(NOT_READY, SCSI_ADSENSE_NO_MEDIA_IN_DEVICE, 0);
Bulk_ErrorHandler(CSW_FAIL, 0);
Bulk_CSWHandler();
}
/*如果nomedia 为0, 返回设备容量信息ReadCapacityData*/
else
{
Bulk_code_transmit((D_UINT8*)&ReadCapacityData,
sizeof(READ_CAPACITY_DATA));
}
return TRUE;
}
/*************************************************
函数名称: D_BOOL RBC_ StartStop (void)
函数功能: 主机启动/停止设备
被本函数调用的函数:
Bulk_ErrorHandler (): 错误状态控制
Bulk_CSWHandler (): 发送执行状态CSW
RBC_BuildSenseData():构造SenseData
调用本函数的函数: RBC_Handler():处理批量传输命令
访问到的全局变量: Bulk_Block:主机发给设备的CBW数据
被修改的全局变量: 无
输入参数: 无
输出参数: 无
函数返回值: 无
其它: 无
*******************************************************/
D_BOOL RBC_StartStop(void)
{
/*如果loej && !start, 设置nomedia变量为1. 并且返回CSW信息*/
if (Bulk_Block.cbw.CBWCB.RbcCdb_OnOffUnit.Loej
&& !Bulk_Block.cbw.CBWCB.RbcCdb_OnOffUnit.Start)
{
NoMedia = 1;
RBC_BuildSenseData(NOT_READY, SCSI_ADSENSE_NO_MEDIA_IN_DEVICE, 0);
}
else
{
NoMedia = 0;
}
Bulk_ErrorHandler(CSW_GOOD, 0);
Bulk_CSWHandler();
return TRUE;
}
/*************************************************
函数名称: D_BOOL SPC_FormatCapacity (void)
函数功能: 主机获取设备格式化后的容量
被本函数调用的函数:
Bulk_ErrorHandler (): 差错控制
Bulk_CSWHandler (): 发送执行状态CSW
RBC_BuildSenseData():构造SenseData
调用本函数的函数: RBC_Handler():处理批量传输命令
访问到的全局变量: 无
被修改的全局变量: 无
输入参数: 无
输出参数: 无
函数返回值: 无
其它: 无
*******************************************************/
D_BOOL SPC_FormatCapacity(void)
{
/**************************************************
目前硬件不支持此命令,
暂时作illegal request处理
待硬件支持后在更新代码
**************************************************/
/*设置处理结果状态数据RequestSenseData*/
RBC_BuildSenseData(ILLEGAL_REQUEST, SCSI_ADSENSE_ILLEGAL_COMMAND, 0);
/*构造应答CSW,处理状态CSW_FAIL*/
Bulk_ErrorHandler(CSW_FAIL, 0);
Bulk_CSWHandler();
return TRUE;
}
/*************************************************
函数名称: D_BOOL SPC_RequestSense(void)
函数功能: 主机获取设备执行错误信息
被本函数调用的函数:
Bulk_code_transmit ():批量发送函数
RBC_BuildSenseData():构造SenseData
调用本函数的函数: RBC_Handler():处理批量传输命令
访问到的全局变量: RequestSenseData:命令执行结果及状态数据
被修改的全局变量: 无
输入参数: 无
输出参数: 无
函数返回值: 无
其它: 无
*******************************************************/
D_BOOL SPC_RequestSense(void)
{
CSWStatus = CSW_GOOD; /*必须在发送之前设置*/
/*返回命令处理错误信息RequestSenseData*/
Bulk_code_transmit((D_UINT8*)&RequestSenseData,
sizeof(REQUEST_SENSE_DATA));
/*将错误信息RequestSenseData置0*/
RBC_BuildSenseData(NO_SENSE, SCSI_ADSENSE_NO_SENSE, 0);
return TRUE;
}
/*************************************************
函数名称: D_BOOL SPC_ TestUnit (void)
函数功能: 主机查询设备是否处于ready状态
被本函数调用的函数:
Bulk_ErrorHandler (): 错误状态控制
Bulk_CSWHandler (): 发送执行状态CSW
RBC_BuildSenseData():构造SenseData
调用本函数的函数: RBC_Handler():处理批量传输命令
访问到的全局变量: SenseData:设备状态数据
被修改的全局变量: 无
输入参数: 无
输出参数: 无
函数返回值: 无
其它: 无
*******************************************************/
D_BOOL SPC_TestUnit(void)
{
/*如果nomedia为1, status置CSW_FAIL, 并且返回CSW信息*/
if (NoMedia)
{
RBC_BuildSenseData(NOT_READY, SCSI_ADSENSE_NO_MEDIA_IN_DEVICE, 0);
Bulk_ErrorHandler(CSW_FAIL, 0);
}
/*如果nomedia为0, status置CSW_GOOD, 并且返回CSW信息*/
else
{
Bulk_ErrorHandler(CSW_GOOD, 0);
}
Bulk_CSWHandler();
return TRUE;
}
/*************************************************
函数名称: D_BOOL SPC_ Verify10 (void)
函数功能: 主机验证设备中存储的数据是否正确
被本函数调用的函数:
Bulk_ErrorHandler (): 错误状态控制
Bulk_CSWHandler (): 发送执行状态CSW
调用本函数的函数: RBC_Handler():处理批量传输命令
访问到的全局变量: 无
被修改的全局变量: 无
输入参数: 无
输出参数: 无
函数返回值: 无
其它: 无
*******************************************************/
D_BOOL RBC_Verify10(void)
{
/*没有数据返回, 直接返回CSW信息, status是CSW_GOOD*/
Bulk_ErrorHandler(CSW_GOOD, 0);
Bulk_CSWHandler();
return TRUE;
}
/*************************************************
函数名称: D_BOOL SPC_ Write10 (void)
函数功能: 写数据
被本函数调用的函数:
Bulk_ErrorHandler (): 错误状态控制
调用本函数的函数: RBC_Handler():处理批量传输命令
访问到的全局变量: ModeData:设备参数模式
被修改的全局变量:
Bulk_Control_w: bulk-only传输写数据控制数据
bEPPflags: usb状态
输入参数: 无
输出参数: 无
函数返回值: 无
其它: 无
*******************************************************/
D_BOOL RBC_Write10(void)
{
#define cdbWrite10 Bulk_Block.cbw.CBWCB.RbcCdb_Write10
/*获取要读取的数据的地址、长度、起始块和页*/
D_INT32 i;
Bulk_Control_w.LogicalBlockAddress = 0;
Bulk_Control_w.Transfer_Length = 0;
for (i=0; i<4; i++)
{
Bulk_Control_w.LogicalBlockAddress =
Bulk_Control_w.LogicalBlockAddress * 0x100
+ cdbWrite10.LogicalBlockAddress[i];
}
for (i=0; i<2; i++)
{
Bulk_Control_w.Transfer_Length = Bulk_Control_w.Transfer_Length * 0x100
+ cdbWrite10.TransferLength[i];
}
Bulk_Control_w.BufCount = 0;
/*设置usb为接收数据状态,接收到的数据在ep2_rxdone()中写入u盘中*/
bEPPflags.bits.bulk_state = BULK_DATA_RECIEVE;
Bulk_ErrorHandler(CSW_GOOD, CBW_bCBWCBLength);
return TRUE;
#undef cdbWrite10
}
/*************************************************
函数名称: D_BOOL SPC_ LockMedia (void)
函数功能: 主机对设备设置写保护命令
被本函数调用的函数:
Bulk_ErrorHandler (): 错误状态控制
Bulk_CSWHandler (): 发送执行状态CSW
RBC_BuildSenseData():构造SenseData
调用本函数的函数: RBC_Handler():处理批量传输命令
访问到的全局变量: Bulk_Block:主机发给设备的CBW数据
被修改的全局变量: 无
输入参数: 无
输出参数: 无
函数返回值: 无
其它: 无
*******************************************************/
D_BOOL SPC_LockMedia(void)
{
/*prevent为1, 返回CSW信息, 并且置status为CSW_FAIL*/
if (Bulk_Block.cbw.CBWCB.SpcCdb_Removeal.Prevent)
{
RBC_BuildSenseData(ILLEGAL_REQUEST, SCSI_ADSENSE_INVALID_CDB, 0);
Bulk_ErrorHandler(CSW_FAIL, 0);
}
/*prevent为0, 返回CSW信息, 并且置status为CSW_GOOD*/
else
{
Bulk_ErrorHandler(CSW_GOOD, 0);
}
Bulk_CSWHandler();
return TRUE;
}
/*************************************************
函数名称: D_BOOL SPC_ Reserve6 (void)
函数功能: 错误的主机命令处理
被本函数调用的函数:
Bulk_ErrorHandler (): 错误状态控制
Bulk_CSWHandler (): 发送执行状态CSW
RBC_BuildSenseData():构造SenseData
调用本函数的函数: RBC_Handler():处理批量传输命令
访问到的全局变量: IllegalRequestSenseData:非法的请求数据
被修改的全局变量: 无
输入参数: 无
输出参数: 无
函数返回值: 无
其它: 无
*******************************************************/
D_BOOL SPC_Reserve6(void)
{
RBC_BuildSenseData(ILLEGAL_REQUEST, SCSI_ADSENSE_ILLEGAL_COMMAND, 0);
Bulk_ErrorHandler(CSW_FAIL, 0);
Bulk_CSWHandler();
return TRUE;
}
/*************************************************
函数名称: void RBC_BuildSenseData(D_UINT8 SenseKey,
D_UINT8 ASC, D_UINT8 ASCQ)
函数功能: 构造SenseData
被本函数调用的函数: 无
调用本函数的函数:
SPC_ModeSense6():主机获取设备参数
RBC_ReadCapacity():主机获取设备介质容量
SPC_RequestSense():主机获取设备执行错误信息
SPC_TestUnit():主机查询设备是否处于ready状态
SPC_LockMedia():主机对设备设置写保护命令
SPC_Reserve6():错误的主机命令处理
访问到的全局变量: RequestSenseData:命令执行结果及状态数据
被修改的全局变量: RequestSenseData:命令执行结果及状态数据
输入参数: SenseKey: 错误码
ASC: Additional Sense codes
ASCQ: 0 (目前没有使用)
输出参数: 无
函数返回值: 无
其它: 无
*******************************************************/
void RBC_BuildSenseData(D_UINT8 SenseKey,
D_UINT8 ASC, D_UINT8 ASCQ)
{
RequestSenseData.SenseKey = SenseKey;
RequestSenseData.ASC = ASC;
RequestSenseData.ASCQ = ASCQ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -