📄 init.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 : 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 + -