⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tpbulk.c

📁 该软件为在sunplus的61单片机上实现的mp3播放器.里面有完整的源代码.
💻 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 + -