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

📄 kernel.c

📁 ISP1583单片机源程序
💻 C
字号:
//***********************************************************************
//									     								                  *
//                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	:       Kernel.c                                      *
// 	Author		:       Albert Goh					 					      *
// 	Created		:      	3 March 2000                               	*
//                  	                                                   *
//***********************************************************************
//***********************************************************************
//                                                                      *
// Kernel.c is the control centre for this evaluation firmware. It will *
// control where should the firmware branch through via the selection 	*
// of the UART port of the 8051. if not via the UART, it will be from 	*
// the selection of the code defintion                                  *
//                                                                      *
//***********************************************************************
//***********************************************************************
//                                                                      *
//  Module History														            *  
//  **************														            *
//																		                  *
//  Date   	Version			Author				Changes					      *
//  ====	  =======			======				=======					         *
//  200303  1.0         Albert        modified the ATA translation
//                                    Inquiry command for win98
//  120303  0.9         Albert        modified the USB routine to cater
//                                    for the new control pipe
//                                                                      *
//                                                                      *
//***********************************************************************
//***********************************************************************
//*																		               *
//*	                     Include Files Definition						   *
//*																		               *
//***********************************************************************

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

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

extern Init_Main();
extern USB_Debug_Mode();
extern PIO_Debug_Mode();
extern USB_INT_FLAG USB_Int_Flag;
extern DMA_INT_FLAG DMA_Int_Flag;
extern USB_DEVICE USB_Device;
extern volatile D14_CNTRL_REG	xdata	D14_Cntrl_Reg;
extern void Check_Busy(void);
extern void TaskFile_Update(UC Command);
extern void Init_D14(void);
extern void Init_Endpoint(void);
extern void Init_Device(void);
extern UC	idata Endpt_FIFO[64];

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

void Start_mSEC_Timer(Data);
void Start_SEC_Timer(Data);

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

UI	Temp;
KERNEL Kernel_Flag;
TIMER	Timer;

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

//***********************************************************************
//*										    							               *
//*	Routine 	:  Main                                          		   *
//*	Input		:  None            									            *
//*	Output   :	None                                  					   *
//*	Function	:	main loop                                			      *
//*																		               *
//***********************************************************************

void Main(void)
{

   //enable interrupt
	EA = 1;

   
   //Initialization routine
	Init_Main();			


   //reset IDE device
	Check_Busy();
     D14_Cntrl_Reg.D14_DRIVE_SELECT_TASKFILE = MASTER_DRIVE;
     Check_Busy();
	D14_Cntrl_Reg.D14_ALT_STATUS_DEVCNTRL_TASKFILE = 0x0c;	//DMA Transfer
 	D14_Cntrl_Reg.D14_ALT_STATUS_DEVCNTRL_TASKFILE = 0x08;	//DMA Transfer
	Check_Busy();
	
	TaskFile_Update(READ_1F1_TASKFILE);
	TaskFile_Update(READ_1F2_TASKFILE);
	TaskFile_Update(READ_1F3_TASKFILE);
	TaskFile_Update(READ_1F4_TASKFILE);
	TaskFile_Update(READ_1F5_TASKFILE);

         
   //check for valid signature of device
   if(D14_Cntrl_Reg.D14_BYTECOUNT_LSB_TASKFILE == 0x14 &&
      D14_Cntrl_Reg.D14_BYTECOUNT_MSB_TASKFILE == 0xEB &&
      D14_Cntrl_Reg.D14_ERROR_FEATURE_TASKFILE == 0x01 &&
      D14_Cntrl_Reg.D14_INTERRUPT_TASKFILE == 0x01)
   {
      Kernel_Flag.BITS.MASTER_ATAPI_DRIVE = 1;
      Kernel_Flag.BITS.MASTER_ATA_DRIVE = 0;
      Kernel_Flag.BITS.SLAVE_ATAPI_DRIVE = 0;
      Kernel_Flag.BITS.SLAVE_ATA_DRIVE = 0;
   }
   else
   {

      if(D14_Cntrl_Reg.D14_BYTECOUNT_LSB_TASKFILE == 0x00 &&
         D14_Cntrl_Reg.D14_BYTECOUNT_MSB_TASKFILE == 0x00 &&
         D14_Cntrl_Reg.D14_ERROR_FEATURE_TASKFILE == 0x01 &&
         D14_Cntrl_Reg.D14_INTERRUPT_TASKFILE == 0x01)
      {
         Kernel_Flag.BITS.MASTER_ATAPI_DRIVE = 0;
         Kernel_Flag.BITS.MASTER_ATA_DRIVE = 1;
         Kernel_Flag.BITS.SLAVE_ATAPI_DRIVE = 0;
         Kernel_Flag.BITS.SLAVE_ATA_DRIVE = 0;
      }
      else
      {
         Kernel_Flag.BITS.MASTER_ATAPI_DRIVE = 0;
         Kernel_Flag.BITS.MASTER_ATA_DRIVE = 0;
         Kernel_Flag.BITS.SLAVE_ATAPI_DRIVE = 0;
         Kernel_Flag.BITS.SLAVE_ATA_DRIVE = 0;
      }
   }

	Check_Busy();
    D14_Cntrl_Reg.D14_DRIVE_SELECT_TASKFILE = SLAVE_DRIVE;

		Check_Busy();

	TaskFile_Update(READ_1F1_TASKFILE);
	TaskFile_Update(READ_1F2_TASKFILE);
	TaskFile_Update(READ_1F3_TASKFILE);
	TaskFile_Update(READ_1F4_TASKFILE);
	TaskFile_Update(READ_1F5_TASKFILE);

   if(D14_Cntrl_Reg.D14_BYTECOUNT_LSB_TASKFILE == 0x14 &&
      D14_Cntrl_Reg.D14_BYTECOUNT_MSB_TASKFILE == 0xEB &&
      D14_Cntrl_Reg.D14_ERROR_FEATURE_TASKFILE == 0x01 &&
      D14_Cntrl_Reg.D14_INTERRUPT_TASKFILE == 0x01)
   {
      Kernel_Flag.BITS.SLAVE_ATAPI_DRIVE = 1;
      Kernel_Flag.BITS.SLAVE_ATA_DRIVE = 0;
   }
   else
   {

      if(D14_Cntrl_Reg.D14_BYTECOUNT_LSB_TASKFILE == 0x00 &&
         D14_Cntrl_Reg.D14_BYTECOUNT_MSB_TASKFILE == 0x00 &&
         D14_Cntrl_Reg.D14_ERROR_FEATURE_TASKFILE == 0x01 &&
         D14_Cntrl_Reg.D14_INTERRUPT_TASKFILE == 0x01)
      {
         Kernel_Flag.BITS.SLAVE_ATAPI_DRIVE = 0;
         Kernel_Flag.BITS.SLAVE_ATA_DRIVE = 1;
      }
      else
      {
         Kernel_Flag.BITS.SLAVE_ATAPI_DRIVE = 0;
         Kernel_Flag.BITS.SLAVE_ATA_DRIVE = 0;
      }
   }

	Kernel_Flag.BITS.Drive_Detected = 1;
	D14_Cntrl_Reg.D14_INT_ENABLE.VALUE = 0xF9090000;
	
	do
	{


      USB_Debug_Mode();
      
      //ATAPI routine
      PIO_Debug_Mode();	




	}
	while(1);

}



