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

📄 pe_usb_iso.c

📁 FIC8120方案的 StartCell_Driver
💻 C
字号:
///////////////////////////////////////////////////////////////////////////////
//
//	File name: OTG_ISO.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 ISOCHRONOUS Transfer test Rountine & relatived subroutine
//
///////////////////////////////////////////////////////////////////////////////
#define OTG_ISO_GLOBALS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "Pe_my_usbtable.h"
#include "Pe_usb.h"
#include "Pe_usb_pre.h"
#include "FOTG200_peripheral.h"

static INT8U u8ISOOTGInit=FALSE;

INT32U *u32OTGISOArray;
INT32U *u32ISOOTGOutArray;

INT32U u32ISOOTGInTransferCount;
INT32U u32ISOOTGOutTransferCount;
INT32U u32ISOOTGInTest[4096];
INT8U u8ISOOTGOutCount ;

///////////////////////////////////////////////////////////////////////////////
//		vOTG_ISO_Initial() 
//		Description: ISO buffer initial
//		input: none
//		output: none
///////////////////////////////////////////////////////////////////////////////
void vOTG_ISO_Initial(void)
{
	INT32U u32i, u32OTGISOArraySize,u32PacketSize;
	INT32U u32OTGISOArrayCount = 0;
	INT8U* pp;

	if(u8ISOOTGInit == FALSE)
	{
	#if 0
		if(bOTGHighSpeed)
			u32PacketSize = HS_C1_I0_A0_EP1_MAX_PACKET & 0x7ff;
		else
			u32PacketSize = FS_C1_I0_A0_EP1_MAX_PACKET ;
	#else
		u32PacketSize = ((HS_C1_I0_A0_EP1_MAX_PACKET& 0x7ff)>FS_C1_I0_A0_EP1_MAX_PACKET)?
						(HS_C1_I0_A0_EP1_MAX_PACKET& 0x7ff): FS_C1_I0_A0_EP1_MAX_PACKET;
	#endif
			
		u8ISOOTGOutCount = 0;
		u32ISOOTGOutArray = (INT32U *)malloc(u32PacketSize * 16);

		u32ISOOTGOutArray = (INT32U *)malloc(u32PacketSize * 16);
		
		u32OTGISOArray = (INT32U *)malloc(((ISO_Wrap + 1) * u32PacketSize) * 2);

		u32OTGISOArraySize = ((ISO_Wrap + 1) * u32PacketSize) * 2 ;
		pp = (INT8U *)u32OTGISOArray;
		for(u32i = 0; u32i < u32OTGISOArraySize; u32i++)
		{		
			*(pp + 0	) = (INT8U)u32OTGISOArrayCount;
			u32OTGISOArrayCount++;
			u32OTGISOArrayCount = (u32OTGISOArrayCount <= ISO_Wrap) ? u32OTGISOArrayCount : (u32OTGISOArrayCount - (ISO_Wrap + 1));
			
			*(pp + 1	) = (INT8U)u32OTGISOArrayCount;
			u32OTGISOArrayCount++;
			u32OTGISOArrayCount = (u32OTGISOArrayCount <= ISO_Wrap) ? u32OTGISOArrayCount : (u32OTGISOArrayCount - (ISO_Wrap + 1));

			*(pp + 2	) = (INT8U)u32OTGISOArrayCount;
			u32OTGISOArrayCount++;
			u32OTGISOArrayCount = (u32OTGISOArrayCount <= ISO_Wrap) ? u32OTGISOArrayCount : (u32OTGISOArrayCount - (ISO_Wrap + 1));

			*(pp + 3 ) = (INT8U)u32OTGISOArrayCount;
			u32OTGISOArrayCount++;
			u32OTGISOArrayCount = (u32OTGISOArrayCount <= ISO_Wrap) ? u32OTGISOArrayCount : (u32OTGISOArrayCount - (ISO_Wrap + 1));
			
			pp = pp + 4;
		}
		u8ISOOTGInit = TRUE;
	}

}

