📄 init.c
字号:
//call the initialization routine of ISP1581
Init_D14_SFR();
//Initialize Endpoint Size
Init_Endpoint();
//initialize internal varaible
USB_Device.BITS.State = USB_Default;
Device_Config_Value = 0;
USB_Device.BITS.Alter_Interface = 0;
}
//***********************************************************************
//* *
//* Routine : Init D14 SFR *
//* Input : ISP1581 SFR *
//* Output : None *
//* Function : To initialize ISP1581 *
//* *
//***********************************************************************
void Init_D14_SFR(void)
{
D14_Cntrl_Reg.D14_MODE.VALUE = 0x0802;
//set all interrupt source to mode 1
D14_Cntrl_Reg.D14_INT_CONFIG.VALUE = 0x54;
//set the interrupt mask register
D14_Cntrl_Reg.D14_INT_ENABLE.VALUE = 0x79090000;
//initialize the config and hardware register to
//set ISP1581 to ATAPI bridge mode
D14_Cntrl_Reg.D14_DMA_CONFIG.VALUE = 0x0122;
//enable DMA interrupt
D14_Cntrl_Reg.D14_DMA_INT_ENABLE.VALUE = 0x1E02;
}
//***********************************************************************
//* *
//* Routine : Init Endpoint *
//* Input : ISP1581 FIFO *
//* Output : None *
//* Function : To initialize ISP1581 endpoint FIFO *
//* *
//***********************************************************************
void Init_Endpoint(void)
{
//check if device in full speed state
if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
{
//Bulk Out MaxPacketSize Endpoint
D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;
//Bulk In MaxPacketSize Endpoint
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;
//Bulk Out Endpoint Type
D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;
//Bulk In Endpoint Type
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;
//enable FIFO
D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
//enable FIFO
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
}
//check if device in high speed
if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
{
//Bulk Out MaxPacketSize Endpoint
D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x0002;
//Bulk In MaxPacketSize Endpoint
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x0002;
//Bulk Out Endpoint Type
D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;
//Bulk In Endpoint Type
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;
//enable FIFO
D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
//enable FIFO
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
}
//set to DMA endpoint 1
//set to Endpoint Index to 2
//this is to prevent the endpoint index pointing to the same endpoint
D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2;
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.CLBUF = 1;
D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2;
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.CLBUF = 1;
//enable device and reset the device address
D14_Cntrl_Reg.D14_ADDRESS.VALUE = 0x80;
}
//***********************************************************************
//* *
//* Routine : Get Device Info *
//* Input : IDE Device *
//* Output : None *
//* Function : To retrieve identify drive command data *
//* *
//***********************************************************************
void Get_Device_Info(void)
{
//reset all drive internal variable
Drive_Setup.General_Config = 0;
Drive_Setup.PIO_Mode = 0;
Drive_Setup.MDMA_Mode = 0;
Drive_Setup.Advanced_PIO = 0;
Drive_Setup.UDMA_Mode = 0;
//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 bytecount taskfile register to 512 bytes
D14_Cntrl_Reg.D14_BYTECOUNT_LSB_TASKFILE = 0;
D14_Cntrl_Reg.D14_BYTECOUNT_MSB_TASKFILE = 2;
//check if device is an ATAPI device, if yes issue
//ATAPI identify drive command
if(Kernel_Flag.BITS.MASTER_ATAPI_DRIVE ||
Kernel_Flag.BITS.SLAVE_ATAPI_DRIVE)
D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE = ID_ATAPI_DEVICE;
//check if device is an ATA device, if yes issue
//ATA identify drive command
if(Kernel_Flag.BITS.MASTER_ATA_DRIVE ||
Kernel_Flag.BITS.SLAVE_ATA_DRIVE)
D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE = ID_ATA_DEVICE; //issue identify device command
//check for completion of ATAPI command and clear flag
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;
//set DMA counter to 512 bytes
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_LSB = 0;
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE2 = 2;
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE3 = 0;
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_MSB = 0;
//issue read 1F0 command to ISP1581
Read_1F0();
//retrieve identify drive command data
for(count = 0 ; count < 512 ; count++)
{
switch(count)
{
//General Configuration
case 0 :
Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 1 :
Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
Drive_Setup.General_Config = Data_Swap.word;
break;
//Logical Cylinders
case 2 :
Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 3 :
Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
Drive_Setup.Logical_Cylinders = Data_Swap.word;
break;
//Logical Heads
case 6 :
Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 7 :
Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
Drive_Setup.Logical_Heads = Data_Swap.word;
break;
//Logical Sectors
case 12 :
Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 13 :
Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
Drive_Setup.Logical_Sectors = Data_Swap.word;
break;
//Max Sector Burst Length
case 94:
Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 95:
Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
Drive_Setup.Max_Burst_Length = Data_Swap.word;
break;
//PIO Mode
case 102:
Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 103:
Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
Drive_Setup.PIO_Mode = Data_Swap.word;
break;
//Current Cylinders
case 108:
Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 109:
Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
Drive_Setup.Current_Cylinders = Data_Swap.word;
break;
//Current Heads
case 110:
Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 111:
Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
Drive_Setup.Current_Heads = Data_Swap.word;
break;
//Current Sectors
case 112:
Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 113:
Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
Drive_Setup.Current_Sectors = Data_Swap.word;
break;
//Current Capacity
case 114 :
Drive_Setup.Current_Capacity[3] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 115 :
Drive_Setup.Current_Capacity[2] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 116 :
Drive_Setup.Current_Capacity[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 117 :
Drive_Setup.Current_Capacity[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
//Max LBA
case 120 :
Drive_Setup.LBA[3] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 121 :
Drive_Setup.LBA[2] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 122 :
Drive_Setup.LBA[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 123 :
Drive_Setup.LBA[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
//MDMA Transfer Mode
case 126:
Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 127:
Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
Drive_Setup.MDMA_Mode = Data_Swap.word;
break;
//Advanced PIO Mode
case 128:
Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 129:
Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
Drive_Setup.Advanced_PIO = Data_Swap.word;
break;
//UDMA Mode
case 176:
Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
case 177:
Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
Drive_Setup.UDMA_Mode = Data_Swap.word;
break;
default :
Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -