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

📄 pe_usb_intr.c

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

INT8U u8LineOTGCount;
INT8U u8OTGMessageLevel;
INT8U *u8InterruptOTGArray;

INT8U u8Test;

///////////////////////////////////////////////////////////////////////////////
//		vOTG_Interrupt_Initial() 
//		Description: Initial interrupt transfer test variable
//		input: none
//		output: none
///////////////////////////////////////////////////////////////////////////////
void vOTG_Interrupt_Initial(void)
{
	INT8U u8i = 0;
	INT16U u16i;
	static INT8U u8IntTransInit = FALSE;

	if(u8IntTransInit == FALSE)
	{
		u8InterruptOTGArray =  (INT8U *)malloc(2048);
		for (u16i = 0; u16i < 2048; u16i ++)
		{
			u8InterruptOTGArray[u16i] = u8i ++;
		}
		u8IntTransInit = TRUE;
	}
}

///////////////////////////////////////////////////////////////////////////////
//		vOTG_Interrupt_In() 
//		Description: FIFO4 interrupt service process
//		input: none
//		output: none
///////////////////////////////////////////////////////////////////////////////
void vOTG_Interrupt_In(void)
{
	INT32U u32i;
	INT32U u32PacketSize ;
	INT8U *u8Array;
	
#if((OTG_AP_Satus == Bulk_AP) && (Bulk_Satus == Bulk_FIFO_BiDir))
	if(bOTGHighSpeed)
		u32PacketSize = HS_C1_I0_A0_EP3_MAX_PACKET ;
	else
		u32PacketSize = FS_C1_I0_A0_EP3_MAX_PACKET ;
#elif (OTG_AP_Satus == Interrupt_AP)
	if(bOTGHighSpeed)
		u32PacketSize = HS_C1_I0_A0_EP1_MAX_PACKET ;
	else
		u32PacketSize = FS_C1_I0_A0_EP1_MAX_PACKET ;
#endif
	
#if IntTransSizeFix
	u32OTGInterrupt_TX_COUNT = u32PacketSize;
#endif

	u8Array = malloc(u32OTGInterrupt_TX_COUNT);

	for (u32i = 0; u32i < u32OTGInterrupt_TX_COUNT; u32i ++)
	{
		u8Array[u32i] = (u8OTGInterruptCount); 
		u8OTGInterruptCount ++;
	}

//	if(u8OTGMessageLevel & MESS_INFO)
//		printf("L%x: Interrupt_IN...\n", u8LineOTGCount ++);  

	printf("Interrupt count = %d\n", u32OTGInterrupt_TX_COUNT);

#if(OTG_AP_Satus	 == Bulk_AP)
	vOTGDxFWr(FIFO2, u8Array, u32OTGInterrupt_TX_COUNT);
	mUsbFIFODone(FIFO2);
#elif (OTG_AP_Satus == Interrupt_AP)
	vOTGDxFWr(FIFO0, u8Array, u32OTGInterrupt_TX_COUNT);
	mUsbFIFODone(FIFO0);
#endif

	u32OTGInterrupt_TX_COUNT++;
	if(u32OTGInterrupt_TX_COUNT > u32PacketSize)
		u32OTGInterrupt_TX_COUNT = 1;

	free(u8Array);

}

///////////////////////////////////////////////////////////////////////////////
//		vOTG_Interrupt_Out() 
//		Description: FIFO5 interrupt service process
//		input: none
//		output: none
///////////////////////////////////////////////////////////////////////////////
void vOTG_Interrupt_Out(void)
{
#if(OTG_AP_Satus == Bulk_AP)
	// for Bulk Bir-direction test
	INT32U u32IntOutFifoUse = FIFO3;
#else
	// for Interrupt test
	INT32U u32IntOutFifoUse = (bOTGHighSpeed)? FIFO2 : FIFO1;
#endif
	INT16U i,u16Interrupt_RX_Count = mUsbFIFOOutByteCount(u32IntOutFifoUse);
	INT32U u32PacketSize ;
	INT8U *u8Array;

#if((OTG_AP_Satus == Bulk_AP) && (Bulk_Satus == Bulk_FIFO_BiDir))
	if(bOTGHighSpeed)
		u32PacketSize = HS_C1_I0_A0_EP4_MAX_PACKET ;
	else
		u32PacketSize = FS_C1_I0_A0_EP4_MAX_PACKET ;

#elif (OTG_AP_Satus == Interrupt_AP)
	if(bOTGHighSpeed)
		u32PacketSize = HS_C1_I0_A0_EP2_MAX_PACKET ;
	else
		u32PacketSize = FS_C1_I0_A0_EP2_MAX_PACKET ;
#endif

#if IntTransSizeFix
	u32OTGInterrupt_RX_COUNT = u32PacketSize;
#endif
	u8Array = malloc(u32OTGInterrupt_RX_COUNT);

	if(u16Interrupt_RX_Count == u32OTGInterrupt_RX_COUNT)
	{
//		if(u8OTGMessageLevel & MESS_INFO)
//			printf("L%x: Interrupt_Out...\n", u8LineOTGCount ++);
	}
	else
	{
		if(u8OTGMessageLevel & MESS_ERROR)
			printf("L%x: Interrupt_Out Byte Count Error = %x...(Correct = %x)\n", 
				u8LineOTGCount ++, u16Interrupt_RX_Count, u32OTGInterrupt_RX_COUNT);
	}
	
	// Read Interrupt Data from FIFO..
	vOTGDxFRd((INT8U)u32IntOutFifoUse, u8Array, u16Interrupt_RX_Count );
	u8Test = bFOTGPeri_Port(0x1c);
	
	if(memcmp(u8InterruptOTGArray + u8OTGInterruptOutCount, 
			   u8Array, 
			   u32OTGInterrupt_RX_COUNT) != 0)
	{
		#if(OTG_AP_Satus == Bulk_AP)
		// for Bulk Bir-direction test
		mUsbEPinStallSet(EP4);
		#else
		// for Interrupt test
		mUsbEPinStallSet(EP2);
		#endif
	
		if(u8OTGMessageLevel & MESS_ERROR)
		{
			printf("L%x: Interrupt_Out Data error...\n", u8LineOTGCount ++);
#if 0
			printf("Device Get Data...");		
			for(i = 0; i< u16Interrupt_RX_Count; i++)
			{
				if(i % 8 == 0)
					printf("\n");
				printf("%02x  ",u8Array[i]);
			}
			printf("\n");
			
			printf("Correct Data...");		
			for(i = 0; i< u32OTGInterrupt_RX_COUNT; i++)
			{
				if(i % 8 == 0)
					printf("\n");
				printf("%02x  ", *(u8InterruptOTGArray + u8OTGInterruptOutCount + i));
			}			
			printf("\n");
#else
			for(i = 0;i<u32OTGInterrupt_RX_COUNT;i++)
			{
				if(u8InterruptOTGArray[u8OTGInterruptOutCount+i] != u8Array[i])
					printf("L%x: Index(%d/%d) Error = 0x%x, correct = 0x%x\n",u8LineOTGCount ++,
								i+1,u32OTGInterrupt_RX_COUNT,u8Array[i],
								u8InterruptOTGArray[u8OTGInterruptOutCount+i]);
			}
#endif
		}
	}
	u8OTGInterruptOutCount = u8OTGInterruptOutCount + u32OTGInterrupt_RX_COUNT;

	u32OTGInterrupt_RX_COUNT++;
	if(u32OTGInterrupt_RX_COUNT > u32PacketSize)
		u32OTGInterrupt_RX_COUNT = 1;	
	
	free(u8Array);
}

⌨️ 快捷键说明

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