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

📄 test_device.c

📁 一个USB主机核的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************
*                      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 + -