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

📄 chap_9.c

📁 此為philip 1362 USB DOS下的驅動程式包, 已經共測試並內含有說明文件
💻 C
📖 第 1 页 / 共 2 页
字号:
		switch(DCPCtrlXfer.DeviceRequest.bmRequestType.Recipient)
		{
		case USB_RECIPIENT_DEVICE:
			if(USB_FEATURE_REMOTE_WAKEUP == wFeature)
			{
//				D13_DevInfo.bits.remote_wakeup = 0;
				Chap9sup_SingleTransmitEP0(0, 0);
			}
/*			else if(USB_FEATURE_B_HNP_ENABLE == wFeature)
			{
				OtgTcb.b_hnp_en = 0;
				Chap9sup_SingleTransmitEP0(0, 0);
			}
			else if(USB_FEATURE_A_HNP_SUPPORT == wFeature)
			{
				OtgTcb.a_hnp_support = 0;
				Chap9sup_SingleTransmitEP0(0, 0);
			}
			else if(USB_FEATURE_A_ALT_HNP_SUPPORT == wFeature)
			{
				OtgTcb.a_alt_hnp_support = 0;
				Chap9sup_SingleTransmitEP0(0, 0);
			}	*/
			else
			{
				Chap9sup_StallEP0InControlWrite();
				return;
			}

			break;
		case USB_RECIPIENT_ENDPOINT:

			if( 0 != DCPCtrlXfer.DeviceRequest.wIndex && DEVSTATE_ADDRESS == D13_DevInfo.bits.DevState)
			{
				Chap9sup_StallEP0InControlWrite();
				return;
			}

			if(wFeature == USB_FEATURE_ENDPOINT_STALL)
			{
				byEndp = (UCHAR)(DCPCtrlXfer.DeviceRequest.wIndex & MAX_ENDPOINTS);

				D13_SetEndpointStatus( D13_Endp2EndpIndex(byEndp), 0);
				Chap9sup_SingleTransmitEP0(0, 0);
			}
			else
			{
				Chap9sup_StallEP0InControlWrite();
			}
			break;
		case USB_RECIPIENT_INTERFACE:
		default:
			Chap9sup_StallEP0InControlWrite();
			break;
		}
	}
	else
	{
		Chap9sup_StallEP0InControlWrite();
	}
}

void Chap9_SetFeature(void)
{
	UCHAR   byEndp;
	USHORT  wFeature = DCPCtrlXfer.DeviceRequest.wValue;

	if( DIR_H2D == DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir && \
		DCPCtrlXfer.DeviceRequest.wLength == 0 )
	{
		switch(DCPCtrlXfer.DeviceRequest.bmRequestType.Recipient)
		{
		case USB_RECIPIENT_DEVICE:
			if(USB_FEATURE_REMOTE_WAKEUP == wFeature)
			{
//				D13_DevInfo.bits.remote_wakeup = 1;
				Chap9sup_SingleTransmitEP0(0, 0);
			}
			else if(USB_FEATURE_B_HNP_ENABLE == wFeature)
			{
				Chap9sup_SingleTransmitEP0(0, 0);
				OtgTcb.b_hnp_en = 1;
//				printf("DC: Setup_handler: b_hnp_en = 1\n");
			}
			else if(USB_FEATURE_A_HNP_SUPPORT == wFeature)
			{
				OtgTcb.a_hnp_support = 1;
				Chap9sup_SingleTransmitEP0(0, 0);
			}
			else if(USB_FEATURE_A_ALT_HNP_SUPPORT == wFeature)
			{
				OtgTcb.a_alt_hnp_support = 1;
				Chap9sup_SingleTransmitEP0(0, 0);
			}
			else
			{
				Chap9sup_StallEP0InControlWrite();
				return;
			}
			break;
		case USB_RECIPIENT_ENDPOINT:
			if( wFeature == USB_FEATURE_ENDPOINT_STALL)
			{

				if( 0 != DCPCtrlXfer.DeviceRequest.wIndex && DEVSTATE_ADDRESS == D13_DevInfo.bits.DevState)
				{
					Chap9sup_StallEP0InControlWrite();
					return;
				}

				byEndp = (UCHAR)(DCPCtrlXfer.DeviceRequest.wIndex & MAX_ENDPOINTS);
				D13_SetEndpointStatus(D13_Endp2EndpIndex(byEndp), D13REG_EPSTS_STALL);
				Chap9sup_SingleTransmitEP0(0, 0);
			}
			else
			{

				D13_SetEndpointStatus(D13_Endp2EndpIndex(byEndp), 0);
				Chap9sup_SingleTransmitEP0(0, 0);
			}
			break;
		case USB_RECIPIENT_INTERFACE:
		default:
			Chap9sup_StallEP0InControlWrite();
			break;
		}
	}else
	{
		Chap9sup_StallEP0InControlWrite();
	}
}

