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

📄 test_host.c

📁 一个USB主机核的驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	/* wait DMA unload data */
	while(1)
	{
		temp1 = ReadOTGReg32(otg_DMA_Intr);
		if ((temp1 & DMA_Intr_Ch1) != 0)	
			break;
	}/* end while */
	ClrBitOTGReg32(otg_DMA_Ctrl, (DMA_Ctrl_EnDMA | DMA_Ctrl_Mode | DMA_Ctrl_IntrEn));
	ClrBitOTGReg16(otg_IndexedCSR_RxCSR, (RxCSR_hrw_AutoClear | RxCSR_hrw_AutoReq | RxCSR_hrw_DMAReqEnab | RxCSR_hrw_DMAReqMode)); //config RXCSR


	/* check CSR response */
	temp = ReadOTGReg16(otg_IndexedCSR_RxCSR);
	if ((temp & RxCSR_hrc_RxStall) != 0)
	{
		ClrBitOTGReg16(otg_IndexedCSR_RxCSR, RxCSR_hrc_RxStall);		/* get STALL response */
		return FALSE;
	}
	else if ((temp & RxCSR_hrc_Error) != 0)
	{
		ClrBitOTGReg16(otg_IndexedCSR_RxCSR, RxCSR_hrc_Error);		/* get ERROR response */
		return FALSE;
	}
	else if ((temp & RxCSR_hrc_DataError_NAKTimeout) != 0)
	{
		ClrBitOTGReg16(otg_IndexedCSR_RxCSR, RxCSR_hrc_DataError_NAKTimeout);		/* get NAK timeoue response */
		return FALSE;
	}
	else
	{
//		ClrBitOTGReg16(otg_IndexedCSR_RxCSR, RxCSR_hrc_RxPktRdy);
//		*length = 8192;
		return TRUE;			/* no STALL, ERROR, NAKTimeout */
	}
}


extern BOOL
TestOTGInterruptOutTransaction(
	BYTE			endPointNum,
	BYTE			*dat,
	WORD			length
	)
{
	WORD		temp;

	/* set endpoint number */
	WriteOTGReg8(otg_CommonUSB_Index, endPointNum);

	/* load data into FIFO */
	LoadFIFOData((BYTE *)&otg_EndpointFIFO[endPointNum], dat, length);

	/* send out token */
	SetBitOTGReg16(otg_IndexedCSR_TxCSR, TxCSR_hrs_TxPktRdy);

	/* Wait EndPoint Tx interrupt */
	while(1)
	{
//		temp = ReadOTGReg16(otg_CommonUSB_IntrTx);
//		if ((temp & (0x0001 << endPointNum)) != 0)
//			break;
		temp = ReadOTGReg16(otg_IndexedCSR_TxCSR);
		if ((temp & TxCSR_hrs_TxPktRdy) == 0)
			break;
	}/* end while */

	/* check CSR response */
	if ((temp & TxCSR_hrc_RxStall) != 0)
	{
		ClrBitOTGReg16(otg_IndexedCSR_TxCSR, TxCSR_hrc_RxStall);		/* get STALL response */
		return FALSE;
	}
	else if ((temp & TxCSR_hrc_Error) != 0)
	{
		ClrBitOTGReg16(otg_IndexedCSR_TxCSR, TxCSR_hrc_Error);			/* get ERROR response */		
		return FALSE;
	}
	else if ((temp & TxCSR_hrc_NAKTimeout_IncompTx) != 0)
	{
		ClrBitOTGReg16(otg_IndexedCSR_TxCSR, TxCSR_hrc_NAKTimeout_IncompTx);		/* get NAK timeoue response */
		return FALSE;
	}
	else
	{
		return TRUE;			/* no STALL, ERROR, NAKTimeout */
	}	

	return TRUE;
}


