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