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

📄 test_host.c

📁 一个USB主机核的驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
0x91, 0xEC, 0xC8, 0xD2, 0x40, 0xF0, 0x25, 0xEF, 0x0A, 0x65, 0xFE, 0x7F, 0x02, 0x97, 0xC3, 0x92, 
0x44, 0xA2, 0xC2, 0xD2, 0x42, 0x00, 0x88, 0x98, 0x90, 0x9A, 0x88, 0xDA, 0x08, 0x0B, 0x01, 0x00, 
0x0A, 0x65, 0xE8, 0x43, 0x02, 0x97, 0xC3, 0x92, 0x09, 0xA3, 0x40, 0x00, 0xC2, 0xD2, 0x0A, 0x65, 
0xEA, 0x43, 0x02, 0x97, 0xC3, 0x92, 0x09, 0xB3, 0xFB, 0xFF, 0xC2, 0xD2, 0x40, 0x92, 0x19, 0xD3, 
0x2D, 0xBC, 0x0A, 0x65, 0xD8, 0x43, 0x02, 0x97, 0xC3, 0x92, 0x09, 0xB3, 0xBF, 0xFF, 0xC2, 0xD2, 
0x88, 0x98, 0x90, 0x9A, 0x88, 0xDA, 0x08, 0x0B, 0x01, 0x00, 0x09, 0x63, 0xEA, 0x43, 0x01, 0x97, 
0xC3, 0x94, 0x44, 0xA4, 0xC1, 0xD4, 0x11, 0x93, 0xB9, 0xEC, 0x40, 0x42, 0x02, 0x4E, 0x0F, 0x9F, 
0x8C, 0xF7, 0x12, 0x95, 0x93, 0xEC, 0x0B, 0x67, 0x36, 0x43, 0xD2, 0x98, 0x1C, 0xD9, 0xC8, 0xBC, 
0xD2, 0x98, 0x03, 0x93, 0xC1, 0xD8, 0x11, 0x93, 0xB9, 0xEC, 0x09, 0x03, 0xFF, 0xFF, 0x19, 0xD3, 
0xB9, 0xEC, 0x40, 0x42, 0x02, 0x5E, 0x0F, 0x9F, 0x65, 0xF7, 0x19, 0xD3, 0xB8, 0xEC, 0x19, 0xD3, 
0xBA, 0xEC, 0x0A, 0x05, 0xFE, 0xFF, 0xCA, 0xD2, 0xCA, 0xD2, 0xC2, 0xD2, 0x0A, 0x65, 0x5E, 0x43, 
0x02, 0x97, 0xC3, 0x92, 0x48, 0xA2, 0xC2, 0xD2, 0x0A, 0x65, 0xEA, 0x43, 0x02, 0x99, 0xC4, 0x92, 
0x09, 0xB3, 0xFB, 0xFF, 0x0F, 0x9F, 0x95, 0xF7, 0x11, 0x93, 0x03, 0xEC, 0x19, 0xD3, 0x01, 0x82, 
0x0A, 0x65, 0xFD, 0x7D, 0x02, 0x97, 0xC3, 0x92, 0x43, 0xA2, 0xC2, 0xD2, 0x88, 0x98, 0x90, 0x9A, 
0x88, 0xDA, 0x08, 0x0B, 0x01, 0x00, 0x03, 0x92, 0x04, 0x96, 0x0D, 0x5E, 0x50, 0x46, 0x02, 0x0E, 
0x40, 0x92, 0x09, 0xEE, 0x44, 0x46, 0x04, 0x0E, 0x59, 0x93, 0x44, 0x26, 0x04, 0x5E, 0x46, 0xEE, 
0x41, 0x93, 0x41, 0x26, 0x43, 0x4E, 0x88, 0x98, 0x90, 0x9A, 0x88, 0xDA, 0x08, 0x0B, 0x01, 0x00, 
0x40, 0xF0, 0xB1, 0xFE, 0x88, 0x98, 0x90, 0x9A, 0x88, 0xDA, 0x08, 0x0B, 0x01, 0x00, 0x88, 0x98, 
0x90, 0x9A, 0x88, 0xDA, 0x08, 0x0B, 0x01, 0x00, 0x03, 0x94, 0x1A, 0xD5, 0xC0, 0xF7, 0x11, 0x93, 
0x00, 0x90, 0x88, 0x98, 0x90, 0x9A, 0x1D, 0x00, 0x1A, 0x00, 0x03, 0x00, 0x03, 0x00, 0x18, 0x00, 
0x19, 0x00, 0x1A, 0x00, 0x1B, 0x00, 0x16, 0x00, 0x21, 0x00, 0x12, 0x00, 0x09, 0x00, 0x13, 0x00, 
0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x21, 0x00, 0x2D, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x7E, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xF2, 0xEA, 0xF7, 0x00, 0x00, 
0x87, 0xF2, 0xEA, 0xF7, 0x00, 0x00, 0xCC, 0xF2, 0xE7, 0xF7, 0xEE, 0xF7, 0x00, 0x00, 0xB4, 0xF3, 
0xEA, 0xF7, 0x25, 0x47, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
};


