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

📄 pe_usb_bulk.c

📁 GM8120 linux driver.
💻 C
字号:
///////////////////////////////////////////////////////////////////////////////////	File name: usb_bulk.c//	Version: 1.0//	Date: 2003/8/05////	Author: Andrew//	Email: yping@faraday.com.tw//	Phone: (03) 578-7888//	Company: Faraday Tech. Corp.////	Description: USB Bulk IN OUT test Rountine & relatived subroutine/////////////////////////////////////////////////////////////////////////////////#define USB_BULK_GLOBALS#include <stdlib.h>#include <stdio.h>#include <string.h>//#include "fLib.h"#include "Pe_usb.h"#include "FA510.h"#include "FOTG200_peripheral.h"#include "Pe_my_usbtable.h"MassStorageState eOTGProessCBW(void);MassStorageState eOTGDataOut(INT16U u16FIFOByteCount);MassStorageState eOTGDataIn(void);void vShowCBW(void);void vShowCSW(void);void vOTGSendCSW(void);void vOTG_FIFO_INT_action(MassStorageState eState);MassStorageState eUsbOTGMassStorageState;INT8U*   u8VirtOTGMemory = NULL;//[MAX_BUFFER_SIZE];INT32U*   u32VirtOTGMemory = NULL;CSW tOTGCSW;INT32U   u32VirtOTGMemoryIndex;CBW tOTGCBW;INT32U	 u32OTGFIFOUseDMA;INT32U	 u32UseDMAOTGChannel;INT8U   bOTGDMARunning;extern void OTGH_Error_Handle(void);/////////////////////////////////////////////////////////////////////////////////		vOTG_APInit()//		Description: User specified circuit (AP) init//		input: none//		output: none///////////////////////////////////////////////////////////////////////////////void vOTG_APInit(void){			////// initial Cx Vandor command test //////	u8CxOUTVandorDataCount = 0;	u8CxINVandorDataCount = 0;		////// initial Bulk //////	eUsbOTGMassStorageState = STATE_CBW;	// Init State	if(u8VirtOTGMemory != NULL)		free(u8VirtOTGMemory);	u8VirtOTGMemory = (INT8U *)malloc(MAX_BUFFER_SIZE);//	for(u16_i = 0; u16_i < MAX_BUFFER_SIZE; u16_i ++)//  {//		u8VirtOTGMemory[u16_i] = 0x00;			// Init Buffer//	}			if(u32VirtOTGMemory != NULL)		free(u32VirtOTGMemory);	u32VirtOTGMemory = (INT32U *)malloc(MAX_BUFFER_SIZE);	memcpy(u32VirtOTGMemory,u8VirtOTGMemory,MAX_BUFFER_SIZE);		tOTGCSW.u32Signature = CSW_SIGNATE;	// Init u32Signature	////// initial INT and ISO test ////////////	u8OTGInterruptCount = 0;	u32OTGInterrupt_TX_COUNT = 1;		u8OTGInterruptOutCount = 0;	u32OTGInterrupt_RX_COUNT = 1;		u32ISOOTGInTransferCount = 0;	u32ISOOTGOutTransferCount = 0;	}/////////////////////////////////////////////////////////////////////////////////		vUsb_Bulk_Out()//		Description: USB FIFO2 interrupt service process//		input: none//		output: none///////////////////////////////////////////////////////////////////////////////void vUsb_Bulk_Out(INT16U u16FIFOByteCount){	switch(eUsbOTGMassStorageState)	{		case STATE_CBW:			if (u16FIFOByteCount == 31)				eUsbOTGMassStorageState = eOTGProessCBW();			else				mUsbEPoutStallSet(mUsbFIFOMapRd(FIFO2));			break;		case STATE_CB_DATA_OUT:#if 0						if((INT16U)tOTGCBW.u32DataTransferLength != u16FIFOByteCount)					printf("L%x: Byte Count Error = %d. (Correct = %d)\n", 					u8LineOTGCount, u16FIFOByteCount, (INT16U)tOTGCBW.u32DataTransferLength);			else#endif								eUsbOTGMassStorageState = eOTGDataOut(u16FIFOByteCount);			break;		default:			if(u8OTGMessageLevel & (MESS_INFO & MESS_ERROR & MESS_WARNING))				printf("L%x: Error FIFO2_OUT interrupt.\n", u8LineOTGCount);			break;	}	vOTG_FIFO_INT_action(eUsbOTGMassStorageState);}/////////////////////////////////////////////////////////////////////////////////		vUsb_Bulk_In()//		Description: USB FIFO0 interrupt service process//		input: none//		output: none///////////////////////////////////////////////////////////////////////////////void vUsb_Bulk_In(void){	switch(eUsbOTGMassStorageState)	{		case STATE_CSW:			vOTGSendCSW();			eUsbOTGMassStorageState = STATE_CBW;			mUsbIntF0INDis();			break;		case STATE_CB_DATA_IN:			eUsbOTGMassStorageState = eOTGDataIn();			break;		default:			if(u8OTGMessageLevel & (MESS_INFO & MESS_ERROR & MESS_WARNING))				printf("L%x: Error FIFO0_IN interrupt.\n", u8LineOTGCount);			break;	}	if(!bOTGDMARunning)		vOTG_FIFO_INT_action(eUsbOTGMassStorageState);}/////////////////////////////////////////////////////////////////////////////////		vOTG_FIFO_INT_action()//		Description: FIFO interrupt enable or not//					 depend on the STORAGE state//		input: none//		output: none///////////////////////////////////////////////////////////////////////////////void vOTG_FIFO_INT_action(MassStorageState eState){	switch(eState)	{		case STATE_CBW:		case STATE_CB_DATA_OUT:			mUsbIntF0INDis();			break;		case STATE_CSW:		case STATE_CB_DATA_IN:			mUsbIntF0INEn();			break;		default:			break;	}}/////////////////////////////////////////////////////////////////////////////////		eOTGProessCBW()//		Description: Process the CBW//		input: none//		output: MassStorageState///////////////////////////////////////////////////////////////////////////////MassStorageState eOTGProessCBW(void){	MassStorageState eState;#if(Bulk_Satus == Bulk_FIFO_SingleDir)		vOTGDxFRd(FIFO2, (INT8U *)(&tOTGCBW), 12);			// change little endian to big endian	vOTGDxFRd(FIFO2, (INT8U *)(&(tOTGCBW.u8Flags)), 19);#elif(Bulk_Satus == Bulk_FIFO_BiDir)		vOTGDxFRd(FIFO0, (INT8U *)(&tOTGCBW), 12);			// change little endian to big endian	vOTGDxFRd(FIFO0, (INT8U *)(&(tOTGCBW.u8Flags)), 19);#endif	#if ShowMassMsg//	if(u8OTGMessageLevel & MESS_INFO)		vShowCBW();#endif		if(tOTGCBW.u32Signature != CBW_SIGNATE)		eState = STATE_CBW;	else	{		// pass u32DataTransferLength to u32DataResidue		tOTGCSW.u32DataResidue = tOTGCBW.u32DataTransferLength;		// pass Tag from CBW to CSW		tOTGCSW.u32Tag = tOTGCBW.u32Tag;		// Assume Status is CMD_PASS		tOTGCSW.u8Status = CSW_STATUS_CMD_PASS;		// Get Virtual Memory start address.#if 1				u32VirtOTGMemoryIndex = (INT32U)(tOTGCBW.u8CB[0]) | ((INT32U)tOTGCBW.u8CB[1] << 8);#else		u32VirtOTGMemoryIndex = ((INT32U)(tOTGCBW.u8CB[0]) | ((INT32U)tOTGCBW.u8CB[1] << 8))>>2;#endif		if (tOTGCSW.u32DataResidue == 0)			eState = STATE_CSW;		else if (tOTGCBW.u8Flags == 0x00)			eState = STATE_CB_DATA_OUT;		else			eState = STATE_CB_DATA_IN;	}	return eState;}/////////////////////////////////////////////////////////////////////////////////		Waiting_For_DMA_Complete()//		Description: Process the data intput stage//		input: none//		output: MassStorageState///////////////////////////////////////////////////////////////////////////////#if 0int Waiting_For_DMA_Complete(INT8U FIFONum){ UINT32 wTemp; //Waiting for Complete 	while(1)	{		wTemp = mUsbIntSrc2Rd();		if(wTemp & BIT8)		{		  mUsbFIFOClr((INT32U)FIFONum);			mUsbIntDmaErrClr();			printf("Waiting_For_DMA_Complete => FIFO%d transfer DMA error..\n",FIFONum);			while(1);			break;		}		if(wTemp & BIT7)		{			mUsbIntDmaFinishClr();			break;		}		if((wTemp & 0x00000007)>0)//If (Resume/Suspend/Reset) exit		{      mUsbDMARst();      mUsbFIFOClr((INT32U)FIFONum);			mUsbIntDmaFinishClr();			printf("L%x: FIFO%d OUT transfer DMA stop because USB Resume/Suspend/Reset..", u8LineOTGCount ++,FIFONum);			break;		}	}	mUsbDMA2FIFOSel(FOTG200_DMA2FIFO_Non);  bOTGDMARunning = FALSE; vOTGCheckDMA();return 0;}#endif/////////////////////////////////////////////////////////////////////////////////		eOTGDataOut()//		Description: Process the data output stage//		input: none//		output: MassStorageState///////////////////////////////////////////////////////////////////////////////MassStorageState eOTGDataOut(INT16U u16FIFOByteCount){ //INT32U *u32pData; //Bruce;;Test  if (bOTGDMARunning == TRUE)     {printf("??? Error (eOTGDataOut during bOTGDMARunning = TRUE )\n");     OTGH_Error_Handle();     }  memset(u8VirtOTGMemory, 0xaa, MAX_BUFFER_SIZE);     #if DCacheEnable  CPUCleanInvalidateDCacheAll(); fLib_DisableDCache();   #endif #if(Bulk_Satus == Bulk_FIFO_SingleDir) mUsbIntF0INDis(); mUsbIntF2OUTDis(); u32OTGFIFOUseDMA = FIFO2; mUsbDMA2FIFOSel(FOTG200_DMA2FIFO2);#elif(Bulk_Satus == Bulk_FIFO_BiDir)  mUsbIntF0INDis(); mUsbIntF0OUTDis(); u32OTGFIFOUseDMA = FIFO0; mUsbDMA2FIFOSel(FOTG200_DMA2FIFO0);#endif mUsbDmaConfig(tOTGCSW.u32DataResidue,DIRECTION_OUT); mUsbDmaAddr(&u8VirtOTGMemory[u32VirtOTGMemoryIndex]);  if (mUsbIntDmaFinishRd()>0)     {printf("??? Error (Do not clear mUsbIntDmaFinish during start another DMA )\n");     OTGH_Error_Handle();     }   //Bruce;;Move// mUsbDmaStart(); mUsbIntEP0SetupDis(); mUsbIntEP0InDis(); mUsbIntEP0OutDis(); mUsbIntEP0EndDis(); bOTGDMARunning = TRUE; //u32pData=0x92000138; //if ((*u32pData&0x00000003)!=3) //    {printf("??? Peripheral can not disable the mask...\n");      //    OTGH_Error_Handle(); //    } //u32pData=0x92000038;//Debug;;Bruce //*u32pData=0xAA;//Debug;;Bruce   mUsbDmaStart();//Bruce;;Move  #if 0//Bruce;;07152005 Waiting_For_DMA_Complete(FIFO0); #endif    return STATE_CB_DATA_OUT;} /////////////////////////////////////////////////////////////////////////////////		eOTGDataIn()//		Description: Process the data intput stage//		input: none//		output: MassStorageState///////////////////////////////////////////////////////////////////////////////MassStorageState eOTGDataIn(void){// INT32U *u32pData; //Bruce;;Test if (bOTGDMARunning == TRUE)     {printf("??? Error (eOTGDataIn during bOTGDMARunning = TRUE )\n");     OTGH_Error_Handle();     } #if DCacheEnable  CPUCleanInvalidateDCacheAll(); fLib_DisableDCache();   #endif #if(Bulk_Satus == Bulk_FIFO_SingleDir) mUsbIntF0INDis(); mUsbIntF2OUTDis(); u32OTGFIFOUseDMA = FIFO2;#elif(Bulk_Satus == Bulk_FIFO_BiDir)  mUsbIntF0INDis(); mUsbIntF0OUTDis(); u32OTGFIFOUseDMA = FIFO0;#endif  mUsbDmaConfig(tOTGCSW.u32DataResidue,DIRECTION_IN); mUsbDMA2FIFOSel(FOTG200_DMA2FIFO0); mUsbDmaAddr(&u8VirtOTGMemory[u32VirtOTGMemoryIndex]);  if (mUsbIntDmaFinishRd()>0)     {printf("??? Error (Do not clear mUsbIntDmaFinish during start another DMA )\n");     OTGH_Error_Handle();     }    //Bruce;;Move  mUsbDmaStart();  mUsbIntEP0SetupDis(); mUsbIntEP0InDis(); mUsbIntEP0OutDis(); mUsbIntEP0EndDis(); bOTGDMARunning = TRUE; u32OTGFIFOUseDMA = FIFO0;// u32pData=0x92000138;// if ((*u32pData&0x00000003)!=3)//     {printf("??? Peripheral can not disable the mask...\n");      //    OTGH_Error_Handle(); //    }//  u32pData=0x92000038;//Debug;;Bruce// *u32pData=0xAA;//Debug;;Bruce  mUsbDmaStart();//Bruce;;Move   #if 0//Bruce;;07152005 Waiting_For_DMA_Complete(FIFO0); #endif     return STATE_CB_DATA_IN;} /////////////////////////////////////////////////////////////////////////////////		vShowCBW()//		Description: show the whole CBW structure//		input: none//		output: none///////////////////////////////////////////////////////////////////////////////void vShowCBW(void){	INT8U i;	INT8U * pp;	pp = (INT8U *)&tOTGCBW;	printf("tOTGCBW: \n");	for (i = 0; i < 16; i ++)		printf("%02x ", *(pp ++));	printf("\n");	for (i = 16; i < 31; i ++)		printf("%02x ", *(pp ++));	printf("\n");}/////////////////////////////////////////////////////////////////////////////////		vShowCSW()//		Description: show the whole CSW structure//		input: none//		output: none///////////////////////////////////////////////////////////////////////////////void vShowCSW(void){	if(u8OTGMessageLevel & (MESS_INFO))	{		INT8U i;		INT8U * pp;		pp = (INT8U *)&tOTGCSW;		printf("tOTGCSW: \n");		for (i = 0; i < 13; i ++)			printf("%02x ", *(pp ++));		printf("\n");	}}/////////////////////////////////////////////////////////////////////////////////		vOTGSendCSW()//		Description: Send out the CSW structure to PC//		input: none//		output: none///////////////////////////////////////////////////////////////////////////////void vOTGSendCSW(){	// Send CSW to F0 via DBUS;#if ShowMassMsg	vShowCSW();#endif	vOTGDxFWr(FIFO0, (INT8U *)(&tOTGCSW			  ) , 13);	mUsbFIFODone(FIFO0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -