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

📄 kitlusbser.c

📁 SMDK2416_BSP
💻 C
📖 第 1 页 / 共 4 页
字号:
				Outp32(BYTE_WRITE_CNT_REG, 8);
						WrPktEp0((UINT8 *)&g_oDescDevice+0, 8); // EP0_PKT_SIZE
						g_uEp0State = EP0_STATE_GD_DEV_1;
				//KITLOutputDebugString("EndpointZeroTransfer(EP0_STATE_GD_DEV_0)\n");
			}
			break;

		case EP0_STATE_GD_DEV_1:
			Outp32(BYTE_WRITE_CNT_REG, 8);
					WrPktEp0((UINT8 *)&g_oDescDevice+8, 8); // EP0_PKT_SIZE
					g_uEp0State = EP0_STATE_GD_DEV_2;
			//KITLOutputDebugString("EndpointZeroTransfer(EP0_STATE_GD_DEV_1)\n");
			break;

		case EP0_STATE_GD_DEV_2:
			Outp32(BYTE_WRITE_CNT_REG, 2);
					WrPktEp0((UINT8 *)&g_oDescDevice+16, 2); // EP0_PKT_SIZE
					g_uEp0State = EP0_STATE_INIT;
			//KITLOutputDebugString("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 (g_eSpeed == 1)
			{
				Outp32(BYTE_WRITE_CNT_REG, 32);
				WrPktEp0((UINT8 *)&oDesc.oDescConfig+0, 32); // EP0_PKT_SIZE
				g_uEp0State = EP0_STATE_INIT;
				//KITLOutputDebugString("EndpointZeroTransfer(EP0_STATE_GD_CFG) : 32\n");
			}
			else
			{
				Outp32(BYTE_WRITE_CNT_REG, 8);
				WrPktEp0((UINT8 *)&oDesc.oDescConfig+0, 8); // EP0_PKT_SIZE
				g_uEp0State = EP0_STATE_GD_CFG_1;
				//KITLOutputDebugString("EndpointZeroTransfer(EP0_STATE_GD_CFG_0) : 8\n");
			}
			break;

		case EP0_STATE_GD_CFG_1:
			Outp32(BYTE_WRITE_CNT_REG, 8);
			WrPktEp0((UINT8 *)&oDesc.oDescConfig+8, 8); // EP0_PKT_SIZE	WrPktEp0((UINT8 *)&descConf+8, 1); WrPktEp0((UINT8 *)&descIf+0, 7);
			g_uEp0State = EP0_STATE_GD_CFG_2;
			break;

		case EP0_STATE_GD_CFG_2:
			Outp32(BYTE_WRITE_CNT_REG, 8);
			WrPktEp0((UINT8 *)&oDesc.oDescConfig+16, 8); // EP0_PKT_SIZE	WrPktEp0((UINT8 *)&descIf+7, 2); WrPktEp0((UINT8 *)&descEndpt0+0, 6);
			g_uEp0State = EP0_STATE_GD_CFG_3;
			break;

		case EP0_STATE_GD_CFG_3:
			Outp32(BYTE_WRITE_CNT_REG, 8);
			WrPktEp0((UINT8 *)&oDesc.oDescConfig+24, 8); // EP0_PKT_SIZE	WrPktEp0((UINT8 *)&descEndpt0+6, 1); WrPktEp0((UINT8 *)&descEndpt1+0, 7);
			g_uEp0State = EP0_STATE_GD_CFG_4;
			break;

		case EP0_STATE_GD_CFG_4:
			Outp32(BYTE_WRITE_CNT_REG, 0);
			g_uEp0State = EP0_STATE_INIT;
			break;

		// === GET_DESCRIPTOR:CONFIGURATION ONLY===
		case EP0_STATE_GD_CFG_ONLY_0:
			if (g_eSpeed == 1)
			{
				//KITLOutputDebugString("[DBG : EP0_STATE_GD_CFG_ONLY] : 9\n");
				Outp32(BYTE_WRITE_CNT_REG, 9);
				WrPktEp0((UINT8 *)&oDesc.oDescConfig+0, 9); // EP0_PKT_SIZE
				g_uEp0State = EP0_STATE_INIT;
			}
			else
			{
				//KITLOutputDebugString("[DBG : EP0_STATE_GD_CFG_ONLY_0] : 8\n");
				Outp32(BYTE_WRITE_CNT_REG, 8);
				WrPktEp0((UINT8 *)&oDesc.oDescConfig+0, 8); // EP0_PKT_SIZE
				g_uEp0State = EP0_STATE_GD_CFG_ONLY_1;
			}
			break;

		case EP0_STATE_GD_CFG_ONLY_1:
			//KITLOutputDebugString("[DBG : EP0_STATE_GD_CFG_ONLY_1]\n");
			Outp32(BYTE_WRITE_CNT_REG, 1);
			WrPktEp0((UINT8 *)&oDesc.oDescConfig+8, 1); // EP0_PKT_SIZE
			g_uEp0State = EP0_STATE_INIT;
			break;

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

		case EP0_STATE_GD_IF_ONLY_0:
			if (g_eSpeed == 1)
			{
				Outp32(BYTE_WRITE_CNT_REG, 9);				// INTERFACE_DESC_SIZE
				WrPktEp0((UINT8 *)&oDesc.oDescInterface+0, 9);
				g_uEp0State = EP0_STATE_INIT;
			}
			else
			{
				Outp32(BYTE_WRITE_CNT_REG, 8);				// INTERFACE_DESC_SIZE
				WrPktEp0((UINT8 *)&oDesc.oDescInterface+0, 8);
				g_uEp0State = EP0_STATE_GD_IF_ONLY_1;
			}
			break;

		case EP0_STATE_GD_IF_ONLY_1:
			Outp32(BYTE_WRITE_CNT_REG, 1);
			WrPktEp0((UINT8 *)&oDesc.oDescInterface+8, 1);
			g_uEp0State = EP0_STATE_INIT;
			break;


		// === GET_DESCRIPTOR:ENDPOINT 1 ONLY===
		case EP0_STATE_GD_EP0_ONLY_0:
			Outp32(BYTE_WRITE_CNT_REG, ENDPOINT_DESC_SIZE);
			Inp32(SYS_STATUS_REG, usSysStatus);
			WrPktEp0((UINT8 *)&oDesc.oDescEndpt1+0, ENDPOINT_DESC_SIZE);
			g_uEp0State = EP0_STATE_INIT;
			break;

		// === GET_DESCRIPTOR:ENDPOINT 2 ONLY===
		case EP0_STATE_GD_EP1_ONLY_0:
			Outp32(BYTE_WRITE_CNT_REG, ENDPOINT_DESC_SIZE);
			Inp32(SYS_STATUS_REG, usSysStatus);
			WrPktEp0((UINT8 *)&oDesc.oDescEndpt3+0, ENDPOINT_DESC_SIZE);
			g_uEp0State = EP0_STATE_INIT;
			break;

				// === GET_DESCRIPTOR:STRING ===
		case EP0_STATE_GD_STR_I0:
			Outp32(BYTE_WRITE_CNT_REG, 4);
			//KITLOutputDebugString("[GDS0_0]");
			WrPktEp0((UINT8 *)aDescStr0, 4);
			g_uEp0State = EP0_STATE_INIT;
			break;

		case EP0_STATE_GD_STR_I1:
			//KITLOutputDebugString("[GDS1_%d]", g_uEp0SubState);
			if ((g_uEp0SubState*g_uEp0MaxPktSize+g_uEp0MaxPktSize)<sizeof(aDescStr1))
			{
				Outp32(BYTE_WRITE_CNT_REG, g_uEp0MaxPktSize);
				WrPktEp0((UINT8 *)aDescStr1+(g_uEp0SubState*g_uEp0MaxPktSize), g_uEp0MaxPktSize);
				g_uEp0State = EP0_STATE_GD_STR_I1;
				g_uEp0SubState++;
			}
			else
			{
				Outp32(BYTE_WRITE_CNT_REG, sizeof(aDescStr1)-(g_uEp0SubState*g_uEp0MaxPktSize));
				WrPktEp0((UINT8 *)aDescStr1+(g_uEp0SubState*g_uEp0MaxPktSize), sizeof(aDescStr1)-(g_uEp0SubState*g_uEp0MaxPktSize));
				g_uEp0State = EP0_STATE_INIT;
				g_uEp0SubState = 0;
			}
			break;

		case EP0_STATE_GD_STR_I2:
			//KITLOutputDebugString("[GDS2_%d]", g_uEp0SubState);
			if ((g_uEp0SubState*g_uEp0MaxPktSize+g_uEp0MaxPktSize)<sizeof(aDescStr2))
			{
				Outp32(BYTE_WRITE_CNT_REG, g_uEp0MaxPktSize);
				WrPktEp0((UINT8 *)aDescStr2+(g_uEp0SubState*g_uEp0MaxPktSize), g_uEp0MaxPktSize);
				g_uEp0State = EP0_STATE_GD_STR_I2;
				g_uEp0SubState++;
			}
			else
			{
				//KITLOutputDebugString("[E]");
				Outp32(BYTE_WRITE_CNT_REG, sizeof(aDescStr2)-(g_uEp0SubState*g_uEp0MaxPktSize));
				WrPktEp0((UINT8 *)aDescStr2+(g_uEp0SubState*g_uEp0MaxPktSize), sizeof(aDescStr2)-(g_uEp0SubState*g_uEp0MaxPktSize));
				g_uEp0State = EP0_STATE_INIT;
				g_uEp0SubState = 0;
			}
			break;

		case EP0_STATE_GD_DEV_QUALIFIER:
			Outp32(BYTE_WRITE_CNT_REG, 10);
			WrPktEp0((UINT8 *)aDeviceQualifierDescriptor+0, 10);
			g_uEp0State = EP0_STATE_INIT;
			break;

		case EP0_INTERFACE_GET:
			Outp32(BYTE_WRITE_CNT_REG, 1);
			WrPktEp0((UINT8 *)&oInterfaceGet+0, 1);
			g_uEp0State = EP0_STATE_INIT;
			break;


		case EP0_GET_STATUS0:
			Outp32(BYTE_WRITE_CNT_REG, 1);
			WrPktEp0((UINT8 *)&oStatusGet+0, 1);
			g_uEp0State = EP0_STATE_INIT;
			break;

		case EP0_GET_STATUS1:
			Outp32(BYTE_WRITE_CNT_REG, 1);
			WrPktEp0((UINT8 *)&oStatusGet+1, 1);
			g_uEp0State = EP0_STATE_INIT;
			break;

		case EP0_GET_STATUS2:
			Outp32(BYTE_WRITE_CNT_REG, 1);
			WrPktEp0((UINT8 *)&oStatusGet+2, 1);
			g_uEp0State = EP0_STATE_INIT;
			break;

		case EP0_GET_STATUS3:
			Outp32(BYTE_WRITE_CNT_REG, 1);
			WrPktEp0((UINT8 *)&oStatusGet+3, 1);
			g_uEp0State = EP0_STATE_INIT;
			break;

		case EP0_GET_STATUS4:
			Outp32(BYTE_WRITE_CNT_REG, 1);
			WrPktEp0((UINT8 *)&oStatusGet+4, 1);
			g_uEp0State = EP0_STATE_INIT;
			break;

		default:
			break;

	}

		//KITLOutputDebugString ("[-]TransferEp0\n");
}