static BYTE	CODE	gBugArray[] = 
{
0x02, 0x4E, 0x0F, 0x9F, 0x74, 0xF5, 0x0A, 0xB7, 0x00, 0x08, 0x40, 0x46, 0x02, 0x5E, 0x0F, 0x9F, 
0x77, 0xF5, 0x11, 0x93, 0x03, 0xEC, 0x41, 0x02, 0x09, 0xB3, 0xFE, 0xFF, 0x12, 0x95, 0x07, 0x80, 
0x01, 0x45, 0x02, 0x8E, 0x0F, 0x9F, 0x77, 0xF5, 0x41, 0x92, 0x0F, 0x9F, 0x78, 0xF5, 0x40, 0x92, 
0x88, 0x98, 0x90, 0x9A, 0x88, 0xDA, 0x41, 0x20, 0x08, 0x0B, 0x01, 0x00, 0x0A, 0x65, 0xE9, 0x43, 
};


extern BOOL
TestOTGHostCtrlTransfer(VOID)
{
	static	BYTE	CODE	GetDevDescriptor1[] = {0x80, 0x06, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00,};
	static	BYTE	XDATA	GetDevDescriptor2[] = {0x80, 0x06, 0x00, 0x01, 0x00, 0x00, 0x12, 0x00,};
	static	BYTE	CODE	SetAddress[] = {0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,};
	static	BYTE	CODE	GetCfgDescriptor9[] = {0x80, 0x06, 0x00, 0x02, 0x00, 0x00, 0x09, 0x00,};
	static	BYTE	XDATA	GetCfgDescriptor[] = {0x80, 0x06, 0x00, 0x02, 0x00, 0x00, 0xFF, 0x00,};
	static	BYTE	CODE	SetConfig[] = {0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,};
	static	BYTE	CODE	GetMaxLUN[] = {0xA1, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,};
	static	BYTE	XDATA	GetStrDescriptorLongID[] = {0x80, 0x06, 0x00, 0x03, 0x00, 0x00, 0xFF, 0x00,};
	static	BYTE	CODE	GetStrDescriptorLongID2[] = {0x80, 0x06, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00,};
	static	BYTE	XDATA	GetStrDescriptorSerialNum[] = {0x80, 0x06, 0x03, 0x03, 0x09, 0x04, 0xFF, 0x00,};
	static	BYTE	CODE	GetStrDescriptorSerialNum2[] = {0x80, 0x06, 0x03, 0x03, 0x09, 0x04, 0x02, 0x00,};
	static	BYTE	XDATA	GetStrDescriptorProduct[] = {0x80, 0x06, 0x02, 0x03, 0x09, 0x04, 0xFF, 0x00,};
	static	BYTE	CODE	GetStrDescriptorProduct2[] = {0x80, 0x06, 0x02, 0x03, 0x09, 0x04, 0x02, 0x00,};
	static	BYTE	CODE	VendorRequestOUT1[] = {0x40, 0x30, 0x00, 0xEE, 0x00, 0x00, 0x40, 0x00,};
	static	BYTE	CODE	VendorRequestOUT2[] = {0x40, 0x30, 0x00, 0xF6, 0x00, 0x00, 0x00, 0x04,};
	static	BYTE	CODE	VendorRequestIN[] = {0xC0, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,};
	BYTE	XDATA	val[10][64];
#if !TEST_HCD_EN
	WORD	length;
	WORD	temp;
#endif

#if TEST_HCD_EN

	URB		urb;
	



//	hci.Ed[0].Number = 0;
//	hci.Ed[0].Type = USB_ENDPOINT_XFER_CONTROL;
//	hci.Ed[0].Direction = 0;
//	hci.Ed[0].MaxPacketSize = 8;

//	urb.Hci = &hci;
//	hci.UsbStatus = USB_STATUS_NORMAL;


	urb.FuncAddr = 0;
	urb.EndPointNum = 0;
	urb.TransferType = USB_ENDPOINT_XFER_CONTROL;
	urb.Direction = USB_DIR_IN;
	urb.MaxPacketSize = 8;
	urb.Interval = 0;
//	urb.FIFOSize = 64;

	/* get device descriptor1 */
	urb.Direction = USB_DIR_IN;
	urb.SetupPacket = GetDevDescriptor1;
	urb.DataBuffer = val[0];
	urb.DataLength = 8;
	urb.IsUseDMA = 0;
	urb.Status = NO_ERR;
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;
	urb.MaxPacketSize = val[0][7];
	GetDevDescriptor2[6] = val[0][0];		/* descripter length */

	/* reset USB bus */
	HciResetUsb();

	/* set address */
	urb.Direction = USB_DIR_OUT;
	urb.SetupPacket = SetAddress;
	urb.DataBuffer = NULL;
	urb.DataLength = 0;
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;
	urb.FuncAddr = SetAddress[2];

	/* get device descriptor2 */
	urb.Direction = USB_DIR_IN;
	urb.SetupPacket = GetDevDescriptor2;
	urb.DataBuffer = val[1];
	urb.DataLength = GetDevDescriptor2[6];
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;

	/* get configuration descriptor9 */
	urb.Direction = USB_DIR_IN;
	urb.SetupPacket = GetCfgDescriptor9;
	urb.DataBuffer = val[2];
	urb.DataLength = 9;
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;
	GetCfgDescriptor[6] = val[2][2];

	/* get configuration descriptor */
	urb.Direction = USB_DIR_IN;
	urb.SetupPacket = GetCfgDescriptor;
	urb.DataBuffer = val[3];
	urb.DataLength = GetCfgDescriptor[6];
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;
	
	/* get string descriptor long ID 2 bytes */
	urb.Direction = USB_DIR_IN;
	urb.SetupPacket = GetStrDescriptorLongID2;
	urb.DataBuffer = val[4];
	urb.DataLength = 2;
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;
	GetStrDescriptorLongID[6] = val[4][0];

	/* get string descriptor long ID */
	urb.Direction = USB_DIR_IN;
	urb.SetupPacket = GetStrDescriptorLongID;
	urb.DataBuffer = val[4];
	urb.DataLength = GetStrDescriptorLongID[6];
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;

	/* get string descriptor serial number 2 bytes */
	urb.Direction = USB_DIR_IN;
	urb.SetupPacket = GetStrDescriptorSerialNum2;
	urb.DataBuffer = val[5];
	urb.DataLength = 2;
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;
	GetStrDescriptorSerialNum[6] = val[5][0];

	/* get string descriptor serial number */
	urb.Direction = USB_DIR_IN;
	urb.SetupPacket = GetStrDescriptorSerialNum;
	urb.DataBuffer = val[5];
	urb.DataLength = GetStrDescriptorSerialNum[6];
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;

	/* get string descriptor product 2 bytes */
	urb.Direction = USB_DIR_IN;
	urb.SetupPacket = GetStrDescriptorProduct2;
	urb.DataBuffer = val[6];
	urb.DataLength = 2;
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;
	GetStrDescriptorProduct[6] = val[6][0];

	/* get string descriptor product */
	urb.Direction = USB_DIR_IN;
	urb.SetupPacket = GetStrDescriptorProduct;
	urb.DataBuffer = val[6];
	urb.DataLength = GetStrDescriptorProduct[6];
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;

	/* set configuration */
	urb.Direction = USB_DIR_OUT;
	urb.SetupPacket = SetConfig;
	urb.DataBuffer = NULL;
	urb.DataLength = 0;
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;

	/* get max LUN */
	urb.Direction = USB_DIR_IN;
	urb.SetupPacket = GetMaxLUN;
	urb.DataBuffer = val[7];
	urb.DataLength = 1;
	if (HciSendUrb(&urb) != NO_ERR)
		return FALSE;

	return TRUE;

#else

	/* get device descriptor1 */
	if (!TestOTGCtrlSetupTransaction(GetDevDescriptor1, 8))
		return FALSE;
	if (!TestOTGCtrlInTransaction(val[0], &length, 0))
		return FALSE;
	if (!TestOTGCtrlOutTransaction(0, 0, 1))
		return FALSE;
	GetDevDescriptor2[6] = val[0][0];

	/* reset USB bus */
	/* send reset signal with high-speed and suspend enable */
	SetBitOTGReg8(otg_CommonUSB_Power, (Power_hrw_Reset | Power_hrw_EnSuspendMode));
	WaitMs(20);
	/* clear reset signal */
	ClrBitOTGReg8(otg_CommonUSB_Power, Power_hrw_Reset);

	/* set address */
	if (!TestOTGCtrlSetupTransaction(SetAddress, 8))
		return FALSE;
	if (!TestOTGCtrlInTransaction(0, 0, 1))
		return FALSE;
	WriteOTGReg8(otg_CommonUSB_FAddr, 1);

	/* get device descriptor2 */
	if (!TestOTGCtrlSetupTransaction(GetDevDescriptor2, 8))
		return FALSE;
	if (!TestOTGCtrlInTransaction(val[1], &length, 0))
		return FALSE;
	if (!TestOTGCtrlOutTransaction(0, 0, 1))
		return FALSE;

	/* get configuration descriptor */
	if (!TestOTGCtrlSetupTransaction(GetCfgDescriptor9, 8))
		return FALSE;
	if (!TestOTGCtrlInTransaction(val[2], &length, 0))
		return FALSE;
	if (!TestOTGCtrlOutTransaction(0, 0, 1))
		return FALSE;
	GetCfgDescriptor[6] = val[2][2];

	/* get configuration descriptor */
	if (!TestOTGCtrlSetupTransaction(GetCfgDescriptor, 8))
		return FALSE;
	if (!TestOTGCtrlInTransaction(val[2], &length, 0))
		return FALSE;
	if (!TestOTGCtrlOutTransaction(0, 0, 1))
		return FALSE;

	/* vendor request out1 for wifi */
	if (!TestOTGCtrlSetupTransaction(VendorRequestOUT1, 8))
		return FALSE;
//	for (temp = 0; temp < 64; ++temp)
//	{
//		if (!TestOTGCtrlOutTransaction(&gVendorRequestOut1[temp * 64], 64, 0))
//			return FALSE;
		if (!TestOTGCtrlOutTransaction(&gBugArray[0], 64, 0))
			return FALSE;
//	}
	if (!TestOTGCtrlInTransaction(0, 0, 1))
		return FALSE;

	/* vendor request out2 for wifi */
	if (!TestOTGCtrlSetupTransaction(VendorRequestOUT2, 8))
		return FALSE;
	for (temp = 0; temp < 16; ++temp)
	{
		if (!TestOTGCtrlOutTransaction(&gVendorRequestOut2[temp * 64], 64, 0))
			return FALSE;
	}
	if (!TestOTGCtrlInTransaction(0, 0, 1))
		return FALSE;

	/* vendor request in for wifi */
	if (!TestOTGCtrlSetupTransaction(VendorRequestIN, 8))
		return FALSE;
	if (!TestOTGCtrlInTransaction(val[2], &length, 0))
		return FALSE;
	if (!TestOTGCtrlOutTransaction(0, 0, 1))
		return FALSE;

#if !TEST_INTERRUPT_XFER_EN
	/* get string descriptor long ID */
	if (!TestOTGCtrlSetupTransaction(GetStrDescriptorLongID, 8))
		return FALSE;
	if (!TestOTGCtrlInTransaction(val[3], &length, 0))
		return FALSE;
	if (!TestOTGCtrlOutTransaction(0, 0, 1))
		return FALSE;

	/* get string descriptor serial number */
	if (!TestOTGCtrlSetupTransaction(GetStrDescriptorSerialNum, 8))
		return FALSE;
	if (!TestOTGCtrlInTransaction(val[4], &length, 0))
		return FALSE;
	if (!TestOTGCtrlOutTransaction(0, 0, 1))
		return FALSE;

	/* get string descriptor product */

⌨️ 快捷键说明

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