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

📄 usb.c

📁 ISP1583 Mass Storgae Firmware
💻 C
📖 第 1 页 / 共 5 页
字号:
                              case  USB_Interface_Power_Descriptor  :
                                
					               				      fn_Not_Implemented();
                                                break;


                              default  :
	                        							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;
                        
                           }

                           break;
                           

	case	Set_Address		:

                           Set_Device_Address();                           
                           break;
	case	Set_Config		:
                           
                    
                           Set_Config_Value();                           

                           break;

	case	Get_Config		:
   
                           Get_Config_Value();
                           break;


	case	Clear_Feature	:
                           Clear_Feature_Request();
                           break;

	case	Get_Status		:
                           
                           Get_Status_Request();
                           break;
						
	case	Set_Feature		:
                           Set_Feature_Request();
                           break;
                           

	case	Set_Descriptor	:
								   fn_Not_Implemented();
								   break;		
								

	case	Get_Interface	:
                           Get_Interface_Value();
								   break;
																
	case	Set_Interface	:
   
                           Set_Interface_Value();
								   break;

	case	Synch_Frame :
								D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
								D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;

								D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
								D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
																
   default              :
                           break;
                           

	}
}


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

void Send_Device_Descriptor(void)
{
   if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
	   Descriptor_Ptr = &Standard_Device_Descriptor[0];	//set pointer to device descriptor

	if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
	   Descriptor_Ptr = &HS_Device_Descriptor[0];	//set pointer to device descriptor

	D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;


	if(USB_Device_Request.wLength < 18)
		{
		    	D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = USB_Device_Request.wLength;
			D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
		}
	else
		{
			USB_Device_Request.wLength = 18;
		    	D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 18;
			D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
		}


	for(count = 0 ; count < USB_Device_Request.wLength ; count++)
		{
   			//send descriptor
			D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;	//fill up FIFO
			Descriptor_Ptr++;
   			D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;	//fill up FIFO
			Descriptor_Ptr++;
			count++;
		}
	
	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 ||
         USB_Int_Flag.BITS.RESET)
         return;
   }
                                                
   USB_Int_Flag.BITS.EP0TX = 0;

//	D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
//	D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;

	D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
	D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
                                                
}


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

void Send_Config_Descriptor(void)
{

   Descriptor_Ptr = &Standard_Config_Descriptor[0];	//set pointer to configuration descriptor

	D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;

   //check if only configuration descriptor required
	if(USB_Device_Request.wLength <= 9)				//Send only Configuration descriptor
	{
   
      D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) USB_Device_Request.wLength;
		D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
			
		//send descriptor
	   D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
		Descriptor_Ptr++;
	   D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
		Descriptor_Ptr++;
	   D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
		Descriptor_Ptr++;
	   D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
		Descriptor_Ptr++;
	   D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
		Descriptor_Ptr++;
	   D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
		Descriptor_Ptr++;
	   D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
		Descriptor_Ptr++;
	   D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
		Descriptor_Ptr++;
	   D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;

		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;

                                                   
   }
   else //send Configuration,Interface and Endpoint descriptor
	{

      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;

      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
		   Descriptor_Ptr = &FS_Default_Interface_Descriptor[0]; //set pointer to interface descriptor

      if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
		   Descriptor_Ptr = &HS_Default_Interface_Descriptor[0]; //set pointer to interface descriptor
			
      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr; //Set to ATAPI interface subclass
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;


      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
		   Descriptor_Ptr = &Bulk_Out_Descriptor[0]; //set pointer to interface descriptor

      if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
		   Descriptor_Ptr = &HS_Bulk_Out_Descriptor[0]; //set pointer to interface descriptor

      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
				                                          

      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
		   Descriptor_Ptr = &Bulk_In_Descriptor[0]; //set pointer to interface descriptor

		if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
		   Descriptor_Ptr = &HS_Bulk_In_Descriptor[0]; //set pointer to interface descriptor

      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
      Descriptor_Ptr++;
      D14_Cntrl_Reg.D14_DATA_PORT_MSB = *Descriptor_Ptr;
				                                          
      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;	//validate FIFO

		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;
   }
}
	
//***********************************************************************
//*										    							               *
//*	Routine 	:                                                		   *
//*	Input		: None                   								         *     
//*	Output	: None                                   					   *
//*	Function	:                                            			   *
//*																		               *
//***********************************************************************

void Send_String_ID(void)
{

⌨️ 快捷键说明

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