void HandleEvent_EP0(void)
{
	UINT32 DeviceRequestLength;
	UINT16 ep0csr;
	UINT16 ReadCnt, i;
	UINT16 ReadBuf[64]={0x0000, };
	UINT8  setaddress;
	UINT32  uRemoteWakeUp=0;
	UINT16  usConfig=0;


	
	Outp32(INDEX_REG, EP0);
	Inp32(EP0_STATUS_REG, ep0csr);

	//KITLOutputDebugString ("[+]HandleEvent_EP0 : %x\n",ep0csr);


	
		
	// EP0 CSR register status check

	if (ep0csr & EP0_SENT_STALL) // SENT STALL : protocol stall.
	{
		//KITLOutputDebugString(" Sent Stall \n");
		Outp32(EP0_STATUS_REG, EP0_SENT_STALL);
		if (ep0csr & EP0_RX_SUCCESS)
			Outp32(EP0_STATUS_REG, EP0_RX_SUCCESS);
		g_uEp0State = EP0_STATE_INIT;
		return;
	}

	if (ep0csr & EP0_TX_SUCCESS)
	{
		//KITLOutputDebugString(" EP0_TX_SUCCESS \n");
		Outp32(EP0_STATUS_REG, EP0_TX_SUCCESS);
	}


// 	if ((ep0csr & EP0_RX_SUCCESS) & (g_uEp0State == EP0_STATE_INIT))
	if (g_uEp0State == EP0_STATE_INIT)
	{
		Inp32(BYTE_READ_CNT_REG, ReadCnt);
		
		for(i=0;i<4;i++) Inp32(EP0_FIFO, ReadBuf[i]);

		//KITLOutputDebugString("ReadCnt : %d\n",ReadCnt);

		Outp32(EP0_STATUS_REG, EP0_RX_SUCCESS);

		g_oDeviceRequest.bmRequestType=(UINT8)ReadBuf[0];
		g_oDeviceRequest.bRequest=ReadBuf[0]>>8;
		g_oDeviceRequest.wValue_L=(UINT8)ReadBuf[1];
		g_oDeviceRequest.wValue_H=ReadBuf[1]>>8;
		g_oDeviceRequest.wIndex_L=(UINT8)ReadBuf[2];
		g_oDeviceRequest.wIndex_H=ReadBuf[2]>>8;
		g_oDeviceRequest.wLength_L=(UINT8)ReadBuf[3];
		g_oDeviceRequest.wLength_H=ReadBuf[3]>>8;

//		PrintEp0Pkt((UINT8 *)&g_oDeviceRequest, 8);
//////////////////////////////////////////


       /* Decode and execute the command. We support two sets of commands, vendor
         * specific (modem control) and chapter 9 standard commands.
         */
        if (g_oDeviceRequest.bmRequestType & 0x60 )
        { 

/*		
		
        KITLOutputDebugString("readcnt : %d,bmRequest: %x bRequest: %x wValue: %x wIndex: %x wLength: %x\n", 
		ReadCnt,
		g_oDeviceRequest.bmRequestType,
                       g_oDeviceRequest.bRequest,
                       g_oDeviceRequest.wValue_L,
                       g_oDeviceRequest.wIndex_L,
                       g_oDeviceRequest.wLength_L);

		if(ReadCnt ==0) return;
		*/
        	// vendor or class command
        	//	//KITLOutputDebugString("Vendor/Class Command !!\n");
			//KITLOutputDebugString("Vendor/Class Command  : bmRequestType : %x!!\n",g_oDeviceRequest.bmRequestType);
			//KITLOutputDebugString("Vendor/Class Command  : bRequest : %x !!\n",g_oDeviceRequest.bRequest);
            switch ( g_oDeviceRequest.bRequest)
            {
                case ( SET_CONTROL_LINE_STATE ) :
                    {

                        /* Host is notifying us of control line state.
                         * wValue contains bitmask
                         * 0 - DTR
                         * 1 - RTS
                         */
                        //KITLOutputDebugString("SET_CONTROL_LINE_STATE,  H:%X,L:%X \r\n",g_oDeviceRequest.wValue_H, g_oDeviceRequest.wValue_L);

                        if ( g_oDeviceRequest.wValue_L & 0x01 )
                            USBSerInfo.dwModemStatus |= (MS_DSR_ON|MS_RLSD_ON); // DTR active, set DSR/RLSD
                        else
                            USBSerInfo.dwModemStatus &= ~(MS_DSR_ON|MS_RLSD_ON); // DTR clear, clr DSR/RLSD

                        if ( g_oDeviceRequest.wValue_L & 0x02 )
                            USBSerInfo.dwModemStatus |= MS_CTS_ON;   // RTS active, set CTS
                        else
                            USBSerInfo.dwModemStatus &= ~MS_CTS_ON;  // RTS clear, clear CTS

                        if (USBSerInfo.dwModemStatus != 0 )
                        {
                            USBSerInfo.dwState = KITLUSBSER_STATE_CONNECTED;
         			//KITLOutputDebugString("\n KITLUSBSER_STATE_CONNECTED \n"); 							
                        }
                        else
                        {
                            USBSerInfo.dwState = KITLUSBSER_STATE_CONFIGURED;
				//KITLOutputDebugString("\n KITLUSBSER_STATE_CONFIGURED \n"); 							
                        }

                    /* Command is complete
                     */
                  //  sendDone(0);
                    }
                    break;

                default:
				{
                        // Unknown vendor/class request
					//KITLOutputDebugString("Unknown vendor/class request %X\r\n",g_oDeviceRequest.bRequest);
				}
            }

            return;

        }

////////////////////////

///

		

		switch (g_oDeviceRequest.bRequest)
		{
			case STANDARD_SET_ADDRESS:
				setaddress = (g_oDeviceRequest.wValue_L); // Set Address Update bit
				//KITLOutputDebugString("Func_ADDR_Setaddr : %d \n", setaddress);
				g_uEp0State = EP0_STATE_INIT;
				break;

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

			case STANDARD_SET_CONFIGURATION:
				//KITLOutputDebugString("MCU >> Set Configuration \n");
				usConfig = g_oDeviceRequest.wValue_L; // Configuration value in configuration descriptor
				USBSerInfo.dwState = KITLUSBSER_STATE_CONFIGURED;		
	
				break;

			case STANDARD_GET_CONFIGURATION:
				//KITLOutputDebugString("MCU >> Get Configruation \n");
				Outp32(BYTE_WRITE_CNT_REG, 1);
				Outp32(EP0_FIFO, usConfig);
				m_uEnumerationDone = TRUE;
				break;

			case STANDARD_GET_DESCRIPTOR:
				switch (g_oDeviceRequest.wValue_H)
				{
					case DEVICE_DESCRIPTOR:
						//KITLOutputDebugString("MCU >> Get Device Descriptor \n");

						g_uEp0State = EP0_STATE_GD_DEV_0;
						break;

					case CONFIGURATION_DESCRIPTOR:
						//KITLOutputDebugString("MCU >> Get Configuration Descriptor \n");

						DeviceRequestLength = (UINT32)((g_oDeviceRequest.wLength_H << 8) |
							g_oDeviceRequest.wLength_L);

						if (DeviceRequestLength > 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.
						// m_uEpZeroTransferLength = CONFIG_DESC_TOTAL_SIZE;
// 							m_uEpZeroTransferdata = 0;
							g_uEp0State = EP0_STATE_GD_CFG_0;
						}
						else
							g_uEp0State = EP0_STATE_GD_CFG_ONLY_0; // for win2k
						break;

					case STRING_DESCRIPTOR :
						switch(g_oDeviceRequest.wValue_L)
						{
							case 0:
								g_uEp0State = EP0_STATE_GD_STR_I0;
								break;
							case 1:
								g_uEp0State = EP0_STATE_GD_STR_I1;
								break;
							case 2:
								g_uEp0State = EP0_STATE_GD_STR_I2;
								break;
							default:
									break;
						}
						break;
					case ENDPOINT_DESCRIPTOR:
						switch(g_oDeviceRequest.wValue_L&0xf)
						{
						case 0:
							g_uEp0State=EP0_STATE_GD_EP0_ONLY_0;
							break;
						case 1:
							g_uEp0State=EP0_STATE_GD_EP1_ONLY_0;
							break;
						default:

⌨️ 快捷键说明

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