📄 mass_cbitrance.c
字号:
#include "HostStack.h"
/* 定义CBI复位命令数据结构 */
const uint8 Command_Block_Rest[12] = { 0x1d,0x04,0xff,0xff,
0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff };
uint8 CBI_CommandBlockReset(MassStorageClass * MSC_ptr)
{
TR_With_RBC tr_with_rbc_ptr;
endpoint_info * epi_ptr;
tr_with_rbc_ptr.DataTransferLength = 0;
//tr_with_rbc_ptr.Data_BuffPtr =
tr_with_rbc_ptr.MSC = MSC_ptr;
tr_with_rbc_ptr.RBC_BuffPtr = (uint8 *)Command_Block_Rest;
tr_with_rbc_ptr.TrDirection = NONE_DATA;
epi_ptr = MSC_ptr->tr_bulk_in_ptr->epi_ptr;
if(ClearEndpointSTALL(MSC_ptr->dvi_ptr, epi_ptr) == FALSE)
return FALSE;
epi_ptr = MSC_ptr->tr_bulk_in_ptr->epi_ptr;
if(ClearEndpointSTALL(MSC_ptr->dvi_ptr, epi_ptr) == FALSE)
return FALSE;
if(COMMAND_PASSED == CBIOnlyComHandle( &tr_with_rbc_ptr ));
{
return TRUE;
}
return FALSE;
}
/* 定义CBI命令请求数据结构 */
const USB_Device_Request COMMAND_REQ = {0x21,0x00,0x0000,0x0000,0x000c};
//**********************************************************************************************
// 函数名称:CBI_OnlyTransport
// 输入参数:tr_with_rbc_ptr,
// 输出参数:COMMAND_PASSED,命令完成
// COMMAND_FAILED,命令失败
// PHASE_ERROR,相位出错
// PERSISTENT_FAILURE,严重出错
// 功能描述:CBI传输协议命令块传输及处理
//**********************************************************************************************
uint8 CBIOnlyComHandle( TR_With_RBC *tr_with_rbc_ptr)
{
USB_Device_Request command_req;
device_instance * dvi_ptr;
uint8 Status[2];
uint16 tr_size;
uint16 ComCode;
dvi_ptr = tr_with_rbc_ptr->MSC->dvi_ptr;
if(dvi_ptr==NULL)
return PERSISTENT_FAILURE;
command_req.bmRequestType = 0x21;
command_req.bRequest = 0x00;
command_req.wValue = 0x0000;
command_req.wIndex = 0x0000;
command_req.wLength = 0x000c;
/* 控制传输 */
ComCode = control_transfer( &command_req, dvi_ptr, tr_with_rbc_ptr->RBC_BuffPtr);
if((ComCode & 0xf) == CompletionCode_Stall)
return COMMAND_FAILED;
if(ComCode)
return PERSISTENT_FAILURE;
/* 批量传输 */
if(tr_with_rbc_ptr->TrDirection== IN_DATA)
{
ComCode = bulk_transaction( DirectionPID_IN,
tr_with_rbc_ptr->Data_BuffPtr,
&tr_with_rbc_ptr->DataTransferLength,
tr_with_rbc_ptr->MSC->tr_bulk_in_ptr);
if( (ComCode & 0xf) == CompletionCode_Stall)
{ if(FALSE == ClearEndpointSTALL( dvi_ptr,
tr_with_rbc_ptr->MSC->tr_bulk_in_ptr->epi_ptr)) // 清批量输出停止状态
return PERSISTENT_FAILURE;
}
}
if(tr_with_rbc_ptr->TrDirection == OUT_DATA)
{
ComCode = bulk_transaction( DirectionPID_OUT,
tr_with_rbc_ptr->Data_BuffPtr,
&tr_with_rbc_ptr->DataTransferLength,
tr_with_rbc_ptr->MSC->tr_bulk_out_ptr);
if( (ComCode & 0xf) == CompletionCode_Stall)
{ if(FALSE == ClearEndpointSTALL( dvi_ptr,
tr_with_rbc_ptr->MSC->tr_bulk_out_ptr->epi_ptr)) // 清批量输出停止状态
return PERSISTENT_FAILURE;
}
}
/* 中断传输 */
tr_size = 2;
ComCode = interrupt_transaction( IN_DATA, Status, &tr_size,
tr_with_rbc_ptr->MSC->tr_int_in_ptr);
if(ComCode)
return PERSISTENT_FAILURE;
if( 0 == Status[0] ) /* 如果中断端点返回的第一个字节不为0,则指令出错 */
return Status[1];
else
return COMMAND_FAILED;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -