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

📄 inthandler.c

📁 将s3c2410作为usb设备
💻 C
📖 第 1 页 / 共 2 页
字号:
	
			case GET_INTERFACE:																		//10
				CLR_EP0_OUT_PKT_RDY();
				ep0State=EP0_INTERFACE_GET;
				break;
	
			case GET_STATUS:			//读取状态请求											//0
				switch(descSetup.bmRequestType)		//分析特性
				{
					case  (0x80):
						CLR_EP0_OUT_PKT_RDY();
						StatusGet.Device=((U8)Rwuen<<1)|(U8)Selfpwr;
						ep0State=EP0_GET_STATUS0;
						break;
					case  (0x81):
						CLR_EP0_OUT_PKT_RDY();
						StatusGet.Interface=0;
						ep0State=EP0_GET_STATUS1;
						break;
			
					case  (0x82):
						CLR_EP0_OUT_PKT_RDY();
						if((descSetup.bIndexL & 0x7f) == 0x00){
							ep0State=EP0_GET_STATUS2;
						}
						if((descSetup.bIndexL & 0x8f) == 0x81){
							ep0State=EP0_GET_STATUS3;
						}
						if((descSetup.bIndexL & 0x8f) == 0x03){
							ep0State=EP0_GET_STATUS4;
						}
						break;
	
					default:
						break;
				}
				break;
	
			case SET_DESCRIPTOR:	//设置描述符请求										//7
				CLR_EP0_OUTPKTRDY_DATAEND();
				ep0State=EP0_STATE_INIT;
				break;
	
			case SET_FEATURE:		//设置特性请求											//3
				switch (descSetup.bmRequestType)
				{
					case DEVICE_RECIPIENT:								//0
						if (descSetup.bValueL == 1)
							Rwuen = TRUE;
						break;
	
					case ENDPOINT_RECIPIENT:							//2
						 if (descSetup.bValueL == 0)
						{
							if((descSetup.bIndexL & 0x7f) == 0x00){
								StatusGet.Endpoint0= 1;
							}
							if((descSetup.bIndexL & 0x8f) == 0x81){
								StatusGet.Endpoint1= 1;
							}
							if((descSetup.bIndexL & 0x8f) == 0x03){
								StatusGet.Endpoint3= 1;
							}
						}
						break;
	
					default:
						break;
				}
				CLR_EP0_OUTPKTRDY_DATAEND();
				ep0State=EP0_STATE_INIT;
				break;
	
	
			case SET_INTERFACE:																//11
				InterfaceGet.AlternateSetting= descSetup.bValueL;
				CLR_EP0_OUTPKTRDY_DATAEND(); 
				ep0State=EP0_STATE_INIT;
				break;
	
			case SYNCH_FRAME:																//12
				ep0State=EP0_STATE_INIT;
				break;
	
			default:
				//printk("[UE:SETUP=%x]",descSetup.bRequest);
				CLR_EP0_OUTPKTRDY_DATAEND(); //Because of no data control transfers.
				ep0State=EP0_STATE_INIT;
				break;
	    
		}
	}	//if
    
