usb.c

来自「ISP1583 Mass Storgae Firmware」· C语言 代码 · 共 1,624 行 · 第 1/5 页

C
1,624
字号
   
      case  USB_Default    :  
      default              :
                              break;
    
      case  USB_Addressed  :
		         	            if(USB_Device_Request.wValue == 0)
                              {
                     			   Device_Config_Value = 0;
                                                      
                                 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
									      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;

                                 break;
                              
                              }
                                   
                              if(USB_Device_Request.wValue == 0x0100 ||
                                 USB_Device_Request.wValue == 0x0200)
                              {
                                 Device_Config_Value = (UC) (USB_Device_Request.wValue >> 8);

               						USB_Device.BITS.State = USB_Configured;
                                                      
                                 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
									      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
                                 break;
                                    
                              } 

                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
		                        D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
                                                      
                              while(!USB_Int_Flag.BITS.EP0SETUP)
                              {
                                 if(USB_Int_Flag.BITS.SUSP ||
                                    Kernel_Flag.BITS.Bus_Reset)
                                    return;
            
                              }
      
                              USB_Int_Flag.BITS.EP0TX = 0;
                                                      
                              break;
                              
      case  USB_Configured :
			                     if(USB_Device_Request.wValue == 0)
                              {
                     			   Device_Config_Value = 0;
                                 USB_Device.BITS.State = USB_Addressed;
                  
                                 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
									      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
                                 break;
                                    
                              }
                                   
                              if(USB_Device_Request.wValue == 0x0100 ||
                                 USB_Device_Request.wValue == 0x0200)
                              {
                                 Device_Config_Value = (UC) (USB_Device_Request.wValue >> 8);

               						USB_Device.BITS.State = USB_Configured;
                                 
                                 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
									      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
                                 break;
                                    
                              } 

                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
		                        D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
                                                      
                              while(!USB_Int_Flag.BITS.EP0SETUP)
                              {
                                 if(USB_Int_Flag.BITS.SUSP ||
                                    Kernel_Flag.BITS.Bus_Reset)
                                    return;
            
                              }
      
                              USB_Int_Flag.BITS.EP0TX = 0;
                                                      
                              break;
   }                                
}      



//***********************************************************************
//*										    							               *
//*	Routine 	:                                                		   *
//*	Input		: None                   								         *     
//*	Output	: None                                   					   *
//*	Function	:                                            			   *
//*																		               *
//***********************************************************************

void Get_Config_Value(void)
{

   switch(USB_Device.BITS.State)
   {
   
      default              :
      case  USB_Default    :
                              break;
                              
      case  USB_Addressed  :

                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0;
                              D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;
                              D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.DSEN = 1;
                                                      
                              //check for status stage
                              while(!USB_Int_Flag.BITS.EP0TX)
                              {
                                 if(USB_Int_Flag.BITS.SUSP ||
                                    Kernel_Flag.BITS.Bus_Reset)
                                    return;
                              }
                                                      
                              USB_Int_Flag.BITS.EP0TX = 0;
                                                      
                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
	                           D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
                                                        
                              break;                              

      case  USB_Configured :
                           	D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
                        		D14_Cntrl_Reg.D14_DATA_PORT_LSB = Device_Config_Value;
                              D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;
                              D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.DSEN = 1;

                           	//check for status stage
                              while(!USB_Int_Flag.BITS.EP0TX)
                              {
                                 if(USB_Int_Flag.BITS.SUSP ||
                                    Kernel_Flag.BITS.Bus_Reset)
                                    return;
                              }
                                                      
                              USB_Int_Flag.BITS.EP0TX = 0;
                                                      
                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
	                           D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
                                                      
                                                        
                              break;                              
   }
}
								   

//***********************************************************************
//*										    							               *
//*	Routine 	:                                                		   *
//*	Input		: None                   								         *     
//*	Output	: None                                   					   *
//*	Function	:                                            			   *
//*																		               *
//***********************************************************************

