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

📄 pio.c

📁 ISP1583 Mass Storgae Firmware
💻 C
📖 第 1 页 / 共 5 页
字号:
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x01;  			
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x1f; 			
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;  		
  	  	               D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;  		
	  	               D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;  		

            		   for(count = 0; count < 54; count++)
                        Temp = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB; // Skip unused info
			
			            for(;count < 82; count++)
                     {
         				  Temp = 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 = (UC) Temp;
                       count++;				
                     }
                     


                    D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;
                    
                     for(; count < 512; count++)
			               Temp = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;

                     Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;
			            
                     break;

      case READ_10:

//                     USB_Int_Flag.BITS.EP2TX = 0;       
                     
                     //Get the sector count from command packet
                     Sector_Count = USB_CBW.CBWCDB[7];
                    
                     Endpt_FIFO[0] = USB_CBW.Length.dCBWDataTransferLength[0];
                     Endpt_FIFO[1] = USB_CBW.Length.dCBWDataTransferLength[1];
                     Endpt_FIFO[2] = USB_CBW.Length.dCBWDataTransferLength[2];
                     Endpt_FIFO[3] = USB_CBW.Length.dCBWDataTransferLength[3];
                         
                     do
                     {

                        if(Sector_Count != 0)
                        {
                   		   Atapi_Bytecount.VALUE = 0x00020000;
                           USB_CBW.Length.VALUE -= 0x00020000;
                           D14_Cntrl_Reg.D14_INTERRUPT_TASKFILE = 0;
                        }
                        else
                        {
                           if(USB_CBW.Length.VALUE != 0)
                           {
                   		      Atapi_Bytecount.VALUE = USB_CBW.Length.VALUE;
                              D14_Cntrl_Reg.D14_INTERRUPT_TASKFILE = USB_CBW.CBWCDB[8];
                              Kernel_Flag.BITS.Transfer_Done = 1;

                           }
                           else
                              return;
                           
                        }    
                         
                        D14_Cntrl_Reg.D14_SECTOR_NUMBER = USB_CBW.CBWCDB[5];
                        D14_Cntrl_Reg.D14_BYTECOUNT_LSB_TASKFILE = USB_CBW.CBWCDB[4];
                        D14_Cntrl_Reg.D14_BYTECOUNT_MSB_TASKFILE = USB_CBW.CBWCDB[3];
                     
  	 			if(Kernel_Flag.BITS.MASTER_ATA_DRIVE)
                  		D14_Cntrl_Reg.D14_DRIVE_SELECT_TASKFILE = (MASTER_DRIVE | LBA_MODE | USB_CBW.CBWCDB[2]);
   				else
                  		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 = READ_DMA;		
#else
                        //issue read multiple command
	      		         D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE = READ_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];

                     if(Kernel_Flag.BITS.Transfer_Error)
                        Prev_State = ATAPI_Read_Phase;

                     Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;

                     break;

      case READ_CAPACITY:

//                     USB_Int_Flag.BITS.EP2TX = 0;                        
      
  			            D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;

   	               D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 8;
                  	D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;			
        
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = Drive_Setup.LBA[0]; 			
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = Drive_Setup.LBA[1]; 			
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = Drive_Setup.LBA[2]; 			
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = Drive_Setup.LBA[3]; 			
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;  		
	  	               D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;  		
  	  	               D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x02;  		
	  	               D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;  		


/*                     while(!USB_Int_Flag.BITS.EP2TX)
                     {
                        if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
                           break;
                     }
                     USB_Int_Flag.BITS.EP2TX = 0;                        
*/
                     Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;
                     
                     break;

      case READ_FORMAT_CAPACITIES:

//                     USB_Int_Flag.BITS.EP2TX = 0;                        
      
  			            D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;

   	               D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 12;
                  	D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;			
        
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;  
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;  			
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x08;  			
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = Drive_Setup.LBA[0]; 			
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = Drive_Setup.LBA[1]; 			
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = Drive_Setup.LBA[2]; 			
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = Drive_Setup.LBA[3]; 			
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;  		
	  	               D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;  		
  	  	               D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x02;  		
	  	               D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;  		

                     Byte_Transfered_Count.VALUE = 0x12;

                     Prev_State = ATAPI_Status_Phase;
                     Kernel_Flag.BITS.Transfer_Error = 1;


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

                     USB_Int_Flag.BITS.EP2TX = 0;                        
*/
                     break;

      case REQUEST_SENSE:
      
//                     USB_Int_Flag.BITS.EP2TX = 0;                        
                     
  			            D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;

				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x70;
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = Error_Code.SENSE_KEY;
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x0A;
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = Error_Code.ASC;
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = Error_Code.ASCQ;
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
                     
            		   D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;


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

                     USB_Int_Flag.BITS.EP2TX = 0;                        
*/
                     Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;
                     
                     break;

      case  MODE_SENSE_10:

//                     USB_Int_Flag.BITS.EP2TX = 0;                        
                     
  			            D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;

				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x2A;
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
				         D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
                     
            		   D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;


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

                     USB_Int_Flag.BITS.EP2TX = 0;                        
*/
                     Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;
      
                     break;                     
                     
      case START_STOP_UNIT:
      case MODE_SENSE_06:
      case MODE_SELECT_06:
                     
                     Error_Code.SENSE_KEY = 5;
                     Error_Code.ASC = 0x24;
                     Error_Code.ASCQ = 0;      
                     Kernel_Flag.BITS.Error_Occur = 1;

                     Prev_State = ATAPI_Cmd_Packet_Phase;
                     
                     Byte_Transfered_Count.VALUE = 0;

                     break;
                                                              
      case WRITE_10:

//                     USB_Int_Flag.BITS.EP2TX = 0;       
                     
                     //Get the sector count from command packet
                     Sector_Count = USB_CBW.CBWCDB[7];
                    
                     Endpt_FIFO[0] = USB_CBW.Length.dCBWDataTransferLength[0];
                     Endpt_FIFO[1] = USB_CBW.Length.dCBWDataTransferLength[1];
                     Endpt_FIFO[2] = USB_CBW.Length.dCBWDataTransferLength[2];
                     Endpt_FIFO[3] = USB_CBW.Length.dCBWDataTransferLength[3];
                         
                     do
                     {

                        if(Sector_Count != 0)
                        {
                   		   Atapi_Bytecount.VALUE = 0x00020000;
                           USB_CBW.Length.VALUE -= 0x00020000;
                           D14_Cntrl_Reg.D14_INTERRUPT_TASKFILE = 0;
                        }
                        else
                        {
                           if(USB_CBW.Length.VALUE != 0)
                           {
                   		      Atapi_Bytecount.VALUE = USB_CBW.Length.VALUE;
                              D14_Cntrl_Reg.D14_INTERRUPT_TASKFILE = USB_CBW.CBWCDB[8];
                              Kernel_Flag.BITS.Transfer_Done = 1;

                           }
                           else
                              return;
                           
                        }    
                         
                        D14_Cntrl_Reg.D14_SECTOR_NUMBER = USB_CBW.CBWCDB[5];
                        D14_Cntrl_Reg.D14_BYTECOUNT_LSB_TASKFILE = USB_CBW.CBWCDB[4];
                        D14_Cntrl_Reg.D14_BYTECOUNT_MSB_TASKFILE = USB_CBW.CBWCDB[3];
                     
  	 			if(Kernel_Flag.BITS.MASTER_ATA_DRIVE)
                  		D14_Cntrl_Reg.D14_DRIVE_SELECT_TASKFILE = (MASTER_DRIVE | LBA_MODE | USB_CBW.CBWCDB[2]);
   				else

⌨️ 快捷键说明

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