void Chap9_SetAddress(void)
{

	if( DIR_H2D != DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir || \
		0 != DCPCtrlXfer.DeviceRequest.wIndex || \
		0 != DCPCtrlXfer.DeviceRequest.wLength)
	{
		Chap9sup_StallEP0InControlWrite();
		return;
	}

	if( DCPCtrlXfer.DeviceRequest.wIndex == 0 && DCPCtrlXfer.DeviceRequest.wLength == 0 ){
		RaiseIRQL();
		if(!DCPCtrlXfer.bAbort)
		{
			D13_SetAddressEnable((UCHAR)(DCPCtrlXfer.DeviceRequest.wValue), 1);

			if(0 == (UCHAR)(DCPCtrlXfer.DeviceRequest.wValue))
				D13_DevInfo.bits.DevState = DEVSTATE_DEFAULT;
			else
				D13_DevInfo.bits.DevState = DEVSTATE_ADDRESS;
		}
		LowerIRQL();

		/*
		// Minimize the MISSING Window for SETUP Packet
		// Here give a chance to ISR whose interrupt is caused by Setup Packet
		*/
			Chap9sup_SingleTransmitEP0(0, 0);
	}
	else
	{
		Chap9sup_StallEP0InControlWrite();
	}
}


void Chap9_GetDescriptor(void)
{
	UCHAR   bDescriptor = MSB(DCPCtrlXfer.DeviceRequest.wValue);
	UCHAR   bDescriptorIndex = LSB(DCPCtrlXfer.DeviceRequest.wValue);

	if( DIR_D2H != DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir)
	{
		Chap9sup_StallEP0InControlRead();
		return;
	}

	switch(bDescriptor)
	{
	case USB_DEVICE_DESCRIPTOR_TYPE:
		Chap9sup_BurstTransmitEP0((PUSHORT)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
		break;
	case USB_CONFIGURATION_DESCRIPTOR_TYPE:
		Chap9sup_BurstTransmitEP0((PUSHORT)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
		break;
	case USB_STRING_DESCRIPTOR_TYPE:
		switch(bDescriptorIndex)
		{
		case STR_INDEX_LANGUAGE:
			Chap9sup_BurstTransmitEP0((PUSHORT)&strLanguage, sizeof(USB_STRING_LANGUAGE_DESCRIPTOR));
			break;
		case STR_INDEX_MANUFACTURER:
			Chap9sup_BurstTransmitEP0((PUSHORT)&strManufacturer, sizeof(USB_STRING_MANUFACTURER_DESCRIPTOR));
			break;
		case STR_INDEX_PRODUCT:
			Chap9sup_BurstTransmitEP0((PUSHORT)&strProduct, sizeof(USB_STRING_PRODUCT_DESCRIPTOR));
			break;
		case STR_INDEX_SERIALNUMBER:
			Chap9sup_BurstTransmitEP0((PUSHORT)&ConfigDescr, sizeof(CONFIG_DESCRIPTOR_LENGTH));
			break;
		case STR_INDEX_CONFIGURATION:
			Chap9sup_BurstTransmitEP0((PUSHORT)&strConfiguration, sizeof(USB_STRING_CONFIGURATION_DESCRIPTOR) );
			break;
		case STR_INDEX_INTERFACE:
			Chap9sup_BurstTransmitEP0((PUSHORT)&strInterface, sizeof(USB_STRING_INTERFACE_DESCRIPTOR) );
			break;
		default:
			Chap9sup_StallEP0InControlRead();
			break;
		}
		break;
	case USB_INTERFACE_DESCRIPTOR_TYPE:
	case USB_ENDPOINT_DESCRIPTOR_TYPE:
	case USB_POWER_DESCRIPTOR_TYPE:
	case USB_OTG_DESCRIPTOR_TYPE:
		Chap9sup_SingleTransmitEP0((PUSHORT)&OTG_Descr, sizeof(USB_OTG_DESCRIPTOR));
		break;
	default:
		Chap9sup_StallEP0InControlRead();
		break;
	}
}

void Chap9_GetConfiguration(void)
{
	if (DIR_D2H == DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir && \
		0 == DCPCtrlXfer.DeviceRequest.wValue && \
		0 == DCPCtrlXfer.DeviceRequest.wIndex  && \
		1 == DCPCtrlXfer.DeviceRequest.wLength )
	{
		Chap9sup_SingleTransmitEP0((PUSHORT)&D13_DevInfo.bits.CnfigNo, 1);
	}
	else
		Chap9sup_StallEP0InControlRead();

}

void Chap9_SetConfiguration(void)
{

	if( DIR_H2D == DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir && \
		0 == DCPCtrlXfer.DeviceRequest.wIndex && \
		0 == DCPCtrlXfer.DeviceRequest.wLength)
	{
		switch(DCPCtrlXfer.DeviceRequest.wValue) 
		{
		case 0:
			/* put device in unconfigured state */
			D13_DevInfo.bits.CnfigNo = 0; /* This flag should be set before Unconfig and Config */
			D13_DevInfo.bits.DevState = DEVSTATE_ADDRESS;
			DcS_UnconfigDevice();
			/*
			// Minimize the MISSING Window for SETUP Packet
			// Here give a chance to ISR whose interrupt is caused by Setup Packet
			*/
			Chap9sup_SingleTransmitEP0(0, 0);
			break;
		case 1:
			/* Configure device */
			D13_DevInfo.bits.CnfigNo = 1; /* This flag should be set before Unconfig and Config */
			D13_DevInfo.bits.DevState = DEVSTATE_CONFIGURED;
			DcS_UnconfigDevice();
			DcS_ConfigDevice();
			/*
			// Minimize the MISSING Window for SETUP Packet
			// Here give a chance to ISR whose interrupt is caused by Setup Packet
			*/
			Chap9sup_SingleTransmitEP0(0, 0);
			break;
		default:
			Chap9sup_StallEP0InControlWrite();
		}
	}
	else
	{
		Chap9sup_StallEP0InControlWrite();
	}
}

void Chap9_GetInterface(void)
{
	UCHAR	byTemp = 0;
	if (DIR_D2H == DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir && \
		0 == DCPCtrlXfer.DeviceRequest.wValue && \
		0 == DCPCtrlXfer.DeviceRequest.wIndex && \
		1 == DCPCtrlXfer.DeviceRequest.wLength && \
		DEVSTATE_CONFIGURED == D13_DevInfo.bits.DevState)
	{
		Chap9sup_SingleTransmitEP0((PUSHORT)&byTemp, 1);
	}
	else
	{
		Chap9sup_StallEP0InControlRead();
	}

}

void Chap9_SetInterface(void)
{
	if (DIR_H2D == DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir && \
		DEVSTATE_CONFIGURED == D13_DevInfo.bits.DevState)
	{
		if(	0 == DCPCtrlXfer.DeviceRequest.wValue && \
			0 == DCPCtrlXfer.DeviceRequest.wIndex )
		{
			Chap9sup_SingleTransmitEP0(0,0);
		}
		else
		{
			Chap9sup_StallEP0InControlWrite();
		}
	}
	else
	{
		Chap9sup_StallEP0InControlWrite();
	}

}

/*
   //*************************************************************************
   // Chap9 support functions
   //*************************************************************************
*/
void Chap9sup_StallEP0(void)
{
	if(DCPCtrlXfer.DeviceRequest.bmRequestType.XferDir)
	{
		DcS_StallEP0InControlRead();
	}
	else
	{
		DcS_StallEP0InControlWrite();
	}

	RaiseIRQL();
	if(!DCPCtrlXfer.bAbort)
	{
		DCPCtrlXfer.FSMState = USBFSM4DCP_STALL;
	}
	LowerIRQL();
}

void Chap9sup_StallEP0InControlWrite(void)
{
	DcS_StallEP0InControlWrite();

	RaiseIRQL();
	if(!DCPCtrlXfer.bAbort)
	{
		DCPCtrlXfer.FSMState = USBFSM4DCP_STALL;
	}
	LowerIRQL();
}

void Chap9sup_StallEP0InControlRead(void)
{
	DcS_StallEP0InControlRead();
	RaiseIRQL();
	if(!DCPCtrlXfer.bAbort)
	{
		DCPCtrlXfer.FSMState = USBFSM4DCP_STALL;
	}
	LowerIRQL();
}

void Chap9sup_SingleTransmitEP0(PUSHORT ptrBuf, USHORT wLength)
{

	DcS_SingleTransmitEP0(ptrBuf, wLength);

	RaiseIRQL();
	if(!DCPCtrlXfer.bAbort)
	{
		DCPCtrlXfer.wLength = DCPCtrlXfer.wCount = wLength;
		DCPCtrlXfer.FSMState = USBFSM4DCP_HANDSHAKE;
	}
	LowerIRQL();
}

void Chap9sup_BurstTransmitEP0(PUSHORT pData, USHORT wLength)
{
	DCPCtrlXfer.wCount = 0;
	if(DCPCtrlXfer.wLength > wLength)
		DCPCtrlXfer.wLength = wLength;

	DCPCtrlXfer.ptrBuf = pData;

	if( DCPCtrlXfer.wLength >= EP0_PACKET_SIZE)
	{
		D13_WriteEndpoint(EPINDEX4EP0_CONTROL_IN, DCPCtrlXfer.ptrBuf, EP0_PACKET_SIZE);
		/*
		//	Minimize the MISSING Window for SETUP Packet
		// Here give a chance to ISR whose interrupt is caused by Setup Packet
		*/
		RaiseIRQL();
		if(!DCPCtrlXfer.bAbort)
		{
			DCPCtrlXfer.wCount += EP0_PACKET_SIZE;
			DCPCtrlXfer.FSMState = USBFSM4DCP_DATAIN;
		}
		LowerIRQL();
	}
	else
	{
		D13_WriteEndpoint(EPINDEX4EP0_CONTROL_IN, DCPCtrlXfer.ptrBuf, DCPCtrlXfer.wLength);
		/*
		// Minimize the MISSING Window for SETUP Packet
		// Here give a chance to ISR whose interrupt is caused by Setup Packet
		*/
		RaiseIRQL();
		if(!DCPCtrlXfer.bAbort)
		{
			DCPCtrlXfer.wCount += DCPCtrlXfer.wLength;
			DCPCtrlXfer.FSMState = USBFSM4DCP_HANDSHAKE;
		}
		LowerIRQL();
	}
}

⌨️ 快捷键说明

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