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

📄 pio.c

📁 ISP1583 Mass Storgae Firmware
💻 C
📖 第 1 页 / 共 5 页
字号:

   	count = D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB;			      //read out buffer length
   	count <<= 8;
   	count |= D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB;

   	if(count == 31)	
	   {    

   		USB_CBW.Signature.dCBWSignature[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;		//read in CBW Signature
   		USB_CBW.Signature.dCBWSignature[1] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;		//read in CBW Signature
		   USB_CBW.Signature.dCBWSignature[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;		//read in CBW Signature
		   USB_CBW.Signature.dCBWSignature[3] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;		//read in CBW Signature


   		USB_CBW.dCBWTag[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;		//read in CBW Signature
   		USB_CBW.dCBWTag[1] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;		//read in CBW Signature
   		USB_CBW.dCBWTag[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;		//read in CBW Signature
   		USB_CBW.dCBWTag[3] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;		//read in CBW Signature
   

   		USB_CBW.Length.dCBWDataTransferLength[3] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;		//read in CBW Signature
   		USB_CBW.Length.dCBWDataTransferLength[2] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;		//read in CBW Signature
   		USB_CBW.Length.dCBWDataTransferLength[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;		//read in CBW Signature
   		USB_CBW.Length.dCBWDataTransferLength[0] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;		//read in CBW Signature
   


   		USB_CBW.dCBWFlags = D14_Cntrl_Reg.D14_DATA_PORT_LSB;		//read in CBW Signature
   	
		
   		USB_CBW.bCBWLUN = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
   		USB_CBW.bCDBLength = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
		
   		USB_CBW.CBWCDB[0] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
   		USB_CBW.CBWCDB[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
   		USB_CBW.CBWCDB[2] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
   		USB_CBW.CBWCDB[3] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
   		USB_CBW.CBWCDB[4] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
   		USB_CBW.CBWCDB[5] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
   		USB_CBW.CBWCDB[6] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
   		USB_CBW.CBWCDB[7] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
   		USB_CBW.CBWCDB[8] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
   		USB_CBW.CBWCDB[9] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
   		USB_CBW.CBWCDB[10] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
   		USB_CBW.CBWCDB[11] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
   		USB_CBW.CBWCDB[12] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
   		USB_CBW.CBWCDB[13] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
   		USB_CBW.CBWCDB[14] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
   		USB_CBW.CBWCDB[15] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;


         if(!Kernel_Flag.BITS.Device_Init)
         {
            Kernel_Flag.BITS.Device_Init = 1;
            Init_Device();
         }
                                          
   		if(USB_CBW.Signature.VALUE != 0x55534243)     //check for valid signature in CBW
	   	   Invalid_CBW();
         else
		   {

		      CDB_Process();
            Kernel_Flag.BITS.Send_CSW = 1;
		   }
	   }

      if(Kernel_Flag.BITS.Error_Occur || Kernel_Flag.BITS.Transfer_Error)
         Error_Handle();
         
      if(Kernel_Flag.BITS.Send_CSW && !USB_Device.BITS.Halt)
      {
         CSW_Status();
         USB_CSW.bCSWStatus = 0;
      }

}


//***********************************************************************
//*										    							               *
//*	Routine 	:  CDB Process                                   		   *
//*	Input		:	IDE device taskfile register  				            *
//*	Output   :	None                               					      *
//*	Function	:	ATAPI protocol process                                *
//*																		               *
//***********************************************************************

void CDB_Process(void)
{

   if(Kernel_Flag.BITS.MASTER_ATAPI_DRIVE||
   	 Kernel_Flag.BITS.SLAVE_ATAPI_DRIVE)
	ATAPI_CMD_Protocol();
   else
      ATA_CMD_Translator();
}

//***********************************************************************
//*										    							               *
//*	Routine 	:  ATAPI_CMD_PROTOCOL                                   		   *
//*	Input		:	Endpoint FIFO                 				            *
//*	Output   :	None                               					      *
//*	Function	:	to check if command block wrapper is invalid          *
//*																		               *
//***********************************************************************

void ATAPI_CMD_Protocol(void)
{
		Byte_Transfered_Count.VALUE = 0;

   if(Kernel_Flag.BITS.MASTER_ATAPI_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_ERROR_FEATURE_TASKFILE = 1;	//DMA Transfer

 		Atapi_Bytecount.VALUE = USB_CBW.Length.VALUE;

      D14_Cntrl_Reg.D14_BYTECOUNT_LSB_TASKFILE = Atapi_Bytecount.Byte[3];
      D14_Cntrl_Reg.D14_BYTECOUNT_MSB_TASKFILE = Atapi_Bytecount.Byte[2];

      D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE = ATAPI_PACKET_COMMAND;

      do
		{

			switch(Check_ATAPI_Phase())
			{
				
			case ATAPI_Cmd_Packet_Phase   :  
         
                                          D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[0];
									               D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[1];
									               D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[2];
									               D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[3];
									               D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[4];
									               D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[5];
									               D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[6];
									               D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[7];
									               D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[8];
									               D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[9];
									               D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[10];
									               D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[11];

                                          Prev_State = ATAPI_Cmd_Packet_Phase;
									               break;
					
			case ATAPI_Write_Phase		   :

										               D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
                                             D14_Cntrl_Reg.D14_DMA_ENDPOINT = 4;


										               //ATAPI Required Byte Count
										               D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_LSB = Atapi_Bytecount.Byte[3];
										               D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE2 = Atapi_Bytecount.Byte[2];										
                                             D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE3 = Atapi_Bytecount.Byte[1];
										               D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_MSB = Atapi_Bytecount.Byte[0];
                                             
                                             D14_Cntrl_Reg.D14_DMA_COMMAND = MDMA_Write_Command;

										               while(!DMA_Int_Flag.BITS.CMD_INTRQ_OK && !DMA_Int_Flag.BITS.INTRQ_SEEN)
                                             {
                                                if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
                                                   return;
                                             }
                                                                                          
										               Byte_Transfered_Count.Byte[3] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_LSB;
                                             Byte_Transfered_Count.Byte[2] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE2;
                                             Byte_Transfered_Count.Byte[1] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE3;
                                             Byte_Transfered_Count.Byte[0] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_MSB;
                                                                                          
                                             if(DMA_Int_Flag.BITS.INTRQ_SEEN && !DMA_Int_Flag.BITS.CMD_INTRQ_OK)
                                             {
                                                DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
                                                Temp = D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE;

                                                
                                                if(Byte_Transfered_Count.VALUE != 0)
                                                {                                                   
                                                   //added for future implementation as current version
                                                   //does not support this command                                                   
                                                   D14_Cntrl_Reg.D14_DMA_COMMAND = DMA_FLUSH;
                                                   Kernel_Flag.BITS.Transfer_Error = 1;

                                                }
                                                else
                                                {
                                                 
                                                   while(!DMA_Int_Flag.BITS.CMD_INTRQ_OK)
                                                   {
                                                      if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
                                                         return;
                                                   }      

                                                   DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
                                                }                                                                                                      
                                             }
                                             else
                                             {
                                                if(DMA_Int_Flag.BITS.CMD_INTRQ_OK &&
                                                   DMA_Int_Flag.BITS.INTRQ_SEEN)
                                                {   
										                     DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
                                                   DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
                                                }
                                                else
                                                {
                                                                                                   
                                                   DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
                                                                                                      
                                                   while(!DMA_Int_Flag.BITS.CMD_INTRQ_OK && !DMA_Int_Flag.BITS.INTRQ_SEEN)
                                                   {
                                                      if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
                                                         return;
                                                   }      
                                                   
                                                   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_Write_Phase;
									                  break;
                                          
			case ATAPI_Read_Phase		   :
										               D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
                                             D14_Cntrl_Reg.D14_DMA_ENDPOINT = 5;

                                             D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_LSB = Atapi_Bytecount.Byte[3];
										               D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE2 = Atapi_Bytecount.Byte[2];										
                                             D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE3 = Atapi_Bytecount.Byte[1];
										               D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_MSB = Atapi_Bytecount.Byte[0];
                                                                                          
                                             D14_Cntrl_Reg.D14_DMA_COMMAND = MDMA_Read_Command;

										               while(!DMA_Int_Flag.BITS.CMD_INTRQ_OK && !DMA_Int_Flag.BITS.INTRQ_SEEN)
                                             {
                                                if(Kernel_Flag.BITS.Bus_Reset  || USB_Int_Flag.BITS.SUSP)
                                                   return;
                                                   
                                             }
                                                                                          

										               Byte_Transfered_Count.Byte[3] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_LSB;
                                             Byte_Transfered_Count.Byte[2] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE2;
                                             Byte_Transfered_Count.Byte[1] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE3;
                                             Byte_Transfered_Count.Byte[0] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_MSB;
                                                                                            
                                             if(DMA_Int_Flag.BITS.INTRQ_SEEN && !DMA_Int_Flag.BITS.CMD_INTRQ_OK)
                                             {
                                                DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
                                                Temp = D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE;

                                                                                                   
                                                //added for future implementation as current version
                                                //does not support this command 
                                                
                                                if(Byte_Transfered_Count.VALUE != 0)
                                                {                     
                                                   D14_Cntrl_Reg.D14_DMA_COMMAND = DMA_FLUSH;
                                                   Kernel_Flag.BITS.Transfer_Error = 1;
                                                }

                                                while(!DMA_Int_Flag.BITS.CMD_INTRQ_OK)
                                                {
                                                   if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
                                                      return;
                                                }      

                                                DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
                                             }
                                             else
                                             {
                                                if(DMA_Int_Flag.BITS.CMD_INTRQ_OK &&
                                                   DMA_Int_Flag.BITS.INTRQ_SEEN)
                                                {   
										                     DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
                                                   DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
                                                }
                                                else
                                                {
                                                                                                   
                                                   DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
                                                                                                      
                                                   while(!DMA_Int_Flag.BITS.CMD_INTRQ_OK && !DMA_Int_Flag.BITS.INTRQ_SEEN)
                                                   {
                                                      if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
                                                         return;
                                                   }      

⌨️ 快捷键说明

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