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

📄 usb_device_config.c

📁 三星ARM9 s3c2410 usb device开发
💻 C
📖 第 1 页 / 共 2 页
字号:
  		    //Uart_Puts("\n ======other standard bRequest!\n"); 
    	    CLR_EP0_OUTPKTRDY_DATAEND(); //Because of no data control transfers.
		    ep0State=EP0_STATE_INIT;
		    //Print_USB_SETUP_DATA(descSetup);
	    	break;    	
        }
   }
    



static void  Class_bRequest_Handler(U8 choice){
    switch(choice)
    	{
    	case GET_DESCRIPTOR:
    	    //Uart_Puts("GET_DESCRIPTOR !\n"); 
	        Descriptor_Type_Handler(descSetup.bValueH);        
   		    break;
   		    
    	case HID_GET_REPORT:
            //Uart_Puts("HID_GET_REPORT !\n");
            SET_EP0_INPKTRDY_DATAEND();
            break;    	
            
		case HID_GET_IDLE:
           // Uart_Puts("HID_GET_IDLE !\n"); 
            SET_EP0_INPKTRDY_DATAEND();;
    	    break;
   		    
    	case HID_GET_PROTOCOL:
            //Uart_Puts("HID_GET_PROTOCOL !\n");
            SET_EP0_INPKTRDY_DATAEND();
            break;    	
            
		case HID_SET_IDLE:
            Uart_Puts("HID_SET_IDLE !\n");
            CLR_EP0_OUTPKTRDY_DATAEND();
            //CLR_EP0_OUTPKTRDY_SEND_STALL();
            ep0State=EP0_STATE_INIT; 
            break;
                
		case HID_SET_PROTOCOL:
            //Uart_Puts("HID_SET_PROTOCOL !\n");
            CLR_EP0_OUTPKTRDY_DATAEND();
            break;  
  		default:
  		    //Uart_Puts("\n other class bRequest!\n"); 
  		    CLR_EP0_OUTPKTRDY_DATAEND();
	    	break;    	
        }

}




static void  Descriptor_Type_Handler(U8 type){
       switch(type)        
            {
            case DEVICE_TYPE:
    	        //Uart_Puts("DEVICE_TYPE!\n");	 	    	
    	        CLR_EP0_OUT_PKT_RDY();
		    	ep0State=EP0_STATE_GD_DEV_0;	        
	    		break;	
	    		
		    case CONFIGURATION_TYPE:
    	        //Uart_Puts("CONFIGURATION_TYPE!\n");
    	        //Print_USB_SETUP_DATA(descSetup);
    	        CLR_EP0_OUT_PKT_RDY();
	 	    	if((descSetup.bLengthL+(descSetup.bLengthH<<8))>0x9)//bLengthH should be used for bLength=0x209 at WIN2K  	
		    	    ep0State=EP0_STATE_GD_CFG_0; //for WIN98,WIN2K
				else	    	    
	  			    ep0State=EP0_STATE_GD_CFG_ONLY_0; //for WIN2K
			    break;
			    
	   	    case STRING_TYPE:
    	       // Uart_Puts("STRING_TYPE!\n");
    	        CLR_EP0_OUT_PKT_RDY();
	    		switch(descSetup.bValueL)
	    		{
	    	    case 0:
	    	    	ep0State=EP0_STATE_GD_STR_I0;
	    	    	break;
	    	    case 1:
       	    		ep0State=EP0_STATE_GD_STR_I1;
	    	    	break;
	    	    case 2:	
	    	    	ep0State=EP0_STATE_GD_STR_I2;
	    	    	break;
	    	    case 3:	
	    	    	ep0State=EP0_STATE_GD_STR_I3;
	    	    	break;
	    	    default:
	    			break;
	    		}
		    	ep0SubState=0;
		    	break;
		    	
	    	case INTERFACE_TYPE:
    	        //Uart_Puts("INTERFACE_TYPE!\n");
    	    	CLR_EP0_OUT_PKT_RDY();
		    	ep0State=EP0_STATE_GD_IF_ONLY_0; //for WIN98
	    		break;
	    		
		    case ENDPOINT_TYPE:	    	
    	        //Uart_Puts("ENDPOINT_TYPE!\n");
 	    		CLR_EP0_OUT_PKT_RDY();
 	    		switch(descSetup.bValueL&0xf)
		    	{
		    	case 1:
	    		    ep0State=EP0_STATE_GD_EP0_ONLY_0;
	    		    break;
		    	case 2:
					ep0State=EP0_STATE_GD_EP1_ONLY_0;
	    		    break;
	    		default:

		    	    break;
		    	}
	    		break;
//===================[HID]=============================	    		
	    	case HID_TYPE:
    	        Uart_Puts("HID_TYPE!\n");
    	    	CLR_EP0_OUTPKTRDY_DATAEND();
	    		break;
	    		
	    	case REPORT_TYPE:
    	        Uart_Puts("REPORT_TYPE!\n");
    	        ep0State=EP0_STATE_GD_REP;
    	    	CLR_EP0_OUT_PKT_RDY();
    	    	ep0SubState=0;
	    		break;
	    				
	    	case PHYSICAL_TYPE:
    	        Uart_Puts("PHYSICAL_TYPE!\n");
    	    	CLR_EP0_OUTPKTRDY_DATAEND();
	    		break;
//=====================================================	    			
		    default:
		       //Uart_Puts("\n ohter Descriptor_Type!\n");
	    	   break;
		    }
}





static void Ep0State_Handler(U32 Ep0State){
 
  switch(ep0State)
    {	
	case EP0_STATE_INIT:
	    break; 

	//=== GET_DESCRIPTOR:DEVICE =====================
	//=== [IN_PKT_RDY  BIT IS CLEARED ] INTERRUPT
   	case EP0_STATE_GD_DEV_0:
		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:
		WrPktEp0((U8 *)&descDev+0x8,8); 
		SET_EP0_IN_PKT_RDY();            
		ep0State=EP0_STATE_GD_DEV_2;
		break;

	case EP0_STATE_GD_DEV_2:
		WrPktEp0((U8 *)&descDev+0x10,2);   //8+8+2=0x12
		SET_EP0_INPKTRDY_DATAEND();        //IMPORTANT!!!
		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.
	case EP0_STATE_GD_CFG_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:
		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:
        WrPktEp0((U8 *)&descIf+7,2); 
        WrPktEp0((U8 *)&Class_Descriptor+0,6);
        SET_EP0_IN_PKT_RDY();
        ep0State=EP0_STATE_GD_CFG_3;
        break;
             
    case EP0_STATE_GD_CFG_3:
        WrPktEp0((U8 *)&Class_Descriptor+6,3);   
        WrPktEp0((U8 *)&descEndpt0+0,5);  
        SET_EP0_IN_PKT_RDY();
        ep0State=EP0_STATE_GD_CFG_4;            
        break;
        
    case EP0_STATE_GD_CFG_4:
        WrPktEp0((U8 *)&descEndpt0+5,2); 
        //WrPktEp0((U8 *)&descEndpt1+0,6);
        //SET_EP0_IN_PKT_RDY();
        //ep0State=EP0_STATE_GD_CFG_5; 
		SET_EP0_INPKTRDY_DATAEND();
		ep0State=EP0_STATE_INIT;                          
        break;     

   	case EP0_STATE_GD_CFG_5:
   	    Uart_Puts("5\n");
	    WrPktEp0((U8 *)&descEndpt1+6,2); 
		SET_EP0_INPKTRDY_DATAEND();
		ep0State=EP0_STATE_INIT;            
        break;






    //=== GET_DESCRIPTOR:CONFIGURATION ONLY===
   	case EP0_STATE_GD_CFG_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:
        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:
        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:
        WrPktEp0((U8 *)&descIf+8,1); 
        SET_EP0_INPKTRDY_DATAEND();
        ep0State=EP0_STATE_INIT;            
        break;



    //=== GET_DESCRIPTOR:ENDPOINT 0 ONLY===
   	case EP0_STATE_GD_EP0_ONLY_0:
        WrPktEp0((U8 *)&descEndpt0+0,7); 
        SET_EP0_INPKTRDY_DATAEND();
        ep0State=EP0_STATE_INIT;            
        break;
    
            
    //=== GET_DESCRIPTOR:ENDPOINT 1 ONLY===
   	case EP0_STATE_GD_EP1_ONLY_0:
        WrPktEp0((U8 *)&descEndpt1+0,7); 
        SET_EP0_INPKTRDY_DATAEND();
        ep0State=EP0_STATE_INIT;            
        break;
 
 
    //=== GET_DESCRIPTOR:STRING ===
   	case EP0_STATE_GD_STR_I0:
	    WrPktEp0((U8 *)descStr0, 4 );  
	    SET_EP0_INPKTRDY_DATAEND();
	    ep0State=EP0_STATE_INIT;     
	    ep0SubState=0;
	    break;

	case EP0_STATE_GD_STR_I1:
		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:
        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
	    {
	    	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_STATE_GD_STR_I3:
        if( (ep0SubState*EP0_PKT_SIZE+EP0_PKT_SIZE)<sizeof(descStr3) )
        {
        	WrPktEp0((U8 *)descStr3+(ep0SubState*EP0_PKT_SIZE),EP0_PKT_SIZE); 
            SET_EP0_IN_PKT_RDY();
            ep0State=EP0_STATE_GD_STR_I3;
            ep0SubState++;
		}
	    else
	    {
	    	WrPktEp0((U8 *)descStr3+(ep0SubState*EP0_PKT_SIZE),
	    		 sizeof(descStr3)-(ep0SubState*EP0_PKT_SIZE)); 
			SET_EP0_INPKTRDY_DATAEND();
			ep0State=EP0_STATE_INIT;     
			ep0SubState=0;
	    }
		break;
	//===================[HID]===========================================
	
  case EP0_STATE_GD_REP:
        if( (ep0SubState*EP0_PKT_SIZE+EP0_PKT_SIZE)<sizeof(hid_report_desc_table) )
        {
        	WrPktEp0((U8 *)hid_report_desc_table+(ep0SubState*EP0_PKT_SIZE),EP0_PKT_SIZE); 
            SET_EP0_IN_PKT_RDY();
            ep0State=EP0_STATE_GD_REP;
            ep0SubState++;
		}
	    else
	    {
	    	WrPktEp0((U8 *)hid_report_desc_table+(ep0SubState*EP0_PKT_SIZE),
	    		 sizeof(hid_report_desc_table)-(ep0SubState*EP0_PKT_SIZE)); 
			SET_EP0_INPKTRDY_DATAEND();
			ep0State=EP0_STATE_INIT;     
			ep0SubState=0;
	    }
		break;
	//=======================================================================
		
	default:
    	break;
    }
}


 void UsbdInit(U8 fun)
{
	isUsbdSetConfiguration = 0;    
	InitDescriptorTable(fun);
	ReconfigUsbd();
}






⌨️ 快捷键说明

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