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

📄 pio.c

📁 ISP1583 Mass Storgae Firmware
💻 C
📖 第 1 页 / 共 5 页
字号:
//***********************************************************************
//									     				                              *
//                P H I L I P S   P R O P R I E T A R Y          		   *
//                                                                      *
//          COPYRIGHT (c)   1999 BY PHILIPS SINGAPORE (APIC).    		   *
//                    --  ALL RIGHTS RESERVED  --                 		*	
//                                                                      *
// 	File Name	:       PIODebug.c                                    *
// 	Author		:       Albert Goh					 					      *
// 	Created		:      	3 March 2000                               	*
//                  	                                                   *
//***********************************************************************
//***********************************************************************
//                                                                      *
// PIODebug.c contain the routine for the debugging of the PIO,UDMA &   *
// MDMA mode of the D14. It will transfer data via the various mode   	*
//                                                                      *
//***********************************************************************
//***********************************************************************
//                                                                      *
//  Module History														            *
//  **************														            *
//																		                  *
//  Date   	Version			Author				Changes					      *
//  ====	   =======			======				=======					      *
//  030300	  0.1 			Albert				Created    				      *
//                                                                      *
//                                                                      *
//***********************************************************************

//***********************************************************************
//*																		               *
//*	                     Include Files Definition						   *
//*																		               *
//***********************************************************************

#include "standard.h"
#include "Kernel.h"
#include "D14.h"

#define MDMA_MODE

//***********************************************************************
//*																		               *
//*	                     External Definition 							      *  
//*																		               *
//***********************************************************************

extern volatile D14_CNTRL_REG	xdata	D14_Cntrl_Reg;

extern DMA_INT_FLAG DMA_Int_Flag;
extern USB_DEVICE_REQ	idata	USB_Device_Request;
extern USB_INT_FLAG USB_Int_Flag;
extern USB_DEVICE USB_Device;
extern KERNEL Kernel_Flag;
extern UI count;
extern UI Temp;
extern void Init_D14(void);
extern void Init_Device(void);
extern UC idata Endpt_FIFO[64];
extern UC	code	*Descriptor_Ptr;
extern DRIVE_CONFIG	Drive_Setup;
extern void Start_mSEC_Timer(Data);
extern void Start_SEC_Timer(Data);
extern void Init_Device(void);
extern DATA_SWAP	idata	Data_Swap;
	    
//***********************************************************************
//*																		               *
//*	                     Variables Definition 							   *
//*																		               *
//***********************************************************************

UC 			ATAPI_State;
UC			   Prev_State;
UC			   Sector_Count;
USBCBW		USB_CBW;
USBCSW		USB_CSW;

BYTECOUNT	Byte_Transfered_Count;
ATAPI_BYTECOUNT	Atapi_Bytecount;

ERROR Error_Code;

//***********************************************************************
//*																		               *
//*	                     Prototype Definition 							   *
//*																		               *
//***********************************************************************

void CDB_Process(void);
bit Check_Valid_CBW(void);
void Invalid_CBW(void);
void CSW_Status(void);
void Get_CBW(void);
void Read_1F0(void);
void ATA_CMD_Translator(void);
void ATAPI_CMD_Protocol(void);
void Data_Transfer(void);
void Error_Handle(void);
void TaskFile_Update(UC Command);
void Check_Busy(void);
void Read_1F0(void);
                  
//***********************************************************************
//*																		               *
//*	                     Routine Definition								   *
//*																		               *
//***********************************************************************

//***********************************************************************
//*										    							               *
//*	Routine 	:  TaskFile Update                               		   *
//*	Input		:	IDE device taskfile register  				            *
//*	Output   :	None                               					      *
//*	Function	:	to get a copy of IDE device taskfile register         *
//*																		               *
//***********************************************************************

void TaskFile_Update(UC Command)
{
   D14_Cntrl_Reg.D14_DMA_COMMAND = Command;

   //Check for taksfile update command completion
	while(!DMA_Int_Flag.BITS.TASKFILE_READ_COMPLETE)
   {
      if(Kernel_Flag.BITS.Bus_Reset)
         return;
   }
	DMA_Int_Flag.BITS.TASKFILE_READ_COMPLETE = 0;

}

