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

📄 otg_dev.c

📁 s3c6400 ADS下官方测试程序
💻 C
📖 第 1 页 / 共 5 页
字号:
			if (oOtgDev.m_eSpeed == USB_HIGH)
			{
				if (oOtgDev.m_uDeviceRequestLength<=DEVICE_DESC_SIZE)
				{
					OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
					Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0));	//ep0 enable, clear nak, next ep0, max 64byte
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+0, oOtgDev.m_uDeviceRequestLength); // EP0_PKT_SIZE
				}
				else
				{
					OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, DEVICE_DESC_SIZE);
					Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0));	//ep0 enable, clear nak, next ep0, max 64byte
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+0, DEVICE_DESC_SIZE); // EP0_PKT_SIZE
				}
				oOtgDev.m_uEp0State = EP0_STATE_INIT;
				DbgUsb("EndpointZeroTransfer(EP0_STATE_GD_DEV_0)\n");
			}
			else
			{
				if(oOtgDev.m_uDeviceRequestLength<=DEVICE_DESC_SIZE)
				{
					if(oOtgDev.m_uDeviceRequestLength<=FULL_SPEED_CONTROL_PKT_SIZE)
						OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
					else if(oOtgDev.m_uDeviceRequestLength<=(2*FULL_SPEED_CONTROL_PKT_SIZE))
						OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 2, oOtgDev.m_uDeviceRequestLength);
					else
						OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 3, oOtgDev.m_uDeviceRequestLength);
				}
				else
				{
					OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 3, DEVICE_DESC_SIZE);
				}
				Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, max 8byte
				if(oOtgDev.m_uDeviceRequestLength<=FULL_SPEED_CONTROL_PKT_SIZE)
				{
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+0, oOtgDev.m_uDeviceRequestLength); // EP0_PKT_SIZE
					oOtgDev.m_uEp0State = EP0_STATE_INIT;
				}
				else
				{
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+0, FULL_SPEED_CONTROL_PKT_SIZE); // EP0_PKT_SIZE
					oOtgDev.m_uEp0State = EP0_STATE_GD_DEV_1;
				}
				DbgUsb("EndpointZeroTransfer(FS:EP0_STATE_GD_DEV_0)\n");
			}
			break;

		case EP0_STATE_GD_DEV_1:
			Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, 8byte
			if(oOtgDev.m_uDeviceRequestLength<=(2*FULL_SPEED_CONTROL_PKT_SIZE))
			{
				OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+FULL_SPEED_CONTROL_PKT_SIZE, (oOtgDev.m_uDeviceRequestLength-FULL_SPEED_CONTROL_PKT_SIZE)); // EP0_PKT_SIZE
				oOtgDev.m_uEp0State = EP0_STATE_INIT;
			}
			else
			{
				OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+FULL_SPEED_CONTROL_PKT_SIZE, FULL_SPEED_CONTROL_PKT_SIZE); // EP0_PKT_SIZE
				oOtgDev.m_uEp0State = EP0_STATE_GD_DEV_2;
			}
			DbgUsb("EndpointZeroTransfer(EP0_STATE_GD_DEV_1)\n");
			break;

		case EP0_STATE_GD_DEV_2:
			Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, 8byte
			if(oOtgDev.m_uDeviceRequestLength<=DEVICE_DESC_SIZE)
			{
				OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+(2*FULL_SPEED_CONTROL_PKT_SIZE), (oOtgDev.m_uDeviceRequestLength-2*FULL_SPEED_CONTROL_PKT_SIZE)); // EP0_PKT_SIZE
			}
			else
			{
				OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescDevice))+(2*FULL_SPEED_CONTROL_PKT_SIZE), (DEVICE_DESC_SIZE-2*FULL_SPEED_CONTROL_PKT_SIZE)); // EP0_PKT_SIZE
			}
			oOtgDev.m_uEp0State = EP0_STATE_INIT;
			DbgUsb("EndpointZeroTransfer(EP0_STATE_GD_DEV_2)\n");
			break;

		// === GET_DESCRIPTOR:CONFIGURATION+INTERFACE+ENDPOINT0+ENDPOINT1 ===
		// Windows98 gets these 4 descriptors all together by issuing only a request.
		// Windows2000 gets each descriptor seperately.
		// === GET_DESCRIPTOR:CONFIGURATION ONLY for WIN2K===
		case EP0_STATE_GD_CFG_0:
			if (oOtgDev.m_eSpeed == USB_HIGH)
			{
				if(oOtgDev.m_uDeviceRequestLength<=CONFIG_DESC_TOTAL_SIZE)
				{
					OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
					Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0));	//ep0 enable, clear nak, next ep0, max 64byte
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, oOtgDev.m_uDeviceRequestLength); // EP0_PKT_SIZE
				}
				else
				{
					OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, CONFIG_DESC_TOTAL_SIZE);
					Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0));	//ep0 enable, clear nak, next ep0, max 64byte
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, CONFIG_DESC_TOTAL_SIZE); // EP0_PKT_SIZE
				}
				oOtgDev.m_uEp0State = EP0_STATE_INIT;
				DbgUsb("EndpointZeroTransfer(EP0_STATE_GD_CFG)\n");
			}
			else
			{
				if(oOtgDev.m_uDeviceRequestLength<=CONFIG_DESC_TOTAL_SIZE)
				{
					if(oOtgDev.m_uDeviceRequestLength<=FULL_SPEED_CONTROL_PKT_SIZE)
						OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
					else if(oOtgDev.m_uDeviceRequestLength<=(2*FULL_SPEED_CONTROL_PKT_SIZE))
						OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 2, oOtgDev.m_uDeviceRequestLength);
					else if(oOtgDev.m_uDeviceRequestLength<=(3*FULL_SPEED_CONTROL_PKT_SIZE))
						OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 3, oOtgDev.m_uDeviceRequestLength);
					else
						OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 4, oOtgDev.m_uDeviceRequestLength);
				}
				else
				{
					OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 4, CONFIG_DESC_TOTAL_SIZE);
				}
				Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, 8byte
				if(oOtgDev.m_uDeviceRequestLength<=FULL_SPEED_CONTROL_PKT_SIZE)
				{
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, oOtgDev.m_uDeviceRequestLength); // EP0_PKT_SIZE
					oOtgDev.m_uEp0State = EP0_STATE_INIT;
				}
				else
				{
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, FULL_SPEED_CONTROL_PKT_SIZE); // EP0_PKT_SIZE
					oOtgDev.m_uEp0State = EP0_STATE_GD_CFG_1;
				}
				DbgUsb("EndpointZeroTransfer(EP0_STATE_GD_CFG_0)\n");
			}
			break;

		case EP0_STATE_GD_CFG_1:
			Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, 8byte
			if(oOtgDev.m_uDeviceRequestLength<=(2*FULL_SPEED_CONTROL_PKT_SIZE))
			{
				OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+FULL_SPEED_CONTROL_PKT_SIZE, (oOtgDev.m_uDeviceRequestLength-FULL_SPEED_CONTROL_PKT_SIZE)); // EP0_PKT_SIZE
				oOtgDev.m_uEp0State = EP0_STATE_INIT;
			}
			else
			{
				OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+FULL_SPEED_CONTROL_PKT_SIZE, FULL_SPEED_CONTROL_PKT_SIZE); // EP0_PKT_SIZE	OTGDEV_WrPktEp0((U8 *)&descConf+8, 1); OTGDEV_WrPktEp0((U8 *)&descIf+0, 7);
				oOtgDev.m_uEp0State = EP0_STATE_GD_CFG_2;
			}
			break;

		case EP0_STATE_GD_CFG_2:
			Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, 8byte
			if(oOtgDev.m_uDeviceRequestLength<=(3*FULL_SPEED_CONTROL_PKT_SIZE))
			{
				OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+(2*FULL_SPEED_CONTROL_PKT_SIZE), (oOtgDev.m_uDeviceRequestLength-2*FULL_SPEED_CONTROL_PKT_SIZE)); // EP0_PKT_SIZE
				oOtgDev.m_uEp0State = EP0_STATE_INIT;
			}
			else
			{
				OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+(2*FULL_SPEED_CONTROL_PKT_SIZE), FULL_SPEED_CONTROL_PKT_SIZE); // EP0_PKT_SIZE	OTGDEV_WrPktEp0((U8 *)&descIf+7, 2); OTGDEV_WrPktEp0((U8 *)&descEndpt0+0, 6);
				oOtgDev.m_uEp0State = EP0_STATE_GD_CFG_3;
			}
			break;

		case EP0_STATE_GD_CFG_3:
			Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, 8byte
			if(oOtgDev.m_uDeviceRequestLength<=(4*FULL_SPEED_CONTROL_PKT_SIZE))
			{
				OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+(3*FULL_SPEED_CONTROL_PKT_SIZE), (oOtgDev.m_uDeviceRequestLength-3*FULL_SPEED_CONTROL_PKT_SIZE)); // EP0_PKT_SIZE
				oOtgDev.m_uEp0State = EP0_STATE_INIT;
			}
			else
			{
				OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+(3*FULL_SPEED_CONTROL_PKT_SIZE), FULL_SPEED_CONTROL_PKT_SIZE); // EP0_PKT_SIZE	OTGDEV_WrPktEp0((U8 *)&descEndpt0+6, 1); OTGDEV_WrPktEp0((U8 *)&descEndpt1+0, 7);
				oOtgDev.m_uEp0State = EP0_STATE_GD_CFG_4;
			}
			break;

		case EP0_STATE_GD_CFG_4:
			oOtgDev.m_uEp0State = EP0_STATE_INIT;
			break;

		case EP0_STATE_GD_DEV_QUALIFIER:	//only supported in USB 2.0
			if(oOtgDev.m_uDeviceRequestLength<=10)
			{
				OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
				Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0));	//ep0 enable, clear nak, next ep0, 8byte
				OTGDEV_WrPktEp0((u8 *)aDeviceQualifierDescriptor+0, oOtgDev.m_uDeviceRequestLength);
			}
			else
			{
				OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 10);
				Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0));	//ep0 enable, clear nak, next ep0, 8byte
				OTGDEV_WrPktEp0((u8 *)aDeviceQualifierDescriptor+0, 10);
			}
			oOtgDev.m_uEp0State = EP0_STATE_INIT;
			break;		

        case EP0_STATE_GD_OTHER_SPEED:
			OTEDEV_SetOtherSpeedConfDescTable(oOtgDev.m_uDeviceRequestLength);
			break;	

        case EP0_STATE_GD_OTHER_SPEED_HIGH_1:
        	if(oOtgDev.m_uDeviceRequestLength==9)
        	{    
		    	OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 1);
				Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, max 64byte
				OTGDEV_WrPktEp0(((u8 *)&aOtherSpeedConfiguration_high)+8, 1); // EP0_PKT_SIZE
				oOtgDev.m_uEp0State = EP0_STATE_INIT;
        	}
        	else
        	{  
		    	OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 8);
				Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, max 64byte
				OTGDEV_WrPktEp0(((u8 *)&aOtherSpeedConfiguration_high)+8, 8); // EP0_PKT_SIZE
				oOtgDev.m_uEp0State = EP0_STATE_GD_OTHER_SPEED_HIGH_2;
        	}
			break;

        case EP0_STATE_GD_OTHER_SPEED_HIGH_2:
	    	OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 8);
			Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, max 64byte
			OTGDEV_WrPktEp0(((u8 *)&aOtherSpeedConfiguration_high)+16, 8); // EP0_PKT_SIZE
			oOtgDev.m_uEp0State = EP0_STATE_GD_OTHER_SPEED_HIGH_3;
			break;

        case EP0_STATE_GD_OTHER_SPEED_HIGH_3:
	    	OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 8);
			Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, max 64byte
			OTGDEV_WrPktEp0(((u8 *)&aOtherSpeedConfiguration_high)+24, 8); // EP0_PKT_SIZE
			oOtgDev.m_uEp0State = EP0_STATE_INIT;
			break;		

		// === GET_DESCRIPTOR:CONFIGURATION ONLY===
		case EP0_STATE_GD_CFG_ONLY_0:
			if (oOtgDev.m_eSpeed == USB_HIGH)
			{
				DbgUsb("[DBG : EP0_STATE_GD_CFG_ONLY]\n");
				if(oOtgDev.m_uDeviceRequestLength<=CONFIG_DESC_SIZE)
				{
					OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
					Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0));	//ep0 enable, clear nak, next ep0, max 64byte
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, oOtgDev.m_uDeviceRequestLength); // EP0_PKT_SIZE
				}
				else
				{
					OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, CONFIG_DESC_SIZE);
					Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0));	//ep0 enable, clear nak, next ep0, max 64byte
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, CONFIG_DESC_SIZE); // EP0_PKT_SIZE
				}
				oOtgDev.m_uEp0State = EP0_STATE_INIT;
			}
			else
			{
				DbgUsb("[DBG : EP0_STATE_GD_CFG_ONLY_0]\n");
				if(oOtgDev.m_uDeviceRequestLength<=CONFIG_DESC_SIZE)
				{
					if(oOtgDev.m_uDeviceRequestLength<=FULL_SPEED_CONTROL_PKT_SIZE)
						OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
					else
						OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 2, oOtgDev.m_uDeviceRequestLength);
				}
				else
				{
					OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 2, CONFIG_DESC_SIZE);
				}
				Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, 8byte
				if(oOtgDev.m_uDeviceRequestLength<=FULL_SPEED_CONTROL_PKT_SIZE)
				{
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, oOtgDev.m_uDeviceRequestLength); // EP0_PKT_SIZE
					oOtgDev.m_uEp0State = EP0_STATE_INIT;
				}
				else
				{
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+0, FULL_SPEED_CONTROL_PKT_SIZE); // EP0_PKT_SIZE
					oOtgDev.m_uEp0State = EP0_STATE_GD_CFG_ONLY_1;
				}
			}
			break;

		case EP0_STATE_GD_CFG_ONLY_1:
			DbgUsb("[DBG : EP0_STATE_GD_CFG_ONLY_1]\n");
			Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, 8byte
			OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescConfig))+FULL_SPEED_CONTROL_PKT_SIZE, (CONFIG_DESC_SIZE-FULL_SPEED_CONTROL_PKT_SIZE)); // EP0_PKT_SIZE
			oOtgDev.m_uEp0State = EP0_STATE_INIT;
			break;

		// === GET_DESCRIPTOR:INTERFACE ONLY===

		case EP0_STATE_GD_IF_ONLY_0:
			if (oOtgDev.m_eSpeed == USB_HIGH)
			{
				if(oOtgDev.m_uDeviceRequestLength<=INTERFACE_DESC_SIZE)
				{
					OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
					Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0));	//ep0 enable, clear nak, next ep0, max 64byte
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescInterface))+0, oOtgDev.m_uDeviceRequestLength);	// INTERFACE_DESC_SIZE
				}
				else
				{
					OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, INTERFACE_DESC_SIZE);
					Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(0<<0));	//ep0 enable, clear nak, next ep0, max 64byte
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescInterface))+0, INTERFACE_DESC_SIZE);	// INTERFACE_DESC_SIZE
				}
				oOtgDev.m_uEp0State = EP0_STATE_INIT;
			}
			else
			{
				if(oOtgDev.m_uDeviceRequestLength<=INTERFACE_DESC_SIZE)
				{
					if(oOtgDev.m_uDeviceRequestLength<=FULL_SPEED_CONTROL_PKT_SIZE)
						OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uDeviceRequestLength);
					else
						OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 2, oOtgDev.m_uDeviceRequestLength);
				}
				else
				{
					OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, INTERFACE_DESC_SIZE);
				}
				Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, 8byte
				if(oOtgDev.m_uDeviceRequestLength<FULL_SPEED_CONTROL_PKT_SIZE)
				{
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescInterface))+0, oOtgDev.m_uDeviceRequestLength);	// INTERFACE_DESC_SIZE
					oOtgDev.m_uEp0State = EP0_STATE_INIT;
				}
				else
				{
					OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescInterface))+0, FULL_SPEED_CONTROL_PKT_SIZE);	// INTERFACE_DESC_SIZE
					oOtgDev.m_uEp0State = EP0_STATE_GD_IF_ONLY_1;
				}
			}
			break;

		case EP0_STATE_GD_IF_ONLY_1:
			Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, 8byte
			OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescInterface))+FULL_SPEED_CONTROL_PKT_SIZE, (INTERFACE_DESC_SIZE-FULL_SPEED_CONTROL_PKT_SIZE));
			oOtgDev.m_uEp0State = EP0_STATE_INIT;
			break;


		// === GET_DESCRIPTOR:ENDPOINT 1 ONLY===
		case EP0_STATE_GD_EP0_ONLY_0:
			OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, ENDPOINT_DESC_SIZE);
			Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, 8byte
			OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescEndpt1))+0, ENDPOINT_DESC_SIZE);
			oOtgDev.m_uEp0State = EP0_STATE_INIT;
			break;

		// === GET_DESCRIPTOR:ENDPOINT 2 ONLY===
		case EP0_STATE_GD_EP1_ONLY_0:
			OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, ENDPOINT_DESC_SIZE);
			Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, 8byte
			OTGDEV_WrPktEp0(((u8 *)&(oOtgDev.m_oDesc.oDescEndpt2))+0, ENDPOINT_DESC_SIZE);
			oOtgDev.m_uEp0State = EP0_STATE_INIT;
			break;

				// === GET_DESCRIPTOR:STRING ===
		case EP0_STATE_GD_STR_I0:
			DbgUsb("[GDS0_0]");
			OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, STRING_DESC0_SIZE);
			Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(CONTROL_EP<<11)|(3<<0));	//ep0 enable, clear nak, next ep0, 8byte
			OTGDEV_WrPktEp0((u8 *)aDescStr0, STRING_DESC0_SIZE);
			oOtgDev.m_uEp0State = EP0_STATE_INIT;
			break;

		case EP0_STATE_GD_STR_I1:
			DbgUsb("[GDS1_%d]", oOtgDev.m_uEp0SubState);
			if ((oOtgDev.m_uEp0SubState*oOtgDev.m_uControlEPMaxPktSize+oOtgDev.m_uControlEPMaxPktSize)<sizeof(aDescStr1))
			{

⌨️ 快捷键说明

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