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

📄 usbhcd.c

📁 RDC R2886 USB Ehci ohc测试源码,paradigm c++上运行测试
💻 C
📖 第 1 页 / 共 2 页
字号:
	Ctl_Setup->bmRequestType = 0x80;
	Ctl_Setup->bRequest = 0x06;
	Ctl_Setup->wValue = 0x0200;
	Ctl_Setup->wIndex = 0x0000;
	Ctl_Setup->wLength = Length;
	
	ehci_Ctl_TD1->hw_next = 0x01;
	ehci_Ctl_TD1->hw_alt_next = 0x01;
	ehci_Ctl_TD1->hw_buf[0] = (UpperAddr(Ctl_Setup) << 16) + LowerAddr(Ctl_Setup);
	ehci_Ctl_TD1->hw_token = 0x80000L|QTD_CERR_3|QTD_PID_SETUP|QTD_STS_ACTIVE;

	//Data Stage
	Ctl_Data = (char *)cfg_des;

	ehci_Ctl_TD2->hw_next = 0x01;
	ehci_Ctl_TD2->hw_alt_next = 0x01;
	ehci_Ctl_TD2->hw_buf[0] = (UpperAddr(Ctl_Data) << 16) + LowerAddr(Ctl_Data);
	temp = Length;
	ehci_Ctl_TD2->hw_token = QTD_TOGGLE|(temp << 16)|QTD_CERR_3|QTD_PID_IN|QTD_STS_ACTIVE;

	ehci_Ctl_TD1->hw_next = (UpperAddr(ehci_Ctl_TD2) << 16) + LowerAddr(ehci_Ctl_TD2);
		
	//Status Stage
	ehci_Ctl_TD3->hw_next = 0x01;
	ehci_Ctl_TD3->hw_alt_next = 0x01;
	ehci_Ctl_TD3->hw_buf[0] = 0;
	ehci_Ctl_TD3->hw_token = QTD_TOGGLE|QTD_IOC|QTD_CERR_3|QTD_PID_OUT|QTD_STS_ACTIVE;
	
	ehci_Ctl_TD2->hw_next = (UpperAddr(ehci_Ctl_TD3) << 16) + LowerAddr(ehci_Ctl_TD3);
	
	//Write TD to QH, valid TD
	Do_TD_Complete = 0;
	ehci_Ep0->hw_qtd_next = (UpperAddr(ehci_Ctl_TD1) << 16) + LowerAddr(ehci_Ctl_TD1);

	do{} while(Do_TD_Complete == 0);

//Sten
	if(((ehci_Ctl_TD1->hw_token & 0x7E) != 0) ||
		((ehci_Ctl_TD2->hw_token & 0x7E) != 0) || ((ehci_Ctl_TD3->hw_token & 0x7E) != 0))
		//return FALSE;
      Err_Cnt++;

	/*p = (char *) cfg_des;
	q = (char *) UDisk_cfg_des;
   i = sizeof(std_cfg_des);
	for(i=0;i<sizeof(std_cfg_des);i++)
		if(*p++ != *q++)
			return FALSE;
	
	if(Length > sizeof(std_cfg_des))
	{
		p = (char *) if_des;
		q = (char *) UDisk_if_des;
		for(i=0;i<sizeof(std_if_des);i++)
			if(*p++ != *q++)
				return FALSE;
		p = (char *) edp_des1;
		q = (char *) UDisk_edp_des1;
		for(i=0;i<sizeof(std_edp_des);i++)
			if(*p++ != *q++)
				return FALSE;
		p = (char *) edp_des2;
		q = (char *) UDisk_edp_des2;
		for(i=0;i<sizeof(std_edp_des);i++)
			if(*p++ != *q++)
				return FALSE;
		p = (char *) edp_des3;
		q = (char *) UDisk_edp_des3;
		for(i=0;i<sizeof(std_edp_des);i++)
			if(*p++ != *q++)
				return FALSE;
	}*/
	
	return TRUE;	
}

