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

📄 chap_9._c

📁 基于D12的USB固件驱动
💻 _C
📖 第 1 页 / 共 2 页
字号:
        
	    if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) 
            /*Get Endpoint Index*/
        {
	        /*Clear TX stall for IN on EPn*/
	        D12_SetEndpointStatus(endp*2+1,0);
	    }        
        else     
        {
	        /*Clear RX stall for OUT on EPn.*/
		    D12_SetEndpointStatus(endp*2,0);
	    }       
     
	    /*Transmit ACK*/
	    single_transmit(0,0);
    }
   
    /*No Request,Return STALL*/
    else    
	{
	    stall_ep0();
	}
}


/*********************************************************************
  Function:     set_feature
  Description:  the Function is opposite of clear_feature()           
  Calls:        CLI(); SEI(); D12_SetEndpointStatus(); single_transmit(); stall_ep0();
  Called By:    StandardDeviceRequest();                       
  Input:        void                 
  Output:                       
  Return:       void                     
  Others:                            
*********************************************************************/
void set_feature(void)
{
    unsigned char endp;
  
    unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 
    if (bRecipient == USB_RECIPIENT_DEVICE
        && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
    {
        CLI();     //DisableInterrupts;
       
	    bEPPflags.bits.remote_wakeup=1;        //Set Remote Wakeup
       
	    SEI();     //EnableInterrupts;
       
	    single_transmit(0,0);                  //Transmit Acknowledge
    }
    else if (bRecipient == USB_RECIPIENT_ENDPOINT
        && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
    {   
        endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);                                        //Return Endpoint
        
		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) 
        {
		    /*Set TX stall for IN on EPn*/
			D12_SetEndpointStatus(endp * 2 + 1, 1);        
        }
		else     
        {
		    /*Set RX stall for OUT on EPn*/
		    D12_SetEndpointStatus(endp * 2, 1);       
        }
	    
		/*Transmit ACK*/
		single_transmit(0, 0);                         
    }
   
    else   
	{
	    /*No Request,Return STALL*/
		stall_ep0();
	}                        
}


/*********************************************************************
  Function:     set_address
  Description:  set_address
  Calls:        D12_SetAddressEnable(); single_transmit();
  Called By:    StandardDeviceRequest();
  Input:        void
  Output:                       
  Return:       void
  Others:                            
*********************************************************************/
void set_address(void)
{
    D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue & 
                         DEVICE_ADDRESS_MASK), 1);          
   
    /*Transmit Acknowledge*/
	single_transmit(0,0);                      
}


/*********************************************************************
  Function:     get_descriptor
  Description:  get_descriptor          
  Calls:        code_transmit(); stall_ep0();
  Called By:    StandardDeviceRequest();
  Input:        void                
  Output:                       
  Return:       void                     
  Others:                            
*********************************************************************/
void get_descriptor(void)
{
    unsigned char bDescriptor,i;
   
    unsigned char temp;
	
	const unsigned char *pt; 
   
    bDescriptor = (ControlData.DeviceRequest.wValue >> 8) & 0xFF;

    if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)   /*Get Device Descriptor*/ 
    {
        pt = (const unsigned char *) &DeviceDescr;
	   
	    temp = ControlData.DeviceRequest.wLength;
	    
		for (i = 0; i < temp; i++)
	    {
	      DescrData[i] = *(pt + i);
	    }
	    
		code_transmit(DescrData, sizeof (DeviceDescr)); 
    }
   
    /*Get Configuration Descriptor*/
	else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)   
    { 
        if (ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH)
        {
		    ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;
		}
       /*Get Config Descriptor=Config Descriptor+Interface Descriptor+Endp Descriptor*/   
	   
	    pt = (const unsigned char *) &ConfigDescr;
	    
		temp = ControlData.DeviceRequest.wLength;	   
	   
	    for(i = 0; i < temp; i++)
	    {
	       DescrData[i] = *(pt + i);
	    }
        
		code_transmit(DescrData, ControlData.DeviceRequest.wLength);	   
    } 
    else 
	{
	    stall_ep0();
	}
}

/*********************************************************************
  Function:     set_configuration
  Description:  set_configuration                      
  Calls:        CLI(); SEI(); init_unconfig(); init_config(); stall_ep0();
  Called By:    StandardDeviceRequest();
  Input:        void                 
  Output:                       
  Return:       void                     
  Others:                            
*********************************************************************/         
void set_configuration(void)
{
    if (ControlData.DeviceRequest.wValue == 0)
    {                                             
        single_transmit(0, 0);
        
		CLI();
        
		bEPPflags.bits.configuration = 0;
        
		SEI();
        
		/*Enter Address Status ,Stall all endp exclude ep0*/
		init_unconfig();   
    }
    else if(ControlData.DeviceRequest.wValue == 1)
    {
        /*Transmit ACK*/
		single_transmit(0, 0);                      
       
	    init_unconfig();
       
	    /*Config Process ,Enable Endp Transmit and Receive*/
		init_config(); 
       
	    CLI();
       
	    bEPPflags.bits.configuration = 1;
       
	    SEI();
    }
    else 
	{
	    stall_ep0();
	}
}      


/*********************************************************************
  Function:     get_configuration
  Description:  Get Information of Config,Return 1 if configuration or Return 0            
  Calls:        single_transmit();
  Called By:    StandardDeviceRequest();              
  Input:        void              
  Output:                       
  Return:       void                     
  Others:                            
*********************************************************************/
void get_configuration(void)
{
    unsigned char c = bEPPflags.bits.configuration;
   
    /*Return Configuration Value*/
    single_transmit(&c, 1);                       
} 
         

/*********************************************************************
  Function:     get_interface
  Description:  Get Interface Status          
  Calls:        single_transmit();
  Called By:    StandardDeviceRequest();
  Input:        void                  
  Output:                       
  Return:       void                     
  Others:                            
*********************************************************************/
/*Get Interface Status*/
void get_interface(void)
{
   /*Only Current Interface = 0*/
   unsigned char txdat = 0;
   
   single_transmit(&txdat, 1);
}


/*********************************************************************
  Function:     set_interface
  Description:  set interface  
  Calls:        single_transmit(); stall_ep0();
  Called By:    StandardDeviceRequest();    
  Input:        void                      
  Output:                       
  Return:       void                     
  Others:                            
*********************************************************************/
void set_interface(void)
{
    if(ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
    {
	    single_transmit(0, 0);
	}
    else
    {
	    stall_ep0();
	}
}




⌨️ 快捷键说明

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