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

📄 otg_dev.c

📁 s3c6410基于USB OTG下载内核至NORFLASH的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:

				uRemainCnt = oOtgDev.m_uDownloadFileSize - ((u32)oOtgDev.m_pDownPt - oOtgDev.m_uDownloadAddress + 8);
				
				if (uRemainCnt>0) 
				{
					u32 uPktCnt, uRemainder;
					uPktCnt = (u32)(uRemainCnt/oOtgDev.m_uBulkOutEPMaxPktSize);
					uRemainder = (u32)(uRemainCnt%oOtgDev.m_uBulkOutEPMaxPktSize);
					if(uRemainder != 0)
					{
						uPktCnt += 1;
					}
					DbgUsb("uRemainCnt : %d \n", uRemainCnt);
					if (uPktCnt> 1023)
					{
						OTGDEV_SetOutEpXferSize(EP_TYPE_BULK, 1023, (oOtgDev.m_uBulkOutEPMaxPktSize*1023));
					}
					else
					{
						OTGDEV_SetOutEpXferSize(EP_TYPE_BULK, uPktCnt, uRemainCnt);
					}
					Outp32(bulkOut_DOEPCTL, 1u<<31|1<<26|2<<18|1<<15|oOtgDev.m_uBulkOutEPMaxPktSize<<0);		//ep3 enable, clear nak, bulk, usb active, next ep3, max pkt 64
				}
				else
				{
					DbgUsb("DMA OUT : Transfer Complete\n");
				}
			}
		}
	}
}

//////////
// Function Name : OTGDEV_HandleEvent_EP0
// Function Desctiption : This function is called when Setup packet is received.
// Input : NONE
// Output : NONE
// Version :
#define TEST_PKT_SIZE 53

u8 TestPkt [TEST_PKT_SIZE] = {
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,					//JKJKJKJK x 9
    0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,						//JJKKJJKK x 8
    0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,						//JJJJKKKK x 8
    0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,	//JJJJJJJKKKKKKK x8 - '1'
    0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,								//'1' + JJJJJJJK x 8
    0xFC,0x7E,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0x7E					//{JKKKKKKK x 10},JK
};
void OTGDEV_HandleEvent_EP0(void)
{
	u16 i;
	u32 ReadBuf[64]={0x0000, };
	u16 setaddress;
	u32 uRemoteWakeUp=false;
	
	for(i=0;i<2;i++)
	{
		ReadBuf[i] = Inp32(EP0_FIFO);
	}

	oOtgDev.m_oDeviceRequest.bmRequestType=ReadBuf[0];
	oOtgDev.m_oDeviceRequest.bRequest=ReadBuf[0]>>8;
	oOtgDev.m_oDeviceRequest.wValue_L=ReadBuf[0]>>16;
	oOtgDev.m_oDeviceRequest.wValue_H=ReadBuf[0]>>24;
	oOtgDev.m_oDeviceRequest.wIndex_L=ReadBuf[1];
	oOtgDev.m_oDeviceRequest.wIndex_H=ReadBuf[1]>>8;
	oOtgDev.m_oDeviceRequest.wLength_L=ReadBuf[1]>>16;
	oOtgDev.m_oDeviceRequest.wLength_H=ReadBuf[1]>>24;

	OTGDEV_PrintEp0Pkt((u8 *)&oOtgDev.m_oDeviceRequest, 8);

	switch (oOtgDev.m_oDeviceRequest.bRequest)
	{
		case STANDARD_SET_ADDRESS:
			setaddress = (oOtgDev.m_oDeviceRequest.wValue_L); // Set Address Update bit
			Outp32(DCFG, 1<<18|setaddress<<4|oOtgDev.m_eSpeed<<0);
			DbgUsb("\n MCU >> Set Address : %d \n", setaddress);
			oOtgDev.m_uEp0State = EP0_STATE_INIT;
			break;

		case STANDARD_SET_DESCRIPTOR:
			DbgUsb("\n MCU >> Set Descriptor \n");
			break;

		case STANDARD_SET_CONFIGURATION:
			DbgUsb("\n MCU >> Set Configuration \n");
			g_usConfig = oOtgDev.m_oDeviceRequest.wValue_L; // Configuration value in configuration descriptor
			oOtgDev.m_uIsUsbOtgSetConfiguration = 1;
			oOtgDev.m_uEp0State = EP0_STATE_INIT;
			break;

		case STANDARD_GET_CONFIGURATION:
			oOtgDev.m_uEp0State = EP0_STATE_CONFIGURATION_GET;
			break;

		case STANDARD_GET_DESCRIPTOR:
			switch (oOtgDev.m_oDeviceRequest.wValue_H)
			{
				case DEVICE_DESCRIPTOR:
					oOtgDev.m_uDeviceRequestLength = (u32)((oOtgDev.m_oDeviceRequest.wLength_H << 8) |
						oOtgDev.m_oDeviceRequest.wLength_L);
					DbgUsb("\n MCU >> Get Device Descriptor = 0x%x \n",oOtgDev.m_uDeviceRequestLength);
					oOtgDev.m_uEp0State = EP0_STATE_GD_DEV_0;
					break;

				case CONFIGURATION_DESCRIPTOR:
					oOtgDev.m_uDeviceRequestLength = (u32)((oOtgDev.m_oDeviceRequest.wLength_H << 8) |
						oOtgDev.m_oDeviceRequest.wLength_L);
					DbgUsb("\n MCU >> Get Configuration Descriptor = 0x%x \n",oOtgDev.m_uDeviceRequestLength);

					if (oOtgDev.m_uDeviceRequestLength > CONFIG_DESC_SIZE){
					// === GET_DESCRIPTOR:CONFIGURATION+INTERFACE+ENDPOINT0+ENDPOINT1 ===
					// Windows98 gets these 4 descriptors all together by issuing only a request.
					// Windows2000 gets each descriptor seperately.
					// oOtgDev.m_uEpZeroTransferLength = CONFIG_DESC_TOTAL_SIZE;
						oOtgDev.m_uEp0State = EP0_STATE_GD_CFG_0;
					}
					else
						oOtgDev.m_uEp0State = EP0_STATE_GD_CFG_ONLY_0; // for win2k
					break;

				case STRING_DESCRIPTOR :
					DbgUsb("\n MCU >> Get String Descriptor \n");
					switch(oOtgDev.m_oDeviceRequest.wValue_L)
					{
						case 0:
							oOtgDev.m_uEp0State = EP0_STATE_GD_STR_I0;
							break;
						case 1:
							oOtgDev.m_uEp0State = EP0_STATE_GD_STR_I1;
							break;
						case 2:
							oOtgDev.m_uEp0State = EP0_STATE_GD_STR_I2;
							break;
						default:
								break;
					}
					break;
				case ENDPOINT_DESCRIPTOR:
					DbgUsb("\n MCU >> Get Endpoint Descriptor \n");
					switch(oOtgDev.m_oDeviceRequest.wValue_L&0xf)
					{
					case 0:
						oOtgDev.m_uEp0State=EP0_STATE_GD_EP0_ONLY_0;
						break;
					case 1:
						oOtgDev.m_uEp0State=EP0_STATE_GD_EP1_ONLY_0;
						break;
					default:
						break;
					}
					break;

				case DEVICE_QUALIFIER:
					oOtgDev.m_uDeviceRequestLength = (u32)((oOtgDev.m_oDeviceRequest.wLength_H << 8) |
						oOtgDev.m_oDeviceRequest.wLength_L);
					DbgUsb("\n MCU >> Get Device Qualifier Descriptor = 0x%x \n",oOtgDev.m_uDeviceRequestLength);
					oOtgDev.m_uEp0State = EP0_STATE_GD_DEV_QUALIFIER;
					break;
					
			   	case OTHER_SPEED_CONFIGURATION :
					DbgUsb(("\n MCU >> Get OTHER_SPEED_CONFIGURATION \n"));
					oOtgDev.m_uDeviceRequestLength = (u32)((oOtgDev.m_oDeviceRequest.wLength_H << 8) |
						oOtgDev.m_oDeviceRequest.wLength_L);
					oOtgDev.m_uEp0State = EP0_STATE_GD_OTHER_SPEED;
					break;
					
			}
			break;

		case STANDARD_CLEAR_FEATURE:
			DbgUsb("\n MCU >> Clear Feature \n");
			switch (oOtgDev.m_oDeviceRequest.bmRequestType)
			{
				case DEVICE_RECIPIENT:
					if (oOtgDev.m_oDeviceRequest.wValue_L == 1)
						uRemoteWakeUp = false;
					break;

				case ENDPOINT_RECIPIENT:
					if (oOtgDev.m_oDeviceRequest.wValue_L == 0)
					{
						if ((oOtgDev.m_oDeviceRequest.wIndex_L & 0x7f) == CONTROL_EP)
							oStatusGet.EndpointCtrl= 0;

						if ((oOtgDev.m_oDeviceRequest.wIndex_L & 0x7f) == BULK_IN_EP) // IN  Endpoint
							oStatusGet.EndpointIn= 0;

						if ((oOtgDev.m_oDeviceRequest.wIndex_L & 0x7f) == BULK_OUT_EP) // OUT Endpoint
							oStatusGet.EndpointOut= 0;
					}
					break;

				default:
					break;
			}
			oOtgDev.m_uEp0State = EP0_STATE_INIT;
			break;

		case STANDARD_SET_FEATURE:
			DbgUsb("\n MCU >> Set Feature \n");
			switch (oOtgDev.m_oDeviceRequest.bmRequestType)
			{
				case DEVICE_RECIPIENT:
					if (oOtgDev.m_oDeviceRequest.wValue_L == 1)
						uRemoteWakeUp = true;
						break;

				case ENDPOINT_RECIPIENT:
					if (oOtgDev.m_oDeviceRequest.wValue_L == 0)
					{
						if ((oOtgDev.m_oDeviceRequest.wIndex_L & 0x7f) == CONTROL_EP)
							oStatusGet.EndpointCtrl= 1;

						if ((oOtgDev.m_oDeviceRequest.wIndex_L & 0x7f) == BULK_IN_EP)
							oStatusGet.EndpointIn= 1;

						if ((oOtgDev.m_oDeviceRequest.wIndex_L & 0x7f) == BULK_OUT_EP)
							oStatusGet.EndpointOut= 1;
					}
					break;

				default:
					break;
			}

			//=======================================================
			
			switch (oOtgDev.m_oDeviceRequest.wValue_L) {

				case EP_STALL:
					// TBD: additional processing if required
					break;

				
				case TEST_MODE:						
					if ((0 != oOtgDev.m_oDeviceRequest.wIndex_L ) ||(0 != oOtgDev.m_oDeviceRequest.bmRequestType)) 
						break;

					oOtgDev.m_uEp0State = EP0_STATE_TEST_MODE;

					break;

				default:
					oOtgDev.m_uEp0State = EP0_STATE_INIT;
					break;
			}
			//=======================================================
			break;

		case STANDARD_GET_STATUS:
			switch(oOtgDev.m_oDeviceRequest.bmRequestType)
			{
				case  (0x80):	//device
					oStatusGet.Device=((u8)uRemoteWakeUp<<1)|0x1;		// SelfPowered
					oOtgDev.m_uEp0State = EP0_STATE_GET_STATUS0;
					break;

				case  (0x81):	//interface
					oStatusGet.Interface=0;
					oOtgDev.m_uEp0State = EP0_STATE_GET_STATUS1;
					break;

				case  (0x82):	//endpoint
					if ((oOtgDev.m_oDeviceRequest.wIndex_L & 0x7f) == CONTROL_EP)
						oOtgDev.m_uEp0State = EP0_STATE_GET_STATUS2;

					if ((oOtgDev.m_oDeviceRequest.wIndex_L & 0x7f) == BULK_IN_EP)
						oOtgDev.m_uEp0State = EP0_STATE_GET_STATUS3;

					if ((oOtgDev.m_oDeviceRequest.wIndex_L & 0x7f) == BULK_OUT_EP)
						oOtgDev.m_uEp0State = EP0_STATE_GET_STATUS4;
					break;

				default:
					break;
			}
			break;

		case STANDARD_GET_INTERFACE:
			oOtgDev.m_uEp0State = EP0_STATE_INTERFACE_GET;
			break;

		case STANDARD_SET_INTERFACE:
			oInterfaceGet.AlternateSetting= oOtgDev.m_oDeviceRequest.wValue_L;
			oOtgDev.m_uEp0State = EP0_STATE_INIT;
			break;

		case STANDARD_SYNCH_FRAME:
			oOtgDev.m_uEp0State = EP0_STATE_INIT;
			break;

		default:
			break;
	}
	
	OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, oOtgDev.m_uControlEPMaxPktSize);
	
	Outp32(DIEPCTL0, ((1<<26)|(CONTROL_EP<<11)|(0<<0)));	//clear nak, next ep0, 64byte
		
}

//////////
// Function Name : OTGDEV_TransferEp0
// Function Desctiption : This function is called during data phase of control transfer.
// Input : NONE
// Output : NONE
// Version :
void OTGDEV_TransferEp0(void)
{

	DbgUsb("TransferEp0 , oOtgDev.m_uEp0State == %d\n", oOtgDev.m_uEp0State);

	switch (oOtgDev.m_uEp0State)
	{
		case EP0_STATE_INIT:
			OTGDEV_SetInEpXferSize(EP_TYPE_CONTROL, 1, 0);
			Outp32(DIEPCTL0, (1u<<31)|(1<<26)|(BULK_IN_EP<<11)|(0<<0));	//ep0 enable, clear nak, next ep0, 64byte
			DbgUsb("EndpointZeroTransfer(EP0_STATE_INIT)\n");
			break;

		// === GET_DESCRIPTOR:DEVICE ===
		case EP0_STATE_GD_DEV_0:
			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");
			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_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");
			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, 64byte
				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, 64byte
				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;	

		// === GET_DESCRIPTOR:CONFIGURATION ONLY===
		case EP0_STATE_GD_CFG_ONLY_0:
			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
			}

⌨️ 快捷键说明

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