extern BOOL
TestOTGInterruptInTransaction(
	BYTE			endPointNum,
	BYTE			*dat,
	WORD			*length
	)
{
	WORD		temp;

	/* set endpoint number */
	WriteOTGReg8(otg_CommonUSB_Index, endPointNum);

	/* send in token */
	SetBitOTGReg16(otg_IndexedCSR_RxCSR, RxCSR_hrw_ReqPkt);

	/* Wait EndPoint Rx interrupt */
	while(1)
	{
//		temp = ReadOTGReg16(otg_CommonUSB_IntrRx);
//		if ((temp & (0x0001 << endPointNum)) != 0)
//			break;
		temp = ReadOTGReg16(otg_IndexedCSR_RxCSR);
		if ((temp & RxCSR_hrc_RxPktRdy) != 0)
			break;
	}/* end while */			

	/* check CSR response */
	if ((temp & RxCSR_hrc_RxStall) != 0)
	{
		ClrBitOTGReg16(otg_IndexedCSR_RxCSR, RxCSR_hrc_RxStall);		/* get STALL response */
		return FALSE;
	}
	else if ((temp & RxCSR_hrc_Error) != 0)
	{
		ClrBitOTGReg16(otg_IndexedCSR_RxCSR, RxCSR_hrc_Error);		/* get ERROR response */
		return FALSE;
	}
	else if ((temp & RxCSR_hrc_DataError_NAKTimeout) != 0)
	{
		ClrBitOTGReg16(otg_IndexedCSR_RxCSR, RxCSR_hrc_DataError_NAKTimeout);		/* get NAK timeoue response */
		return FALSE;
	}
	else
	{
		temp = ReadOTGReg16(otg_IndexedCSR_RxCount);
		UnloadFIFOData((BYTE *)&otg_EndpointFIFO[endPointNum], dat, temp);
		ClrBitOTGReg16(otg_IndexedCSR_RxCSR, RxCSR_hrc_RxPktRdy);
		*length = temp;
		return TRUE;			/* no STALL, ERROR, NAKTimeout */
	}
}