//***********************************************************************
//*										    							               *
//*	Routine 	: Start_mSEC_Timer(Delay)                          		*
//*	Input		: Delay in milli second									         *  
//*	Output		: Start timer operation               					   *
//*	Function	: To start the timeout operation based on the delay i/p  *
//*																		               *
//***********************************************************************

void Start_mSEC_Timer(Data)
{

   	
	do
	{

      //calculate timer value
	   Temp = Timer.mSEC_Scale;		
		Temp = 0xffff - Temp;


		ET0 = 1;

      //calculate timer value
      //initialize timer 0 counter
		Temp >>= 8;
		TH0 = (UC) Temp;
		Temp = Timer.mSEC_Scale;		
		Temp = 0xffff - Temp;
		TL0 = (UC) Temp;

      //start timer count
		TR0 = 1;							

		Kernel_Flag.BITS.Timer_Expired = 0;
		while(!Kernel_Flag.BITS.Timer_Expired)
			{
				if(USB_Int_Flag.BITS.EP0SETUP || Kernel_Flag.BITS.Bus_Reset)
					 break;
    			}    
		Kernel_Flag.BITS.Timer_Expired = 0;


      //stop timer
		TR0 = 0;							
		ET0 = 0;

		Data--;
	}
	while(Data != 0);
}

//***********************************************************************
//*										    							               *
//*	Routine 	: Start_SEC_Timer(Delay)                           		*
//*	Input		: Delay in second										            *
//*	Output		: Start timer operation               					   *
//*	Function	: To start the timeout operation based on the delay i/p  *
//*																		               *
//***********************************************************************

void Start_SEC_Timer(Data)
{


	Data *= 100;
		
	do
	{

      //calculate timer value
		Temp = Timer.Hundred_mSEC_Scale; 	
		Temp = 0xffff - Temp;


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

		ET0 = 1;

      //calculate timer value
      //initialize timer 0 counter
		Temp >>= 8;
		TH0 = (UC) Temp;
		Temp = Timer.Hundred_mSEC_Scale;
		Temp = 0xffff - Temp;
		TL0 = (UC) Temp;					

      //start timer count
		TR0 = 1;


		Kernel_Flag.BITS.Timer_Expired = 0;
		while(!Kernel_Flag.BITS.Timer_Expired)
			{
				if(USB_Int_Flag.BITS.EP0SETUP || Kernel_Flag.BITS.Bus_Reset)
					 break;
    			}    
		Kernel_Flag.BITS.Timer_Expired = 0;

      //stop timer
		TR0 = 0;				
		ET0 = 0;

		Data--;
	}
	while(Data != 0);
}


⌨️ 快捷键说明

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