📄 test_device.c
字号:
/****************************************************************
* MT View Silicon Tech. Inc.
*
* Copyright 2007, MT View Silicon Tech. Inc., ShangHai, China
* All rights reserved.
*
*
* Filename: test_device.c
*
* Programmer: Grey
*
* Created: 11/xx/2007
*
* Description: OTG device mode test code
*
*
*****************************************************************/
#include "test_device.h"
#include <string.h>
#define SIMHOST_DEBUG_EN 0
extern BOOL
TestOTGDeviceInit(VOID)
{
WORD temp;
/* set endpoint number */
WriteOTGReg8(otg_CommonUSB_Index, 2);
/* set endpoint 2 BULK Rx */
ClrBitOTGReg16(otg_IndexedCSR_TxCSR, TxCSR_prw_Mode);
/* set ClrDataTog for fisrt configuration */
SetBitOTGReg16(otg_IndexedCSR_RxCSR, RxCSR_ps_ClrDataTog);
/* FIFO need flush */
temp = ReadOTGReg16(otg_IndexedCSR_RxCSR);
if ((temp & RxCSR_prc_RxPktRdy) != 0)
SetBitOTGReg16(otg_IndexedCSR_RxCSR, RxCSR_ps_FlushFIFO);
/* set endpoint number */
WriteOTGReg8(otg_CommonUSB_Index, 1);
/* set endpoint 1 BULK Tx */
SetBitOTGReg16(otg_IndexedCSR_TxCSR, TxCSR_prw_Mode);
/* set ClrDataTog for first configuration */
SetBitOTGReg16(otg_IndexedCSR_TxCSR, TxCSR_ps_ClrDataTog);
/* check FIFO data empty */
temp = ReadOTGReg16(otg_IndexedCSR_TxCSR);
if ((temp & TxCSR_prc_FIFONotEmpty) != 0)
SetBitOTGReg16(otg_IndexedCSR_TxCSR, TxCSR_ps_FlushFIFO);
/* set softconn */
SetBitOTGReg8(otg_CommonUSB_Power, Power_prw_SoftConn);
/* clear session */
// ClrBitOTGReg8(otg_CtrlFIFO_DevCtl, DevCtl_rw_Session);
/* remote wakeup */
// SetBitOTGReg8(otg_CommonUSB_Power, Power_prw_Resume);
// WaitMs(10);
/* clear softconn */
// ClrBitOTGReg8(otg_CommonUSB_Power, Power_prw_SoftConn);
return TRUE;
}
extern BOOL
TestOTGDevCtrlZeroDataReq(
BYTE *cmd
)
{
WORD temp;
// BYTE val[8];
/* set endpoint0 */
WriteOTGReg8(otg_CommonUSB_Index, 0);
/* wait host data packet */
while(1)
{
/* wait endpoint0 interrupt */
// temp = ReadOTGReg16(otg_CommonUSB_IntrTx);
// if (temp != 0)
// break;
/* check RxPktRdy flag */
temp = ReadOTGReg16(otg_IndexedCSR_CSR0);
if ((temp & CSR0_pr_RxPktRdy) != 0)
break;
}/* end while */
/* unload received data from FIFO */
UnloadFIFOData((BYTE *)&otg_EndpointFIFO[0], cmd, 8);
/* set ServicedRxPktRdy flag to clear RxPktRdy, and set DataEnd */
SetBitOTGReg16(otg_IndexedCSR_CSR0, (CSR0_ps_ServicedRxPktRdy | CSR0_ps_DataEnd));
/* wait status send */
while(1)
{
temp = ReadOTGReg16(otg_IndexedCSR_CSR0);
if ((temp & CSR0_pr_RxPktRdy) == 0)
break;
}
/* go into status phase, wait next endpoint0 interrupt */
// while(1)
// {
// temp = ReadOTGReg16(otg_CommonUSB_IntrTx);
// if ((temp & 0x0001) != 0)
// break;
// }/* end while */
return TRUE;
}
extern BOOL
TestOTGDevCtrlWriteReq(
BYTE *cmd,
BYTE *dat,
WORD *length
)
{
WORD temp;
// BYTE val[8];
/* set endpoint0 */
WriteOTGReg8(otg_CommonUSB_Index, 0);
/* wait host data packet */
while(1)
{
/* wait endpoint0 interrupt */
// temp = ReadOTGReg16(otg_CommonUSB_IntrTx);
// if (temp != 0)
// break;
/* check RxPktRdy flag */
temp = ReadOTGReg16(otg_IndexedCSR_CSR0);
if ((temp & CSR0_pr_RxPktRdy) != 0)
break;
}/* end while */
/* unload received data from FIFO */
UnloadFIFOData((BYTE *)&otg_EndpointFIFO[0], cmd, 8);
/* set ServicedRxPktRdy flag to clear RxPktRdy */
SetBitOTGReg16(otg_IndexedCSR_CSR0, CSR0_ps_ServicedRxPktRdy);
/* wait host data packet */
while(1)
{
/* wait endpoint0 interrupt */
// temp = ReadOTGReg16(otg_CommonUSB_IntrTx);
// if (temp != 0)
// break;
/* check RxPktRdy flag */
temp = ReadOTGReg16(otg_IndexedCSR_CSR0);
if ((temp & CSR0_pr_RxPktRdy) != 0)
break;
}/* end while */
temp = ReadOTGReg16(otg_IndexedCSR_Count0);
/* unload received data from FIFO */
UnloadFIFOData((BYTE *)&otg_EndpointFIFO[0], dat, temp);
*length = temp;
/* set ServicedRxPktRdy flag to clear RxPktRdy */
SetBitOTGReg16(otg_IndexedCSR_CSR0, (CSR0_ps_ServicedRxPktRdy | CSR0_ps_DataEnd));
/* wait status send */
while(1)
{
temp = ReadOTGReg16(otg_IndexedCSR_CSR0);
if ((temp & CSR0_pr_RxPktRdy) == 0)
break;
}
/* go into status phase, wait next endpoint0 interrupt */
// while(1)
// {
// temp1 = ReadOTGReg16(otg_CommonUSB_IntrTx);
// if ((temp1 & 0x0001) != 0)
// break;
// }/* end while */
return TRUE;
}
extern BOOL
TestOTGDevCtrlReadReq(
BYTE *cmd,
BYTE *dat,
WORD length
)
{
WORD temp;
// BYTE val[8];
/* set endpoint0 */
WriteOTGReg8(otg_CommonUSB_Index, 0);
/* wait host data packet */
while(1)
{
/* wait endpoint0 interrupt */
// temp = ReadOTGReg16(otg_CommonUSB_IntrTx);
// if (temp != 0)
// break;
/* check RxPktRdy flag */
temp = ReadOTGReg16(otg_IndexedCSR_CSR0);
if ((temp & CSR0_pr_RxPktRdy) != 0)
break;
}/* end while */
/* unload received data from FIFO */
UnloadFIFOData((BYTE *)&otg_EndpointFIFO[0], cmd, 8);
/* set ServicedRxPktRdy flag to clear RxPktRdy */
SetBitOTGReg16(otg_IndexedCSR_CSR0, CSR0_ps_ServicedRxPktRdy);
/* load device descriptor into endpoint0 FIFO */
LoadFIFOData((BYTE *)&otg_EndpointFIFO[0], dat, length);
/* send device descriptor to host */
SetBitOTGReg16(otg_IndexedCSR_CSR0, (CSR0_prs_TxPktRdy | CSR0_ps_DataEnd));
/* wait status send */
while(1)
{
temp = ReadOTGReg16(otg_IndexedCSR_CSR0);
if ((temp & CSR0_prs_TxPktRdy) == 0)
break;
}
/* wait endpoint0 interrupt */
// while(1)
// {
// temp1 = ReadOTGReg16(otg_CommonUSB_IntrTx);
// if ((temp1 & 0x0001) != 0)
// break;
// }/* end while */
/* go into status phase, wait next endpoint0 interrupt */ //core too fast, the interrupt can not response immediatly
// while(1)
// {
// temp1 = ReadOTGReg16(otg_CommonUSB_IntrTx);
// if ((temp1 & 0x0001) != 0)
// break;
// }/* end while */
return TRUE;
}
extern BOOL
TestOTGDevCtrlTransfer(
BOOL isHS
)
{
static BYTE CODE DevDescriptor[] = {0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x4C, 0x05, 0x43, 0x02,
0x00, 0x01, 0x01, 0x02, 0x03, 0x01,};
static BYTE CODE CfgDescriptor9[] = {0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32,};
static BYTE CODE StrDescriptorLID[] = {0x04, 0x03, 0x09, 0x04,};
static BYTE CODE StrDescriptorSerialNum[] = {0x1C, 0x03, 0x31, 0x00, 0x37, 0x00, 0x30, 0x00,
0x35, 0x00, 0x31, 0x00, 0x31, 0x00, 0x31, 0x00,
0x31, 0x00, 0x31, 0x00, 0x30, 0x00, 0x33, 0x00,
0x37, 0x00, 0x38, 0x00,};
static BYTE XDATA CfgDescriptorFF[] = {0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0x80,
0x32, 0x09, 0x04, 0x00, 0x00, 0x02, 0x08, 0x06,
0x50, 0x00, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00,
0xFF, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0xFF,};
static BYTE CODE StrDescriptorProduct[] = {0x1C, 0x03, 0x53, 0x00, 0x74, 0x00, 0x6F, 0x00,
0x72, 0x00, 0x61, 0x00, 0x67, 0x00, 0x65, 0x00,
0x20, 0x00, 0x4D, 0x00, 0x65, 0x00, 0x64, 0x00,
0x69, 0x00, 0x61, 0x00,};
static BYTE CODE MaxLUN[] = {0x00,};
BYTE XDATA request[20][8];
/* get device descriptor */
if (!TestOTGDevCtrlReadReq(request[0], DevDescriptor, sizeof(DevDescriptor)))
return FALSE;
/* set address */
if (!TestOTGDevCtrlZeroDataReq(request[1]))
return FALSE;
WriteOTGReg8(otg_CommonUSB_FAddr, request[1][2]);
/* get device descriptor */
if (!TestOTGDevCtrlReadReq(request[2], DevDescriptor, sizeof(DevDescriptor)))
return FALSE;
#if SIMHOST_DEBUG_EN
/* get configuration descriptor */
if (!TestOTGDevCtrlReadReq(request[3], CfgDescriptor9, 8))
return FALSE;
#else
/* get configuration descriptor */
if (!TestOTGDevCtrlReadReq(request[3], CfgDescriptor9, sizeof(CfgDescriptor9)))
return FALSE;
#endif
#if SIMHOST_DEBUG_EN == 0
/* get string descriptor long ID */
if (!TestOTGDevCtrlReadReq(request[4], StrDescriptorLID, sizeof(StrDescriptorLID)))
return FALSE;
/* get string descriptor serial number */
if (!TestOTGDevCtrlReadReq(request[5], StrDescriptorSerialNum, sizeof(StrDescriptorSerialNum)))
return FALSE;
#endif
/* get configuration descriptor */
if (!isHS)
{
CfgDescriptorFF[22] = 0x40;
CfgDescriptorFF[23] = 0x00;
}
else
{
CfgDescriptorFF[22] = 0x00;
CfgDescriptorFF[23] = 0x02;
}
if (!TestOTGDevCtrlReadReq(request[6], CfgDescriptorFF, sizeof(CfgDescriptorFF)))
return FALSE;
#if SIMHOST_DEBUG_EN == 0
/* get string descriptor long ID */
if (!TestOTGDevCtrlReadReq(request[7], StrDescriptorLID, sizeof(StrDescriptorLID)))
return FALSE;
/* get string descriptor product */
if (!TestOTGDevCtrlReadReq(request[8], StrDescriptorProduct, sizeof(StrDescriptorProduct)))
return FALSE;
/* get string descriptor long ID */
if (!TestOTGDevCtrlReadReq(request[9], StrDescriptorLID, sizeof(StrDescriptorLID)))
return FALSE;
/* get string descriptor product */
if (!TestOTGDevCtrlReadReq(request[10], StrDescriptorProduct, sizeof(StrDescriptorProduct)))
return FALSE;
/* get device descriptor */
if (!TestOTGDevCtrlReadReq(request[11], DevDescriptor, sizeof(DevDescriptor)))
return FALSE;
/* get configuration descriptor */
if (!TestOTGDevCtrlReadReq(request[12], CfgDescriptor9, sizeof(CfgDescriptor9)))
return FALSE;
/* get configuration descriptor */
if (!isHS)
{
CfgDescriptorFF[22] = 0x40;
CfgDescriptorFF[23] = 0x00;
}
else
{
CfgDescriptorFF[22] = 0x00;
CfgDescriptorFF[23] = 0x02;
}
if (!TestOTGDevCtrlReadReq(request[13], CfgDescriptorFF, sizeof(CfgDescriptorFF)))
return FALSE;
/* get string descriptor long ID */
if (!TestOTGDevCtrlReadReq(request[14], StrDescriptorLID, 2))
return FALSE;
/* get string descriptor long ID */
if (!TestOTGDevCtrlReadReq(request[15], StrDescriptorLID, sizeof(StrDescriptorLID)))
return FALSE;
/* get string descriptor serial number */
if (!TestOTGDevCtrlReadReq(request[16], StrDescriptorSerialNum, 2))
return FALSE;
/* get string descriptor serial number */
if (!TestOTGDevCtrlReadReq(request[17], StrDescriptorSerialNum, sizeof(StrDescriptorSerialNum)))
return FALSE;
#endif
/* set config */
if (!TestOTGDevCtrlZeroDataReq(request[18]))
return FALSE;
/* get Max LUN */
if (!TestOTGDevCtrlReadReq(request[19], MaxLUN, sizeof(MaxLUN)))
return FALSE;
return TRUE;
}
extern BOOL
TestOTGDevBulkOutTransaction(
BYTE endPointNum,
BYTE *dat,
WORD *length
)
{
WORD temp;
/* set endpoint number */
WriteOTGReg8(otg_CommonUSB_Index, endPointNum);
/* Wait EndPoint Rx interrupt */
while(1)
{
temp = ReadOTGReg16(otg_IndexedCSR_RxCSR);
if ((temp & RxCSR_prc_RxPktRdy) != 0)
break;
}/* end while */
temp = ReadOTGReg16(otg_IndexedCSR_RxCount);
UnloadFIFOData((BYTE *)&otg_EndpointFIFO[endPointNum], dat, temp);
SetBitOTGReg16(otg_IndexedCSR_RxCSR, RxCSR_ps_FlushFIFO);
ClrBitOTGReg16(otg_IndexedCSR_RxCSR, RxCSR_prc_RxPktRdy); // clear RxPktRdy
*length = temp;
return TRUE;
}
extern BOOL
TestOTGDevBulkOutTransactionDMA(
BYTE endPointNum,
BYTE *dat,
WORD length
)
{
WORD maxPacketSize;
DWORD temp1;
/* set endpoint number */
WriteOTGReg8(otg_CommonUSB_Index, endPointNum);
/* config MPRx */
maxPacketSize = (ReadOTGReg16(otg_IndexedCSR_RxMaxP) & 0x07FF);
ClrBitOTGReg16(otg_IndexedCSR_RxMaxP, 0xF800);
if (maxPacketSize == 512)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -