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

📄 pio.c

📁 ISP1583 Mass Storgae Firmware
💻 C
📖 第 1 页 / 共 5 页
字号:
                                                   
                                                   DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
                                                   DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
                                                                                                  
                                                }    
                                             }
					
										               Byte_Transfered_Count.VALUE = (Atapi_Bytecount.VALUE - Byte_Transfered_Count.VALUE);
                                             
										               Atapi_Bytecount.VALUE = 0;
	         								         Prev_State = ATAPI_Read_Phase;
		         							         break;
			
			case ATAPI_Status_Phase	      :
                                                                                  
                                          D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2;
                                                                                
                                                                                          
                                          if(D14_Cntrl_Reg.D14_ALT_STATUS_DEVCNTRL_TASKFILE & 0x01)
                                             Kernel_Flag.BITS.Error_Occur = 1;
                                          else
	         								         Kernel_Flag.BITS.Error_Occur = 0;
		         						
                                          return;

			
         default 					         :

									               break;
         }
	   }
	   while(1);
}

//***********************************************************************
//*										    							               *
//*	Routine 	:  Invalid CBW                                   		   *
//*	Input		:	Endpoint FIFO                 				            *
//*	Output   :	None                               					      *
//*	Function	:	to check if command block wrapper is invalid          *
//*																		               *
//***********************************************************************
void Invalid_CBW(void)
{

	do
	{

		D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;	
	
		D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;		//stall Bulk Out Endpoint

		while(!USB_Int_Flag.BITS.EP0SETUP)
      {
         if(Kernel_Flag.BITS.Bus_Reset)
            return;
      }
      
      USB_Int_Flag.BITS.EP0SETUP = 0;
      

      D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.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_ENDPT_INDEX = 1;
		D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
                                                   
      while(!USB_Int_Flag.BITS.EP0TX)
      {
         if(Kernel_Flag.BITS.Bus_Reset)
            break;
      }
                                                   
      USB_Int_Flag.BITS.EP0TX = 0;


		while(!USB_Int_Flag.BITS.EP0SETUP)
      {
         if(Kernel_Flag.BITS.Bus_Reset)
            return;
      }

		D14_Cntrl_Reg.D14_ENDPT_INDEX = 0x20;
      
		USB_Device_Request.bmRequestType = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
		USB_Device_Request.bRequest = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
		USB_Device_Request.wValue = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
		USB_Device_Request.wIndex = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
		USB_Device_Request.wLength = D14_Cntrl_Reg.D14_DATA_PORT_LSB;


		if(USB_Device_Request.bmRequestType == 0x21 &&
		   USB_Device_Request.bRequest == 0xff &&
		   USB_Device_Request.wValue == 0 &&
		   USB_Device_Request.wLength == 0)
		{
		 	Init_Device();
			return;
		}
	}
	while(1);
}



//***********************************************************************
//*										    							               *
//*	Routine 	:  Error Handling                                		   *
//*	Input		:	Sense Key Additional Sense Code  			            *
//*	Output   :	None                               					      *
//*	Function	:	to initialize error handling                          *
//*					                     						               *
//***********************************************************************
void Error_Handle(void)
{


//   USB_Int_Flag.BITS.EP2TX = 0;
         
         
   if(USB_CBW.Length.VALUE != 0 && Prev_State == ATAPI_Cmd_Packet_Phase &&
      USB_CBW.dCBWFlags == 0x80)
   {
   
      D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
      D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2;								
         
      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;
         
   }

   if(USB_CBW.dCBWFlags == 0x80)
   {

	while(D14_Cntrl_Reg.D14_BUFFER_STATUS != 0)
		{
			if(Kernel_Flag.BITS.Bus_Reset  || USB_Int_Flag.BITS.SUSP)
                	return;
		}


      D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
      
      USB_Device.BITS.Halt = 1;
      
   }
   else
   {
   
      if((Byte_Transfered_Count.VALUE == Atapi_Bytecount.VALUE)  && Prev_State == ATAPI_Write_Phase)
      {
         if(Kernel_Flag.BITS.MASTER_ATAPI_DRIVE ||
         	  Kernel_Flag.BITS.SLAVE_ATAPI_DRIVE)
         {
            D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
            D14_Cntrl_Reg.D14_DMA_ENDPOINT = 1;
            D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
            USB_Device.BITS.Halt = 1;
         }   
      }
   }
   
   if(Kernel_Flag.BITS.Error_Occur)
      USB_CSW.bCSWStatus = 1;
   else
      USB_CSW.bCSWStatus = 0;
      
   Kernel_Flag.BITS.Transfer_Error = 0;
	Kernel_Flag.BITS.Error_Occur = 0;


}

