📄 tpbulk.c
字号:
/*C**************************************************************************
* 文件名: filename.c
*----------------------------------------------------------------------------
* 版权: (c) 2004 TGE.
*----------------------------------------------------------------------------
* 释放: Spce061A
* 版本: 1.0
*----------------------------------------------------------------------------
* 目的:
* This is the demonstration software for SPCE061A
*****************************************************************************/
/*_____ 包括 ________________________________________________________*/
#include "TPBulk.h"
#include "rbccmd.h"
#include "..\\d12\\d12ci.h"
//#include "numoper.h"
/*_____ 宏 ________________________________________________________*/
/*
#define TPBulk_CBW TPBulk_Block.TPBulk_CommandBlock
#define RBC_CDB TPBulk_CBW.cdbRBC
#define RBC_LUN TPBulk_CBW.bCBW_LUN
#define TPBulk_CSW TPBulk_Block.TPBulk_CommandStatus
*/
#define EP2_PACKET_SIZE 64
/*_____ 定义 ________________________________________________________*/
CBW TPBulk_CBW; //define CBW Struct
#define CBW_wXferLen TPBulk_CBW.dCBW_DataXferLen[0] + TPBulk_CBW.dCBW_DataXferLen[1]*0x100 + TPBulk_CBW.dCBW_DataXferLen[2]*0x10000 + TPBulk_CBW.dCBW_DataXferLen[3]*0x1000000
#define RBC_CDB TPBulk_CBW.cdbRBC
#define RBC_LUN TPBulk_CBW.bCBW_LUN
CSW TPBulk_CSW; //define CSW struct
#define CSW_wResidue TPBulk_CSW.dCSW_DataResidue[0] + TPBulk_CSW.dCSW_DataResidue[1]*0x100 + TPBulk_CSW.dCSW_DataResidue[2]*0x10000 +TPBulk_CSW.dCSW_DataResidue[3]*0x1000000
extern unsigned long int g_RWaddress; //global read/write address
extern unsigned long int g_pRWaddr; //global Read/Write Addr Point
unsigned int *BOTXfer_pData; //global variable
unsigned int BOTXfer_wResidue;
BIT_STATUS bFlags;
unsigned int BOTFSMstate;
/*_____ 声明 ________________________________________________________*/
/*F**************************************************************************
* 函数名: TPBulk_CBWHandler( void )
*----------------------------------------------------------------------------
* 入口参数:
* 返回:
*----------------------------------------------------------------------------
* 目的: Bulk-Only TP-Bulk Hanlder
*----------------------------------------------------------------------------
* 范例:
*----------------------------------------------------------------------------
* 注意:
*----------------------------------------------------------------------------
* 需要S:
*****************************************************************************/
#define CBWLEN 0x1f
void TPBulk_CBWHandler( void )
{
/*
// Get CBW
*/
if( CBWLEN == F_D12_ReadEndpointAndClrD12Int(4,EP2_PACKET_SIZE,(unsigned int)&(TPBulk_CBW)) )
{
if(TPBulksup_IsCBWValid())
{
/*
// for Valid CBW
*/
RBC_Handler();
return;
}
}
/*
// for Invalid CBW
// Stall Both Bulk Endpoints
// Let host goto reset recovery sequence
*/
TPBulksup_ErrorHandler(CASECBW,0);
TPBulk_CSWHandler(); // Goto USBFSM4BOT_CSWPROC;
}
void TPBulksup_ErrorHandler(unsigned int HostDevCase,unsigned int wByteCounterDevWillXfer)
{
// Xfer Sample: TPBulk_CSW.dCSW_DataResidue = TPBulk_CBW.dCBW_DataXferLen - wByteCounterDevWillXfer;
unsigned long int tempData;
tempData= CBW_wXferLen;
tempData -= wByteCounterDevWillXfer;
TPBulk_CSW.dCSW_DataResidue[0]=tempData & 0xff;
TPBulk_CSW.dCSW_DataResidue[1]=(tempData>>8) & 0xff;
TPBulk_CSW.dCSW_DataResidue[2]=(tempData>>16) & 0xff;
TPBulk_CSW.dCSW_DataResidue[3]=(tempData>>24) & 0xff;
switch(HostDevCase)
{
case CASEOK:
case CASE1: /* Hn=Dn*/
case CASE6: /* Hi=Di*/
TPBulk_CSW.bCSW_Status = CSW_GOOD;
break;
case CASE12: /* Ho=Do*/
TPBulk_CSW.bCSW_Status = CSW_GOOD;
break;
case CASE2: /* Hn<Di*/
case CASE3: /* Hn<Do*/
TPBulk_CSW.bCSW_Status = CSW_PHASE_ERROR;
break;
case CASE4: /* Hi>Dn*/
case CASE5: /* Hi>Di*/
StallAtBulkIn = 1;
TPBulk_CSW.bCSW_Status = CSW_FAIL;//CSW_GOOD or CSW_FAIL
break;
case CASE7: /* Hi<Di*/
case CASE8: /* Hi<>Do */
TPBulk_CSW.bCSW_Status = CSW_PHASE_ERROR;
break;
case CASE9: /* Ho>Dn*/
case CASE11: /* Ho>Do*/
TPBulk_CSW.bCSW_Status = CSW_FAIL;//CSW_GOOD or CSW_FAIL
break;
case CASE10: /* Ho<>Di */
case CASE13: /* Ho<Do*/
TPBulk_CSW.bCSW_Status = CSW_PHASE_ERROR;
break;
case CASECBW: /* invalid CBW */
StallAtBulkIn = 1;
StallAtBulkOut = 1;
TPBulk_CSW.bCSW_Status = CSW_PHASE_ERROR;
break;
case CASECMDFAIL:
StallAtBulkIn = 1;
TPBulk_CSW.bCSW_Status = CSW_FAIL;
break;
default:
break;
}
/*
Initial CSW *****
*/
// 52425355H -> dCSW.Signature
TPBulk_CSW.dCSW_Signature[0]=0x55;
TPBulk_CSW.dCSW_Signature[1]=0x53;
TPBulk_CSW.dCSW_Signature[2]=0x42;
TPBulk_CSW.dCSW_Signature[3]=0x53;
// TPBulk_CBW.dCBW_Tag -> TPBulk_CSW.dCSW_Tag
TPBulk_CSW.dCSW_Tag[0]= TPBulk_CBW.dCBW_Tag[0];
TPBulk_CSW.dCSW_Tag[1]= TPBulk_CBW.dCBW_Tag[1];
TPBulk_CSW.dCSW_Tag[2]= TPBulk_CBW.dCBW_Tag[2];
TPBulk_CSW.dCSW_Tag[3]= TPBulk_CBW.dCBW_Tag[3];
}
void TPBulk_CSWHandler( void )
{
unsigned long int tempData;
tempData= CSW_wResidue;
tempData += BOTXfer_wResidue;;
TPBulk_CSW.dCSW_DataResidue[0]=tempData & 0xff;
TPBulk_CSW.dCSW_DataResidue[1]=(tempData>>8) & 0xff;
TPBulk_CSW.dCSW_DataResidue[2]=(tempData>>16) & 0xff;
TPBulk_CSW.dCSW_DataResidue[3]=(tempData>>24) & 0xff;
if(StallAtBulkIn)
{
F_D12_SetEndpointStatus(5,1); //Stall -> Bulk-In
// TPBulk_CSW.dCSW_DataResidue += BOTXfer_wResidue;
BOTXfer_pData = (unsigned int) &TPBulk_CSW;
BOTXfer_wResidue = sizeof(CSW);
}
else if(StallAtBulkOut)
{
F_D12_SetEndpointStatus(4,1); //Stall -> Bulk-Out
BOTFSMstate=BOTFSM_Stall;
// BOTFSM_Stall=TRUE;
}
else
{
// TPBulk_CSW.dCSW_DataResidue += BOTXfer_wResidue;
BOTXfer_pData = (unsigned int) &TPBulk_CSW;
BOTXfer_wResidue = sizeof(CSW);
BOTFSMstate=USBFSM4BOT_CSW;
}
}
unsigned int TPBulksup_IsCBWValid( void)
{
if( TPBulk_CBW.dCBW_Signature[0] == 0x0055 &&
TPBulk_CBW.dCBW_Signature[1] == 0x0053 &&
TPBulk_CBW.dCBW_Signature[2] == 0x0042 &&
TPBulk_CBW.dCBW_Signature[3] == 0x0043 && //Check dCBW.Signature = 0x43 42 53 55
TPBulk_CBW.bCBW_LUN <= 1 &&
TPBulk_CBW.bCBW_CDBLen <= MAX_CDBLEN )
return(1);
else
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -