📄 pe_usb_intr.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 + -