//***********************************************************************
//*										    							               *
//*	Routine 	:  CSW Status                                    		   *
//*	Input		:	Endpoint FIFO                 				            *
//*	Output   :	command status wrapper             					      *
//*	Function	:	to initialize endpoint FIFO with command status       *
//*					wrapper              						               *
//***********************************************************************
void CSW_Status(void)
{

   USB_CSW.Residue.VALUE = USB_CBW.Length.VALUE - Byte_Transfered_Count.VALUE;

   Kernel_Flag.BITS.Bus_Reset = 0;

   D14_Cntrl_Reg.D14_DMA_ENDPOINT = 9;
   D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;

	while(D14_Cntrl_Reg.D14_BUFFER_STATUS != 0)
		{
			if(Kernel_Flag.BITS.Bus_Reset  || USB_Int_Flag.BITS.SUSP)
                	return;
		}

   D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 13;
   D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
   

	D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x55;
	D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x53;
	D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x42;
	D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x53;
			
	D14_Cntrl_Reg.D14_DATA_PORT_LSB = USB_CBW.dCBWTag[0];
	D14_Cntrl_Reg.D14_DATA_PORT_MSB = USB_CBW.dCBWTag[1];
	D14_Cntrl_Reg.D14_DATA_PORT_LSB = USB_CBW.dCBWTag[2];
	D14_Cntrl_Reg.D14_DATA_PORT_MSB = USB_CBW.dCBWTag[3];


	D14_Cntrl_Reg.D14_DATA_PORT_LSB = USB_CSW.Residue.dCSWDataResidue[3];
	D14_Cntrl_Reg.D14_DATA_PORT_MSB = USB_CSW.Residue.dCSWDataResidue[2];
	D14_Cntrl_Reg.D14_DATA_PORT_LSB = USB_CSW.Residue.dCSWDataResidue[1];
	D14_Cntrl_Reg.D14_DATA_PORT_MSB = USB_CSW.Residue.dCSWDataResidue[0];

	D14_Cntrl_Reg.D14_DATA_PORT_LSB = USB_CSW.bCSWStatus;

	 Kernel_Flag.BITS.Send_CSW = 0;
   
}




//***********************************************************************
//*										    							               *
//*	Routine 	:  ATA CDB Process                               		   *
//*	Input		:	CBW Command                   				            *
//*	Output   :	None                               					      *
//*	Function	:	to translate the ATAPI to ATA command                 *
//*																		               *
//***********************************************************************
void ATA_CMD_Translator(void)
{

   Sector_Count = 0;
      
   switch (USB_CBW.CBWCDB[0])
   {
      case INQUIRY:
//                     USB_Int_Flag.BITS.EP2TX = 0;                        

   if(Kernel_Flag.BITS.MASTER_ATA_DRIVE)
   	{
		Check_Busy();
	   D14_Cntrl_Reg.D14_DRIVE_SELECT_TASKFILE = MASTER_DRIVE;
		Check_Busy();
   	}
   else
   	{
		Check_Busy();
	D14_Cntrl_Reg.D14_DRIVE_SELECT_TASKFILE = SLAVE_DRIVE;
	Check_Busy();
   	}
  			            D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;

                 
                     if(USB_CBW.Length.VALUE == 6)
                     {
   				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;  //Direct access device				
	   			         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;  //Non-removable media device				
		   		         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;  			
			   	         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x01;  			
				            D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x1f; 			
				            D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;  		
                        
                        Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;
                        
                        return;
                        
                     }       
        
         				D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_LSB = 0;
				         D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE2 = 2;
				         D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE3 = 0;
				         D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_MSB = 0;
	                           
				         D14_Cntrl_Reg.D14_BYTECOUNT_LSB_TASKFILE = 0;
				         D14_Cntrl_Reg.D14_BYTECOUNT_MSB_TASKFILE = 2;

                     //issue identify device command
				         D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE = ID_ATA_DEVICE;		

			            while(!DMA_Int_Flag.BITS.INTRQ_SEEN && !DMA_Int_Flag.BITS.CMD_INTRQ_OK)
                     {
                        if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
                           return;
                     }      
                     	
                     DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
	                  DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
                                                     
			            Read_1F0();
        
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;  //Direct access device				
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;  //Non-removable media device				
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;  			

⌨️ 快捷键说明

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