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

📄 pio.c

📁 ISP1583 Mass Storgae Firmware
💻 C
📖 第 1 页 / 共 5 页
字号:
                  		D14_Cntrl_Reg.D14_DRIVE_SELECT_TASKFILE = (SLAVE_DRIVE| LBA_MODE | USB_CBW.CBWCDB[2]);
                     
#ifdef MDMA_MODE
                        //issue read multiple command
	      		         D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE = WRITE_DMA;		
#else                        
                        //issue read multiple command
	      		         D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE = WRITE_SECTOR;		
#endif

                        Kernel_Flag.BITS.Auto_PIO = 0;
                        Kernel_Flag.BITS.MDMA_Mode = 1;
                        Kernel_Flag.BITS.UDMA_Mode = 0;
               
                        Data_Transfer();
                           
                        //decrement the loop count and increase the LBA address
                        Sector_Count--;
                        USB_CBW.CBWCDB[4] += 1;
                              
                                                                                      
                     }while(!Kernel_Flag.BITS.Transfer_Done && 
                            !Kernel_Flag.BITS.Transfer_Error);

                     Kernel_Flag.BITS.Transfer_Done = 0;

                     USB_CBW.Length.dCBWDataTransferLength[0] = Endpt_FIFO[0];
                     USB_CBW.Length.dCBWDataTransferLength[1] = Endpt_FIFO[1];
                     USB_CBW.Length.dCBWDataTransferLength[2] = Endpt_FIFO[2];
                     USB_CBW.Length.dCBWDataTransferLength[3] = Endpt_FIFO[3];

                     Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;
                       
                     break;
                     
		case TEST_UNIT_READY:

                     Error_Code.SENSE_KEY = 0;
                     Error_Code.ASC = 0;
                     Error_Code.ASCQ = 0;      
                     Kernel_Flag.BITS.Error_Occur = 0;
      
      case VERIFY_10:
      case PREVENT_ALLOW_MEDIUM_REMOVAL:
      default:

//                     USB_Int_Flag.BITS.EP2TX = 0;                        

                     if(USB_CBW.Length.VALUE != 0 && USB_CBW.dCBWFlags == 0x80)
                     {
                        D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
                        D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;

                        
/*                        while(!USB_Int_Flag.BITS.EP2TX)
                        {
                           if(Kernel_Flag.BITS.Bus_Reset)
                              break;
                        }
                        
                        USB_Int_Flag.BITS.EP2TX = 0;
*/
                     }     

                     Byte_Transfered_Count.VALUE = 0;
                     
                     break;
   }      
}


//***********************************************************************
//*										    							               *
//*	Routine 	:  Transfer Mode                                 		   *
//*	Input		:	None                          				            *
//*	Output   :	DMA command                        					      *
//*	Function	:	to initialize data transfer stage                     *
//*					                     						               *
//***********************************************************************
void Data_Transfer(void)
{

#ifdef MDMA_MODE

   if(USB_CBW.dCBWFlags == 0)
   {
      D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
      D14_Cntrl_Reg.D14_DMA_ENDPOINT = 4;
   }
   else
   {
      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];
                                                                                          
   if(USB_CBW.dCBWFlags == 0)
      D14_Cntrl_Reg.D14_DMA_COMMAND = MDMA_Write_Command;
   else
      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;


      if(Byte_Transfered_Count.VALUE != 0 && USB_CBW.dCBWFlags == 0x80)
      {                                                                                                   
         //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;
         
      }    
   }
					
	Atapi_Bytecount.VALUE = 0;

#else



   if(USB_CBW.dCBWFlags == 0)
   {
      D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
      D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2;

      Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;

      do
      {
         //Poll for busy
         Check_Busy();
         TaskFile_Update(READ_3F6_TASKFILE);
      
      }while(!(D14_Cntrl_Reg.D14_ALT_STATUS_DEVCNTRL_TASKFILE && 0x08));

      do
      {
         for(count = 0; count < 512 ; count++)
         {
            D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = D14_Cntrl_Reg.D14_DATA_PORT_LSB;				
            D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
            count++;
         }
      
      
         //check for interrupt
         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.VALUE -= 512;

         if(((USB_CBW.Length.VALUE <= 512 || Byte_Transfered_Count.VALUE == 0) && 
            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;
            return;
         }
         else
         {
            
            if(DMA_Int_Flag.BITS.INTRQ_SEEN && !DMA_Int_Flag.BITS.CMD_INTRQ_OK)
            {
               D14_Cntrl_Reg.D14_DMA_COMMAND = DMA_FLUSH;
               Temp = D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE;

            }
         }        
      }while(Byte_Transfered_Count.VALUE != 0);     

      Byte_Transfered_Count.VALUE = 0;

   }
   else
   {

      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;
   

      D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
      D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2;
      
      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];

      Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;


      do
      {

         Read_1F0();
      
      
         for(count = 0; count < 512 ; count++)
         {
            D14_Cntrl_Reg.D14_DATA_PORT_LSB = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;				
            D14_Cntrl_Reg.D14_DATA_PORT_MSB = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
            count++;
         }
         
         if(USB_CBW.Length.VALUE <= 512)
            return;
      
         Byte_Transfered_Count.VALUE -= 512;
      
         if(Byte_Transfered_Count.VALUE == 0)
            return;
         
         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;
         }

                                                                                          
         if(DMA_Int_Flag.BITS.INTRQ_SEEN && !DMA_Int_Flag.BITS.CMD_INTRQ_OK)
         {
            D14_Cntrl_Reg.D14_DMA_COMMAND = DMA_FLUSH;
            Temp = D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE;

         }

         DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
         DMA_Int_Flag.BITS.INTRQ_SEEN = 0;

      }while(Byte_Transfered_Count.VALUE != 0);     

      Byte_Transfered_Count.VALUE = 0;
   }
   
#endif

}                                                                              




⌨️ 快捷键说明

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