void Clear_Feature_Request(void)
{
                           
   switch(USB_Device.BITS.State)
   {
                           
      case  USB_Addressed  :
                              if(USB_Device_Request.wLength != 0)
                                 break;
                                                         
                              if(USB_Device_Request.wIndex != 0)
                              {
                                 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
										   D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
                                                         
                                 while(!USB_Int_Flag.BITS.EP0SETUP)
                                 {
                                    if(USB_Int_Flag.BITS.SUSP ||
                                       Kernel_Flag.BITS.Bus_Reset)
                                       return;
                                 
                                 }
      
                                 USB_Int_Flag.BITS.EP0TX = 0;
                              }
                              else
                              {
                                                                  
                           	   if(USB_Device_Request.wValue == 0)
                                 {
         	               		   USB_Device.BITS.Halt = 0;
                                                      
                                    D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
	                                 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
                                    break;
	         
				                        								
                                 }
                                                                                                             
										   if(USB_Device_Request.wValue == 0x0100)
                                 {
											   USB_Device.BITS.Remote_Wakeup = 0;
                                                                                                   
                                    D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
	                                 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
                                    break;
                                 }
                              }
                                                      
                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
	                           D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
                                                      
                                                      
                              while(!USB_Int_Flag.BITS.EP0SETUP)
                              {
                                 if(USB_Int_Flag.BITS.SUSP ||
                                    Kernel_Flag.BITS.Bus_Reset)
                                    return;
                              }
                                                             
                              USB_Int_Flag.BITS.EP0TX = 0;
                                                      
                              break;
                                                      
										                           
      case  USB_Configured :
                              if(USB_Device_Request.wLength != 0)
                                 break;

                              if(USB_Device_Request.wValue == 0)
								      {
                                 switch(USB_Device_Request.wIndex)
                                 {
                                 
                                    case  0x8000   :
                                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
                                                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 0;
										                        Kernel_Flag.BITS.Endpt_Stall = 0;
                                                                                          
                                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
                                                      D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = OFF;			//disable FIFO
                                                      D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = ON;			//disable FIFO
                                                      
                                                      D14_Cntrl_Reg.D14_DMA_ENDPOINT = 1;
                                                      D14_Cntrl_Reg.D14_DMA_COMMAND = CLEAR_BUFFER;

                                                      break;
                                                      
                                    case  0x0000   :
                                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
                                                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 0;
										                        Kernel_Flag.BITS.Endpt_Stall = 0;
                                                                                          
                                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
                                                      D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = OFF;			//disable FIFO
                                                      D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = ON;			//disable FIFO
                                                      
                                                      D14_Cntrl_Reg.D14_DMA_ENDPOINT = 0;
                                                      D14_Cntrl_Reg.D14_DMA_COMMAND = CLEAR_BUFFER;

                                                      break;
                                  
                                    case  0x8200   :
                                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
                                                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 0;
										                        Kernel_Flag.BITS.Endpt_Stall = 0;
                                                                                          
                                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
                                                      D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = OFF;			//disable FIFO
                                                      D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = ON;			//disable FIFO
                                                      
                                                      D14_Cntrl_Reg.D14_DMA_ENDPOINT = 5;
                                                      D14_Cntrl_Reg.D14_DMA_COMMAND = CLEAR_BUFFER;
                                                      
                                                      break;
                                                     
                                    case  0x0200   :
                                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
                                                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 0;
										                        Kernel_Flag.BITS.Endpt_Stall = 0;
                                                                                          
                                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
                                                      D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = OFF;			//disable FIFO
                                                      D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = ON;			//disable FIFO
                                                      
                                                      D14_Cntrl_Reg.D14_DMA_ENDPOINT = 4;
                                                      D14_Cntrl_Reg.D14_DMA_COMMAND = CLEAR_BUFFER;
                                                      
                                                      break;

                                    default        :  
                                                      break;
                                 }                                                                                                      
										                           
                                                               
                                 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
	                              D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;

                                 USB_Device.BITS.Halt = 0;
                                 break;


                              }   											

                              if(USB_Device_Request.wValue == 0x0100)
                              {
										   USB_Device.BITS.Remote_Wakeup = 0;
                                                      
                                 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
	                              D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
                                 break;
                                                         
                              }
                                                      
                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
	                           D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
                                                      
                              while(!USB_Int_Flag.BITS.EP0SETUP)
                              {
                                 if

⌨️ 快捷键说明

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