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

📄 init.c

📁 ISP1583 Mass Storgae Firmware
💻 C
📖 第 1 页 / 共 2 页
字号:
//***********************************************************************
//									     								                  *
//                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	:       Init.c                                        *
// 	Author		:       Albert Goh					 					      *
// 	Created		:       3 March 2000                               	* 
//                  	                                                   *
//***********************************************************************
//***********************************************************************
//                                                                      *
// Init.c is the initialization of the device attached and also the D14 *
// It will initialize the various variables and component.            	*
//                                                                      *
//***********************************************************************
//***********************************************************************
//                                                                      *
//  Module History														            *
//  **************														            *
//																		                  *
//  Date   	Version			Author				Changes					      *
//  ====	=======			======				=======					         *
//  030300	  0.1 			Albert				Created    				      *
//                                                                      *
//                                                                      *
//***********************************************************************

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

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


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

extern void Start_mSEC_Timer(Data);
extern void Start_SEC_Timer(Data);
extern TIMER Timer;
extern KERNEL Kernel_Flag;
extern USB_INT_FLAG	USB_Int_Flag;
extern USB_DEVICE USB_Device;
extern UI Temp;
extern UC Device_Config_Value;
extern UC idata Endpt_FIFO[64];
extern void Read_1F0(void);
extern UC ATAPI_State;
extern UC Prev_State;
extern ATAPI_BYTECOUNT Atapi_Bytecount;
extern void Check_Busy(void);
extern void TaskFile_Update(UC Command);

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

void Init_D14_SFR(void);
void Init_Endpoint(void);

void Init_Main(void);
void Init_8051(void);
void Init_Device(void);
void Init_D14(void);
void SetFeature(Type);
void Get_Device_Info(void);

//***********************************************************************
//*																		               *
//*	                     Variable Definition 							      *
//*																		               *
//***********************************************************************

DRIVE_CONFIG	Drive_Setup;
DATA_SWAP	idata	Data_Swap;
DMA_INT_FLAG	DMA_Int_Flag;
CHIP_ID idata ID;

UI	count;
UC	Device_Config_Value;

volatile D14_CNTRL_REG	xdata	D14_Cntrl_Reg	_at_	0x0000;

//***********************************************************************
//*										    							               *
//*	Routine 	: Init Main                                        		*
//*	Input		: 8051 & ISP1581 Special Function Register   				*
//*	Output	: None                                  					   *
//*	Function	: To initialize 8051 & ISP1581              			      *
//*																		               *
//***********************************************************************

void Init_Main(void)
{
   //initialize 8051
   Init_8051();							


   //Reset IDE device         
   RESET_IDE = 0;
   Start_mSEC_Timer(10);
   RESET_IDE = 1;
   Start_mSEC_Timer(10);



   //Disable ISP1581 Reset   
   ISP1581_RESET = 1;

   //reset ISP1581
   ISP1581_RESET = 0;
   Start_mSEC_Timer(10);
   ISP1581_RESET = 1;

   //Chip Select ISP1581
   ISP1581_CS = 0;
/*
	do
		{

		ID.CHIP_ID[3] = D14_Cntrl_Reg.D14_CHIP_ID_LSB;
		ID.CHIP_ID[2] = D14_Cntrl_Reg.D14_CHIP_ID_MBYTE;
		ID.CHIP_ID[1] = D14_Cntrl_Reg.D14_CHIP_ID_MSB;
		ID.CHIP_ID[0] =0;

	}while(ID.ID_NO != 0x00158230);
	
  */

   //reset internal variable
   Atapi_Bytecount.VALUE = 0;
   USB_Int_Flag.VALUE = 0;
	DMA_Int_Flag.VALUE = 0;
	Kernel_Flag.VALUE = 0;

   //set device to default full speed
	Kernel_Flag.BITS.HS_FS_State = FULL_SPEED;
   HS_FS_LED = FULL_SPEED_LED;

   //Initialize the D14
	Init_D14();
   
   EX0 = 1;
}



//***********************************************************************
//*										    							               *
//*	Routine 	: Init 8051                                        		*
//*	Input		: 8051 Special Function Register   				            *
//*	Output	: None                                  					   *
//*	Function	: To initialize 8051                        			      *
//*																		               *
//***********************************************************************

void Init_8051(void)
{

   //set to crystal clocking
	//set to timer mode
	//select 16 bit timer
	TMOD = 0x01;

   //initialize the timer scale factor                                                      
	Timer.mSEC_Scale = 2000;
	Timer.Hundred_mSEC_Scale = 20000;

   //reset timer control
	TCON = 0;		    

   //disable all interrupt
	EA = 0;				  

   //disable UART interrupt
	//disable timer 1 overflow interrupt
	//disable external interrupt 1
	//enable timer 0 overflow interrupt
	//disable external interrupt 0
	IE = 0x02;			

   //reset interrupt priority
	IP = 0;				
	PT1 = 1;
	PT0 = 1;

   //enable all interrupt
	EA = 1;				


   //disable all power mode control
   //enable half/doble baud rate 
	PCON = 0x40;	

}