BOOL Get_String_Desc(int num)
{
	//int i;
   int temp;
	//char *p, *q;

	if(num == 0)
		LANGID[0] = 0;
   else if(num == 1)
		String1[0] = 0;
	else if(num == 2)
		String2[0] = 0;
	else if(num == 3)
		String3[0] = 0;
	
	//Setup Stage
	Ctl_Setup->bmRequestType = 0x80;
	Ctl_Setup->bRequest = 0x06;
	Ctl_Setup->wValue = 0x0300 | num;
	if(num == 0)
		Ctl_Setup->wIndex = 0x0000;
	else {
		temp = (LANGID[3] << 8) + LANGID[2];
		Ctl_Setup->wIndex = temp;
	}
	Ctl_Setup->wLength = 0x00FF;
	
	ehci_Ctl_TD1->hw_next = 0x01;
	ehci_Ctl_TD1->hw_alt_next = 0x01;
	ehci_Ctl_TD1->hw_buf[0] = (UpperAddr(Ctl_Setup) << 16) + LowerAddr(Ctl_Setup);
	ehci_Ctl_TD1->hw_token = 0x80000L|QTD_CERR_3|QTD_PID_SETUP|QTD_STS_ACTIVE;

	//Data Stage
	if(num == 0)
		Ctl_Data = (char *)LANGID;
   else if(num == 1)
		Ctl_Data = (char *)String1;
	else if(num == 2)
		Ctl_Data = (char *)String2;
	else if(num == 3)
		Ctl_Data = (char *)String3;
				
	ehci_Ctl_TD2->hw_next = 0x01;
	ehci_Ctl_TD2->hw_alt_next = 0x01;
	ehci_Ctl_TD2->hw_buf[0] = (UpperAddr(Ctl_Data) << 16) + LowerAddr(Ctl_Data);
	ehci_Ctl_TD2->hw_token = QTD_TOGGLE|0xFF0000L|QTD_CERR_3|QTD_PID_IN|QTD_STS_ACTIVE;

	ehci_Ctl_TD1->hw_next = (UpperAddr(ehci_Ctl_TD2) << 16) + LowerAddr(ehci_Ctl_TD2);

	//Status Stage
	ehci_Ctl_TD3->hw_next = 0x01;
	ehci_Ctl_TD3->hw_alt_next = 0x01;
	ehci_Ctl_TD3->hw_buf[0] = 0;
	ehci_Ctl_TD3->hw_token = QTD_TOGGLE|QTD_IOC|QTD_CERR_3|QTD_PID_OUT|QTD_STS_ACTIVE;

	ehci_Ctl_TD2->hw_next = (UpperAddr(ehci_Ctl_TD3) << 16) + LowerAddr(ehci_Ctl_TD3);

	//Write TD to QH, valid TD
	Do_TD_Complete = 0;
	ehci_Ep0->hw_qtd_next = (UpperAddr(ehci_Ctl_TD1) << 16) + LowerAddr(ehci_Ctl_TD1);

	do{} while(Do_TD_Complete == 0);

//Sten
	if(((ehci_Ctl_TD1->hw_token & 0x7E) != 0) ||
		((ehci_Ctl_TD2->hw_token & 0x7E) != 0) || ((ehci_Ctl_TD3->hw_token & 0x7E) != 0))
		//return FALSE;
      Err_Cnt++;

	/*if(num == 0)
	{
		p = (char *) LANGID;
		q = (char *) UDisk_LANGID;
		for(i=0;i<sizeof(LANGID);i++)
			if(*p++ != *q++)
				return FALSE;
	}
	else if(num == 2)
	{
		p = (char *) String2;
		q = (char *) UDisk_String2;
		//for(i=0;i<sizeof(String2);i++)
		for(i=0;i<34;i++)
			if(*p++ != *q++)
				return FALSE;
		//Clear others
		for(i=0;i<50;i++)
			*p++ = ' ';
	}
	else if(num == 3)
	{
		p = (char *) String3;
		q = (char *) UDisk_String3;
		//for(i=0;i<sizeof(String3);i++)
		for(i=0;i<34;i++)
			if(*p++ != *q++)
				return FALSE;
	}*/
		
	return TRUE;
}