//	if(ep0State)
//		printk("[ep0State=%d]",ep0State);

   
	switch(ep0State)
	{	
		case EP0_STATE_INIT:																		//0
			break; 

	//=== GET_DESCRIPTOR:DEVICE ===获取设备描述符
		case EP0_STATE_GD_DEV_0:																	//10
			//printk("[GDD0]");
			WrPktEp0((U8 *)&descDev+0,8); //EP0_PKT_SIZE
			SET_EP0_IN_PKT_RDY();
			ep0State=EP0_STATE_GD_DEV_1;
			break;
		    
		case EP0_STATE_GD_DEV_1:																	//11
			//printk("[GDD1]");
			WrPktEp0((U8 *)&descDev+0x8,8); 
			SET_EP0_IN_PKT_RDY();

			ep0State=EP0_STATE_GD_DEV_2;
			break;
		
		case EP0_STATE_GD_DEV_2:																	//12
		    //printk("[GDD2]");
		    WrPktEp0((U8 *)&descDev+0x10,2);   //8+8+2=0x12
		    SET_EP0_INPKTRDY_DATAEND();
		    ep0State=EP0_STATE_INIT;
		    break;
    

        //=== GET_DESCRIPTOR:CONFIGURATION+INTERFACE+ENDPOINT0+ENDPOINT1 ===
        //Windows98 gets these 4 descriptors all together by issuing only a request.
        //Windows2000 gets each descriptor seperately.
		
		//获取配置,接口,端点0,端点1,4个描述符  在98中
		case EP0_STATE_GD_CFG_0:					//20
			//printk("[GDC_ALL_0]");
			WrPktEp0((U8 *)&descConf+0,8); //EP0_PKT_SIZE
			SET_EP0_IN_PKT_RDY();
			ep0State=EP0_STATE_GD_CFG_1;
			break;
			
		case EP0_STATE_GD_CFG_1:					//21
			//printk("[GDC_ALL_1]");
			WrPktEp0((U8 *)&descConf+8,1); 
			WrPktEp0((U8 *)&descIf+0,7); 
			SET_EP0_IN_PKT_RDY();
			ep0State=EP0_STATE_GD_CFG_2;
			break;
			
		case EP0_STATE_GD_CFG_2:
			//printk("[GDC_ALL_2]");
			WrPktEp0((U8 *)&descIf+7,2); 
			WrPktEp0((U8 *)&descEndpt0+0,6); 
			SET_EP0_IN_PKT_RDY();
			ep0State=EP0_STATE_GD_CFG_3;
			break;
			
		case EP0_STATE_GD_CFG_3:
			//printk("[GDC_ALL_3]");
			WrPktEp0((U8 *)&descEndpt0+6,1); 
			WrPktEp0((U8 *)&descEndpt1+0,7); 
			SET_EP0_IN_PKT_RDY();
			ep0State=EP0_STATE_GD_CFG_4;            
			break;
			
		case EP0_STATE_GD_CFG_4:
			//printk("[GDC_ALL_4]");
			 //zero length data packit 
			SET_EP0_INPKTRDY_DATAEND();
			ep0State=EP0_STATE_INIT;            
			break;
		
		
        //=== GET_DESCRIPTOR:CONFIGURATION ONLY===获取配置描述符
		case EP0_STATE_GD_CFG_ONLY_0:									//40
			//printk("[GDC_ONLY_0]");
			WrPktEp0((U8 *)&descConf+0,8); //EP0_PKT_SIZE
			SET_EP0_IN_PKT_RDY();
			ep0State=EP0_STATE_GD_CFG_ONLY_1;
			break;
			
		case EP0_STATE_GD_CFG_ONLY_1:									//41
			//printk("[GDC_ONLY_1]");
			WrPktEp0((U8 *)&descConf+8,1); 
			SET_EP0_INPKTRDY_DATAEND();
			ep0State=EP0_STATE_INIT;            
			break;

        //=== GET_DESCRIPTOR:INTERFACE ONLY===获取接口描述符
		case EP0_STATE_GD_IF_ONLY_0:									//42
			//printk("[GDI_ONLY_0]");
			WrPktEp0((U8 *)&descIf+0,8); 
			SET_EP0_IN_PKT_RDY();
			ep0State=EP0_STATE_GD_IF_ONLY_1;
			break;
		case EP0_STATE_GD_IF_ONLY_1:									//43
			//printk("[GDI_ONLY_1]");
			WrPktEp0((U8 *)&descIf+8,1); 
			SET_EP0_INPKTRDY_DATAEND();
			ep0State=EP0_STATE_INIT;            
			break;

        //=== GET_DESCRIPTOR:ENDPOINT 0 ONLY===获取端点0描述符
		case EP0_STATE_GD_EP0_ONLY_0:									//44
			//printk("[GDE_ONLY_0]");
			WrPktEp0((U8 *)&descEndpt0+0,7); 
			SET_EP0_INPKTRDY_DATAEND();
			ep0State=EP0_STATE_INIT;            
			break;
            
        //=== GET_DESCRIPTOR:ENDPOINT 1 ONLY===获取端点1描述符
		case EP0_STATE_GD_EP1_ONLY_0:									//45
			//printk("[GDE_ONLY_1]");
			WrPktEp0((U8 *)&descEndpt1+0,7); 
			SET_EP0_INPKTRDY_DATAEND();
			ep0State=EP0_STATE_INIT;            
			break;
            
////////////////////////////////////////////

		case EP0_INTERFACE_GET:											//46
			WrPktEp0((U8 *)&InterfaceGet+0,1);
			SET_EP0_INPKTRDY_DATAEND();
			ep0State=EP0_STATE_INIT;      //置0
			break;

 
        //=== GET_DESCRIPTOR:STRING ===获取字符串描述符

		case EP0_STATE_GD_STR_I0:
			//printk("[GDS0_0]");
			WrPktEp0((U8 *)descStr0, 4 );  
			SET_EP0_INPKTRDY_DATAEND();
			ep0State=EP0_STATE_INIT;     
			ep0SubState=0;
			break;

		case EP0_STATE_GD_STR_I1:
			//printk("[GDS1_%d]",ep0SubState);
			if( (ep0SubState*EP0_PKT_SIZE+EP0_PKT_SIZE)<sizeof(descStr1) )
			{
				WrPktEp0((U8 *)descStr1+(ep0SubState*EP0_PKT_SIZE),EP0_PKT_SIZE); 
				SET_EP0_IN_PKT_RDY();
				ep0State=EP0_STATE_GD_STR_I1;
				ep0SubState++;
			}
			else
			{
				WrPktEp0((U8 *)descStr1+(ep0SubState*EP0_PKT_SIZE),
					sizeof(descStr1)-(ep0SubState*EP0_PKT_SIZE)); 
				SET_EP0_INPKTRDY_DATAEND();
				ep0State=EP0_STATE_INIT;     
				ep0SubState=0;
			}
			break;

		case EP0_STATE_GD_STR_I2:
			//printk("[GDS2_%d]",ep0SubState);
			if( (ep0SubState*EP0_PKT_SIZE+EP0_PKT_SIZE)<sizeof(descStr2) )
			{
				WrPktEp0((U8 *)descStr2+(ep0SubState*EP0_PKT_SIZE),EP0_PKT_SIZE); 
				SET_EP0_IN_PKT_RDY();
				ep0State=EP0_STATE_GD_STR_I2;
				ep0SubState++;
			}
			else
			{
				//printk("[E]");
				WrPktEp0((U8 *)descStr2+(ep0SubState*EP0_PKT_SIZE),
					sizeof(descStr2)-(ep0SubState*EP0_PKT_SIZE)); 
				SET_EP0_INPKTRDY_DATAEND();
				ep0State=EP0_STATE_INIT;     
				ep0SubState=0;
			}
			break;

		case EP0_CONFIG_SET:
			WrPktEp0((U8 *)&ConfigSet+0,1); 
			SET_EP0_INPKTRDY_DATAEND();
			ep0State=EP0_STATE_INIT;      
			break;

		case EP0_GET_STATUS0:
			WrPktEp0((U8 *)&StatusGet+0,1);
			SET_EP0_INPKTRDY_DATAEND();
			ep0State=EP0_STATE_INIT;      
			break;

		case EP0_GET_STATUS1:
			WrPktEp0((U8 *)&StatusGet+1,1);
			SET_EP0_INPKTRDY_DATAEND();
			ep0State=EP0_STATE_INIT;      
			break;
		
		case EP0_GET_STATUS2:
			WrPktEp0((U8 *)&StatusGet+2,1);
			SET_EP0_INPKTRDY_DATAEND();
			ep0State=EP0_STATE_INIT;      
			break;
			
		case EP0_GET_STATUS3:
			WrPktEp0((U8 *)&StatusGet+3,1);
			SET_EP0_INPKTRDY_DATAEND();
			ep0State=EP0_STATE_INIT;      
			break;
		
		case EP0_GET_STATUS4:
			WrPktEp0((U8 *)&StatusGet+4,1);
			SET_EP0_INPKTRDY_DATAEND();
			ep0State=EP0_STATE_INIT;      
			break;
		
		default:
			//printk("[获取:无类型]");
			break;
	}//swith(ep0State)
	
}//Ep0Handler

void Ep1Handler(void)					//端口1中断处理
{
	
	iEpInState=1;
}//Ep1Handler

void Ep3Handler(void)					//端口3中断处理
{
	iEpOutState=1;
}

void PrintEp0Pkt(U8 *pt)
{
	int i;
	UartPrintf("[RCV:");
	for(i=0;i<EP0_PKT_SIZE;i++)
	   UartPrintf("%x,",pt[i]);
	UartPrintf("]");
}


void RdPktEp0(U8 *buf,int num)
{
    int i;
    for(i=0;i<num;i++)
    {
        buf[i]=(U8)rEP0_FIFO;	
    }
}
   
void WrPktEp0(U8 *buf,int num)
{
    int i;
    for(i=0;i<num;i++)
    {
        rEP0_FIFO=buf[i];	
    }
}

void WrByteEp0(U8 value)
{
  rEP0_FIFO= value;
}


⌨️ 快捷键说明

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