//***********************************************************************
//*										    							               *
//*	Routine 	: Init Device                                      		*
//*	Input		: IDE Device                       				            *
//*	Output	: None                                  					   *
//*	Function	: To initialize IDE Device                  			      *
//*																		               *
//***********************************************************************

void Init_Device(void)
{

   //reset internal variable
	ATAPI_State = 0;
	Prev_State = 0;
   count = 0;


   //get IDE device identify device
	Get_Device_Info();


   //Reset all system flags
   Kernel_Flag.BITS.Bus_Reset = 0;


   //added to allow other mode to be tested
   Drive_Setup.UDMA_Mode = 0;
   //Drive_Setup.MDMA_Mode = 0;

	//Cater for those drive that will generate the INTRQ after the reading out of all the identify drive command data
	DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
	DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;

   //check if device support PIO transfer
   switch(Drive_Setup.Advanced_PIO & 0x0007)
   {
      //check if PIO mode 4 supported
   	case	PIO4	:
				         //set ISP1581 to PIO mode 4
           				D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.PIO_MODE = 4;
   		            SetFeature(0x0C);
							break;

      //check if PIO mode 3 supported
		case	PIO3	:

			            //set ISP1581 to PIO mode 3
           			   D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.PIO_MODE = 3;
		               SetFeature(0x0B);
							break;


		default		:
			            //set ISP1581 to PIO mode 2
           			   D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.PIO_MODE = 2;
   	               SetFeature(0x0A);
							break;
   }

   //check if device support UDMA transfer mode
   switch(Drive_Setup.UDMA_Mode & 0x0007)
   {
      //check if UDMA mode 2 supported
      case UDMA2	:
					   	//set ISP1581 & device to UDMA mode 2 transfer
				         D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.DMA_MODE = 2;
				         SetFeature(0x42);
							break;


      //check if UDMA mode 1 supported
		case	UDMA1	:
			         	//set ISP1581 & device to UDMA mode 1 transfer
    				      D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.DMA_MODE = 1;
            			SetFeature(0x41);
							break;

      //check if UDMA mode 0 supported
      case	UDMA0	:
		               //set ISP1581 & device to UDMA mode 0 transfer
      		         D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.DMA_MODE = 0;
            		   SetFeature(0x40);
							break;

		default		:
                     break;

	}
  
   if((Drive_Setup.UDMA_Mode & 0x0007) == 0)
   {	
    
	   //check if device support MDMA transfer
      switch(Drive_Setup.MDMA_Mode & 0x0007)	
	   {
      
		   //check if MDMA mode 2 supported
   	   case	MDMA2	:
			               //set ISP1581 & device to MDMA mode 2 transfer
        			         D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.DMA_MODE = 2;
		                  SetFeature(0x22);
							   break;

         //check if MDMA mode 1 supported
		   case	MDMA1	:
		                  //set ISP1581 & device to MDMA mode 1 transfer
        		            D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.DMA_MODE = 1;
            		      SetFeature(0x21);
							   break;

		   //check if MDMA mode 0 supported
		   default		:
	      case	MDMA0	:
	                     //set ISP1581 & device to MDMA mode 0 transfer
     	                  D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.DMA_MODE = 0;
      	               SetFeature(0x20);
      					   break;
      }
   }         




}


//***********************************************************************
//*										    							               *
//*	Routine 	: Set Feature                                      		*
//*	Input		: IDE Device                       				            *
//*	Output	: None                                  					   *
//*	Function	: To set transfer mode of IDE device        			      *
//*																		               *
//***********************************************************************

void SetFeature(Type)
{
   
   //select master drive
   if(Kernel_Flag.BITS.MASTER_ATA_DRIVE || 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();
   	}
	
   //initialize taskfile for the setting of transfer mode
	D14_Cntrl_Reg.D14_ERROR_FEATURE_TASKFILE = Transfer_Mode;
	D14_Cntrl_Reg.D14_INTERRUPT_TASKFILE = Type;
	D14_Cntrl_Reg.D14_SECTOR_NUMBER = 0; 
	D14_Cntrl_Reg.D14_BYTECOUNT_LSB_TASKFILE = 0; 
	D14_Cntrl_Reg.D14_BYTECOUNT_MSB_TASKFILE = 0;

   //initialize the DMA transfer counter to zero
   //for the two bit interrupt clearing system
   D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_LSB = 0;
	D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE2 = 0;
	D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE3 = 0;
	D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_MSB = 0;

   //issue set feature command to device
	D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE = SET_FEATURE;


   //check for the completion of the set feature command
   //error recovery added to detect for suspend and bus reset
 	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;
   

}

//***********************************************************************
//*										    							               *
//*	Routine 	: Init D14                                         		*
//*	Input		: ISP1581 SFR                      				            *
//*	Output	: None                                  					   *
//*	Function	: To initialize ISP1581                     			      *
//*																		               *
//***********************************************************************

void Init_D14(void)
{
   

⌨️ 快捷键说明

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