BOOL Set_Configuration(int num)
{
	//Setup Stage
	Ctl_Setup->bmRequestType = 0x00;
	Ctl_Setup->bRequest = 0x09;
	Ctl_Setup->wValue = num;
	Ctl_Setup->wIndex = 0x0000;
	Ctl_Setup->wLength = 0x0000;

	ehci_Ctl_TD1->hw_next = 0x01;
	ehci_Ctl_TD1->hw_alt_next = 0x01;
	ehci_Ctl_TD1->hw_buf[0] = (UpperAddr(Ctl_Setup) << 16) + LowerAddr(Ctl_Setup);
	ehci_Ctl_TD1->hw_token = 0x80000L|QTD_CERR_3|QTD_PID_SETUP|QTD_STS_ACTIVE;

	//Status Stage
	ehci_Ctl_TD3->hw_next = 0x01;
	ehci_Ctl_TD3->hw_alt_next = 0x01;
	ehci_Ctl_TD3->hw_buf[0] = 0;
	ehci_Ctl_TD3->hw_token = QTD_TOGGLE|QTD_IOC|QTD_CERR_3|QTD_PID_IN|QTD_STS_ACTIVE;

	ehci_Ctl_TD1->hw_next = (UpperAddr(ehci_Ctl_TD3) << 16) + LowerAddr(ehci_Ctl_TD3);

	Do_TD_Complete = 0;
	ehci_Ep0->hw_qtd_next = (UpperAddr(ehci_Ctl_TD1) << 16) + LowerAddr(ehci_Ctl_TD1);

	do{} while(Do_TD_Complete == 0);

//Sten
	if(((ehci_Ctl_TD1->hw_token & 0x7E) != 0) || ((ehci_Ctl_TD3->hw_token & 0x7E) != 0))
   	{
       inport(0x6000);
		//return FALSE;
      Err_Cnt++;
      };

	return TRUE;
}

BOOL DoControlTransfer()
{
 	static char buf[30];
 	char buf1[26]={"Doing Control transfer..."};
 	char *p, *q;
 	int i;

   dev_des->bLength=0x12;
   
	//Get device descriptor
	if(Get_Device_Descriptor(dev_des->bLength) == FALSE)
		return FALSE;

	//Get Configuration descriptor, initial Mass storage device just have one configuration
	if(dev_des->bNumConfigurations != 0)
		if(Get_Configuration_Desc(0x09) == FALSE)
			return FALSE;

	//Get LANGID String Descriptor
	if((dev_des->iManufacturer != 0) || (dev_des->iProduct != 0) ||(dev_des->iSerialNumber != 0))
		if(Get_String_Desc(0) == FALSE)
			return FALSE;

	//Get String 3 Descriptor
	if(dev_des->iSerialNumber != 0)
		if(Get_String_Desc(dev_des->iSerialNumber) == FALSE)
			return FALSE;

	//Get Configuration, interface, endpoint descriptor
	if(dev_des->bNumConfigurations != 0)
		if(Get_Configuration_Desc(0xFF) == FALSE)
			return FALSE;

	//Get LANGID String Descriptor
	if((dev_des->iManufacturer != 0) || (dev_des->iProduct != 0) ||(dev_des->iSerialNumber != 0))
		if(Get_String_Desc(0) == FALSE)
			return FALSE;

	//Get String 2 Descriptor
	if(dev_des->iProduct != 0)
		if(Get_String_Desc(dev_des->iProduct) == FALSE)
			return FALSE;

	//Get LANGID String Descriptor
	if((dev_des->iManufacturer != 0) || (dev_des->iProduct != 0) ||(dev_des->iSerialNumber != 0))
		if(Get_String_Desc(0) == FALSE)
			return FALSE;

	//Get String 2 Descriptor
	if(dev_des->iProduct != 0)
		if(Get_String_Desc(dev_des->iProduct) == FALSE)
			return FALSE;

	//Get String 2 Descriptor
	if(dev_des->iManufacturer != 0)
		if(Get_String_Desc(dev_des->iManufacturer) == FALSE)
			return FALSE;

	//Get device descriptor
	if(Get_Device_Descriptor(dev_des->bLength) == FALSE)
		return FALSE;

	//Get Configuration descriptor
	if(dev_des->bNumConfigurations != 0)
		if(Get_Configuration_Desc(0x09) == FALSE)
			return FALSE;

	//Get Configuration descriptor
	if(dev_des->bNumConfigurations != 0)
		if(Get_Configuration_Desc(cfg_des->wTotalLength) == FALSE)
			return FALSE;

	//Set Configuration
	if(Set_Configuration(cfg_des->bConfigurationValue) == FALSE)
		return FALSE;

	ControlCnt++;
	if(ControlCnt == 0x0000){
		p=buf;
		q=buf1;
		for(i=0;i<sizeof(buf1);i++)
			*p++ = *q++;
		*p++ = 10;
		*p++ = 13;
		UART_SendData(buf, sizeof(buf));
	}
	
	return TRUE;
}

