test_host.c

来自「一个USB主机核的驱动程序」· C语言 代码 · 共 1,528 行 · 第 1/5 页

C
1,528
字号
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 + =
减小字号Ctrl + -
显示快捷键?