//***********************************************************************
//*										    							               *
//*	Routine 	:  Check Busy                                    		   *
//*	Input		:	IDE device taskfile register  				            *
//*	Output   :	None                               					      *
//*	Function	:	to check if IDE device is busy                        *
//*																		               *
//***********************************************************************

void Check_Busy(void)
{

   D14_Cntrl_Reg.D14_DMA_COMMAND = POLL_BUSY;	
   
   //Check for Poll Bisuy comamnd completion
	while(!DMA_Int_Flag.BITS.BSY_DRQ_POLL_DONE)
   {
      if(Kernel_Flag.BITS.Bus_Reset)
         return;
   }
   
	DMA_Int_Flag.BITS.BSY_DRQ_POLL_DONE = 0;		

}




//***********************************************************************
//*										    							               *
//*	Routine 	:  Read 1F0                                      		   *
//*	Input		:	IDE device taskfile register  				            *
//*	Output   :	None                               					      *
//*	Function	:	to read data taskfile register                        *
//*																		               *
//***********************************************************************

void Read_1F0(void)
{

	D14_Cntrl_Reg.D14_DMA_COMMAND = READ_1F0;

   //Check for read 1F0 command completion
	while(!DMA_Int_Flag.BITS.START_READ_1F0_RD_FIFO)
   {
      if(Kernel_Flag.BITS.Bus_Reset)
         return;
   }
   
	DMA_Int_Flag.BITS.START_READ_1F0_RD_FIFO = 0;

}
																							   
//***********************************************************************
//*										    							               *
//*	Routine 	:  Check ATAPI Phase                             		   *
//*	Input		:	IDE device taskfile register  				            *
//*	Output   :	None                               					      *
//*	Function	:	to determine the state of IDE device                  *
//*																		               *
//***********************************************************************


UC Check_ATAPI_Phase(void)
{

      //Transfer is set to DMA mode
      switch(ATAPI_State)
      {
         case  ATAPI_Cmd_Packet_Phase  :  
                                          if(USB_CBW.Length.VALUE != 0)
                                          {
                                             if(USB_CBW.dCBWFlags == 0x80)
                                                ATAPI_State = ATAPI_Read_Phase;
                                             else
                                                ATAPI_State = ATAPI_Write_Phase;
                                          }
                                          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(ATAPI_State);
                                                   
                                             }
                                             

                                             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;
                                             }
                                             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(ATAPI_State);
                                                   }      
                                                   
                                                   DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
                                                   DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
                                                                                                  
                                                }    
                                             }
                        
                                             TaskFile_Update(READ_3F6_TASKFILE);

                                             if(USB_CBW.CBWCDB[0] == 0x0b)
                                                Temp = 1;

                                             ATAPI_State = ATAPI_Status_Phase;
                                          
                                          }         
                                          
                                          break;                                                                                                                             
                                                                        
         case  ATAPI_Read_Phase        :     
         case  ATAPI_Write_Phase       :
                                          TaskFile_Update(READ_3F6_TASKFILE);
                                          ATAPI_State = ATAPI_Status_Phase;
                                          break;
                           
         case     ATAPI_Status_Phase   :
         default                       :

								Check_Busy();
								TaskFile_Update(READ_3F6_TASKFILE);
                                          TaskFile_Update(READ_1F2_TASKFILE);

								Temp = D14_Cntrl_Reg.D14_ALT_STATUS_DEVCNTRL_TASKFILE;

								if(Temp & 0x01)
									ATAPI_State = ATAPI_Status_Phase;

								Temp &= 0x08;
								Temp |= D14_Cntrl_Reg.D14_INTERRUPT_TASKFILE;
								Temp &= 0x0B;
								ATAPI_State = Temp;
                                          break;
                                          
      }          
      
      return(ATAPI_State);                                                              
}          

//***********************************************************************
//*										    							               *
//*	Routine 	:  PIO Debug Mode                                		   *
//*	Input		:	None                          				            *
//*	Output   :	None                               					      *
//*	Function	:	main PIO loop                                         *
//*																		               *
//***********************************************************************

void PIO_Debug_Mode(void)
{

   	D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;								//point to Bulk Out Endpoint
   	D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2;								//point to Bulk Out Endpoint

⌨️ 快捷键说明

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