void SendDesc2UART()
{
	static char buf[40];
	char buf1[28] = {"Control transfer times : 0x"};
	char *p, *q;
	int i;

	//Send descriptor to UART 1
	UART_Device_Descriptor(dev_des);
	if(dev_des->bNumConfigurations != 0)
		UART_Configuration_Descriptor(cfg_des);
	if(cfg_des->bNumInterfaces != 0)
		UART_Interface_Descriptor(if_des);
	if(if_des->bNumEndpoints > 0)
		UART_Endpoint_Descriptor(edp_des1,1);
	if(if_des->bNumEndpoints > 1)
		UART_Endpoint_Descriptor(edp_des2,2);
	if(if_des->bNumEndpoints > 2)
		UART_Endpoint_Descriptor(edp_des3,3);
	if((dev_des->iManufacturer != 0) || (dev_des->iProduct != 0) ||(dev_des->iSerialNumber != 0))
		UART_String_Descriptor(LANGID, 0, sizeof(LANGID));
   if(dev_des->iManufacturer != 0)
   {
   	switch(dev_des->iManufacturer)
      {
      	case 1:
				UART_String_Descriptor(String1, 1, sizeof(String1));	break;
         case 2:
				UART_String_Descriptor(String2, 2, sizeof(String2)); 	break;
         case 3:
				UART_String_Descriptor(String3, 3, sizeof(String3)); 	break;
      }
   }
	if(dev_des->iProduct != 0)
   {
		switch(dev_des->iProduct)
      {
      	case 1:
				UART_String_Descriptor(String1, 1, sizeof(String1));	break;
         case 2:
				UART_String_Descriptor(String2, 2, sizeof(String2)); 	break;
         case 3:
				UART_String_Descriptor(String3, 3, sizeof(String3)); 	break;
      }
   }
	if(dev_des->iSerialNumber != 0)
   {
   	switch(dev_des->iSerialNumber)
      {
      	case 1:
				UART_String_Descriptor(String1, 1, sizeof(String1));	break;
         case 2:
				UART_String_Descriptor(String2, 2, sizeof(String2)); 	break;
         case 3:
				UART_String_Descriptor(String3, 3, sizeof(String3)); 	break;
      }
   }

	p=buf;
	q=buf1;
	*p++ = 10;
	*p++ = 13;
	for(i=0;i<sizeof(buf1);i++)
		*p++ = *q++;
	
	p = Num_ASCII_W(p, ControlCnt, FALSE);
	*p++ = 10;
	*p++ = 13;
	UART_SendData(buf, sizeof(buf));		
}

⌨️ 快捷键说明

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