📄 kernel.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 + -