extern BOOL
TestOTGHostBulkTransfer(
	BOOL		isHS
	)
{
	static	BYTE	CODE	Inquiry[] = {0x55, 0x53, 0x42, 0x43, 0x68, 0x75, 0x95, 0x82, 0x24, 0x00, 0x00, 0x00,
										0x80, 0x00, 0x06, 0x12, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00,
										0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,};
#if !TEST_HCD_EN
	static	BYTE	CODE	ReadFmtCapacity[] = {0x55, 0x53, 0x42, 0x43, 0x18, 0xDD, 0xBF, 0x82, 0xFC, 0x00, 0x00, 0x00,
												0x80, 0x00, 0x0A, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,
												0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,};
	static	BYTE	CODE	RequsetSense[] = {0x55, 0x53, 0x42, 0x43, 0x08, 0x60, 0xA3, 0x82, 0x12, 0x00, 0x00, 0x00,
												0x80, 0x00, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00,
												0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,};
	static 	BYTE	CODE	ReadCapacity[] = {0x55, 0x53, 0x42, 0x43, 0x28, 0x65, 0x9F, 0x82, 0x08, 0x00, 0x00, 0x00,
												0x80, 0x00, 0x0A, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
												0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,};
#endif
	static 	BYTE	CODE	ReadLBA[] = {0x55, 0x53, 0x42, 0x43, 0x28, 0x65, 0x9F, 0x82, 0x00, 0x02, 0x00, 0x00,
										0x80, 0x00, 0x0A, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
										0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,};
//	static 	BYTE	CODE	ReadLBA[] = {0x55, 0x53, 0x42, 0x43, 0x28, 0x65, 0x9F, 0x82, 0x00, 0x20, 0x00, 0x00,
//										0x80, 0x00, 0x0A, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
//										0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,};
#if !TEST_HCD_EN
	static	BYTE	CODE	ModeSense[] = {0x55, 0x53, 0x42, 0x43, 0x08, 0x20, 0xBD, 0x82, 0xC0, 0x00, 0x00, 0x00,
											0x80, 0x00, 0x06, 0x1A, 0x00, 0x1C, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00,
											0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,};
	static	BYTE	CODE	TestUnitReady[] = {0x55, 0x53, 0x42, 0x43, 0x08, 0x90, 0x91, 0x82, 0x00, 0x00, 0x00, 0x00,
												0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
												0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,};
#endif
	static	BYTE	CODE	WriteLBA[] = {0x55, 0x53, 0x42, 0x43, 0x28, 0x65, 0x9F, 0x82, 0x00, 0x02, 0x00, 0x00,
											0x80, 0x00, 0x0A, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
											0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,};
//	static	BYTE	CODE	WriteLBA[] = {0x55, 0x53, 0x42, 0x43, 0x28, 0x65, 0x9F, 0x82, 0x00, 0x20, 0x00, 0x00,
//											0x80, 0x00, 0x0A, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
//											0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,};

#if TEST_INTERRUPT_XFER_EN
//	static 	BYTE	CODE	DVDataOut1[] = {0x01, 0x00, 0x00, 0x00,};
//	static 	BYTE	CODE	DVDataOut2[] = {0x07, 0x01, 0x00, 0x01, 0x00,};
	static 	BYTE	CODE	WifiDataOut1[] = {0x22, 0x00, 0x1D, 0xEE, 0x1E, 0xEE,};
	static 	BYTE	CODE	WifiDataOut2[] = {0x22, 0x00, 0x1B, 0xF8, 0x1C, 0xF8,};
#endif
	BYTE	XDATA	val[20][64];
	BYTE	XDATA	buffer[512];
#if !TEST_HCD_EN
	WORD	length;
	BYTE	i;
	WORD	temp;
#endif

#if TEST_HCD_EN

	URB		urb;

	isHS = isHS;
	/* inquiry */
	/* CBW */
	urb.FuncAddr = 1;
	urb.EndPointNum = 3;
	urb.TransferType = USB_ENDPOINT_XFER_BULK;
	urb.Direction = USB_DIR_OUT;
	urb.MaxPacketSize = 64;
	urb.Interval = 0;
//	urb.FIFOSize = 512;
	urb.SetupPacket = NULL;
	urb.DataBuffer = Inquiry;
	urb.DataLength = 31;
	urb.IsUseDMA = 0;
	urb.Status = NO_ERR;
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;
	/* DATA */
	urb.FuncAddr = 1;
	urb.EndPointNum = 2;
	urb.TransferType = USB_ENDPOINT_XFER_BULK;
	urb.Direction = USB_DIR_IN;
	urb.MaxPacketSize = 64;
	urb.Interval = 0;
//	urb.FIFOSize = 512;
	urb.SetupPacket = NULL;
	urb.DataBuffer = val[0];
	urb.DataLength = Inquiry[19];
	urb.IsUseDMA = 0;
	urb.Status = NO_ERR;
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;
	/* CSW */
	urb.FuncAddr = 1;
	urb.EndPointNum = 2;
	urb.TransferType = USB_ENDPOINT_XFER_BULK;
	urb.Direction = USB_DIR_IN;
	urb.MaxPacketSize = 64;
	urb.Interval = 0;
//	urb.FIFOSize = 512;
	urb.SetupPacket = NULL;
	urb.DataBuffer = val[1];
	urb.DataLength = 13;
	urb.IsUseDMA = 0;
	urb.Status = NO_ERR;
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;

	
	/* read LBA0 */
	/* CBW */
	urb.FuncAddr = 1;
	urb.EndPointNum = 3;
	urb.TransferType = USB_ENDPOINT_XFER_BULK;
	urb.Direction = USB_DIR_OUT;
	urb.MaxPacketSize = 64;
	urb.Interval = 0;
//	urb.FIFOSize = 512;
	urb.SetupPacket = NULL;
	urb.DataBuffer = ReadLBA;
	urb.DataLength = 31;
	urb.IsUseDMA = 0;
	urb.Status = NO_ERR;
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;
	/* DATA */
	urb.FuncAddr = 1;
	urb.EndPointNum = 2;
	urb.TransferType = USB_ENDPOINT_XFER_BULK;
	urb.Direction = USB_DIR_IN;
	urb.MaxPacketSize = 64;
	urb.Interval = 0;
//	urb.FIFOSize = 512;
	urb.SetupPacket = NULL;
	urb.DataBuffer = buffer;
	urb.DataLength = 512;
	urb.IsUseDMA = 0;
	urb.Status = NO_ERR;
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;
	/* CSW */
	urb.FuncAddr = 1;
	urb.EndPointNum = 2;
	urb.TransferType = USB_ENDPOINT_XFER_BULK;
	urb.Direction = USB_DIR_IN;
	urb.MaxPacketSize = 64;
	urb.Interval = 0;
//	urb.FIFOSize = 512;
	urb.SetupPacket = NULL;
	urb.DataBuffer = val[2];
	urb.DataLength = 13;
	urb.IsUseDMA = 0;
	urb.Status = NO_ERR;
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;

	/* write LBA0 */
	/* CBW */
	urb.FuncAddr = 1;
	urb.EndPointNum = 3;
	urb.TransferType = USB_ENDPOINT_XFER_BULK;
	urb.Direction = USB_DIR_OUT;

⌨️ 快捷键说明

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