///////////////////////////////////////////////////////////////////////////////
//		vOTG_ISO_In() 
//		Description: Use PIO/DMA send Isochronous data
//		input: none
//		output: none
///////////////////////////////////////////////////////////////////////////////
void vOTG_ISO_In(void)
{
	INT32U u32PacketSize ;
	if(bOTGHighSpeed)
		u32PacketSize = HS_C1_I0_A0_EP1_MAX_PACKET & 0x7ff;
	else
		u32PacketSize = FS_C1_I0_A0_EP1_MAX_PACKET ;
	
		vOTGDxFWr(FIFO0, u32OTGISOArray +  u32PacketSize * u32ISOOTGInTransferCount / 4,
					(INT16U)u32PacketSize * 8);
		mUsbFIFODone(FIFO0);
		u32ISOOTGInTransferCount = u32ISOOTGInTransferCount + 8;
		u32ISOOTGInTransferCount = (u32ISOOTGInTransferCount <= ISO_Wrap) ? 
								u32ISOOTGInTransferCount : 
								(u32ISOOTGInTransferCount - (ISO_Wrap + 1));
}

///////////////////////////////////////////////////////////////////////////////
//		vOTG_ISO_Out() 
//		Description: Use PIO/DMA get Isochronous data
//		input: none
//		output: none
///////////////////////////////////////////////////////////////////////////////
void vOTG_ISO_Out(void)
{
	INT32U u32PacketSize ;
	INT32U u32ISO_RX_Count = mUsbFIFOOutByteCount(FIFO0);
	int i;

	if(bOTGHighSpeed)
		u32PacketSize = HS_C1_I0_A0_EP1_MAX_PACKET & 0x7ff;
	else
		u32PacketSize = FS_C1_I0_A0_EP1_MAX_PACKET & 0x7ff;

	if(u32PacketSize != u32ISO_RX_Count)
	{
		if(u8OTGMessageLevel & MESS_INFO)
			printf("L%x: ISO Out Byte Count Error = %x...\n", 
				u8LineOTGCount ++, (INT16U)u32ISO_RX_Count);
	}
	
	vOTGDxFRd( FIFO0, u32ISOOTGOutArray, (INT16U)u32PacketSize * 8);
	u8ISOOTGOutCount = u8ISOOTGOutCount + 8;	
	u32ISOOTGOutTransferCount = u32ISOOTGOutTransferCount + 8;

	u32ISOOTGOutTransferCount = (u32ISOOTGOutTransferCount <= ISO_Wrap + 8) ? 
							   u32ISOOTGOutTransferCount : 
							  (u32ISOOTGOutTransferCount - (ISO_Wrap + 1));

#if 1
	if(u8ISOOTGOutCount == 8)
	{

	#if 0
		printf("ISO Out data....(u32ISOTransferCount = 0x%x)\n",(INT16U)u32ISOOTGOutTransferCount );
	#endif
		if(memcmp(u32ISOOTGOutArray, 
				u32OTGISOArray + ((u32PacketSize * (u32ISOOTGOutTransferCount - 8)) >> 2) , 
				u32ISO_RX_Count * 8) != 0)
		{
			printf("ISO Out error data....(u32ISOTransferCount = 0x%x)\n",
				(INT16U)u32ISOOTGOutTransferCount );

	#if 1
			for(i = 0; i < (u32ISO_RX_Count * 8 /4); i++)
			{
				if(u32ISOOTGOutArray[i] != u32OTGISOArray[((u32PacketSize * (u32ISOOTGOutTransferCount - 8)) >> 2) + i])
				{
					printf("========>DstAddr[0x%x] = 0x%04x%04x, should be 0x%04x%04x\n", i, 
						(INT16U)(u32ISOOTGOutArray[i] >> 16),(INT16U)(u32ISOOTGOutArray[i]),
						(INT16U)(u32OTGISOArray[((u32PacketSize * (u32ISOOTGOutTransferCount - 8)) >> 2) + i] >> 16),
						(INT16U)(u32OTGISOArray[((u32PacketSize * (u32ISOOTGOutTransferCount - 8)) >> 2) + i]));
					break;
				}
			}
	#endif		
		}
	else {
	    //  printf("ISO Out data PASS....(u32ISOTransferCount = 0x%x)\n",(INT16U)u32ISOOTGOutTransferCount );
	     // while(1);
	      }
	}	
#endif

	if(u8ISOOTGOutCount == 8)
		u8ISOOTGOutCount = 0;

}



⌨️ 快捷键说明

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