📄 pio.c
字号:
count = D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB; //read out buffer length
count <<= 8;
count |= D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB;
if(count == 31)
{
USB_CBW.Signature.dCBWSignature[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB; //read in CBW Signature
USB_CBW.Signature.dCBWSignature[1] = D14_Cntrl_Reg.D14_DATA_PORT_MSB; //read in CBW Signature
USB_CBW.Signature.dCBWSignature[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB; //read in CBW Signature
USB_CBW.Signature.dCBWSignature[3] = D14_Cntrl_Reg.D14_DATA_PORT_MSB; //read in CBW Signature
USB_CBW.dCBWTag[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB; //read in CBW Signature
USB_CBW.dCBWTag[1] = D14_Cntrl_Reg.D14_DATA_PORT_MSB; //read in CBW Signature
USB_CBW.dCBWTag[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB; //read in CBW Signature
USB_CBW.dCBWTag[3] = D14_Cntrl_Reg.D14_DATA_PORT_MSB; //read in CBW Signature
USB_CBW.Length.dCBWDataTransferLength[3] = D14_Cntrl_Reg.D14_DATA_PORT_LSB; //read in CBW Signature
USB_CBW.Length.dCBWDataTransferLength[2] = D14_Cntrl_Reg.D14_DATA_PORT_MSB; //read in CBW Signature
USB_CBW.Length.dCBWDataTransferLength[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB; //read in CBW Signature
USB_CBW.Length.dCBWDataTransferLength[0] = D14_Cntrl_Reg.D14_DATA_PORT_MSB; //read in CBW Signature
USB_CBW.dCBWFlags = D14_Cntrl_Reg.D14_DATA_PORT_LSB; //read in CBW Signature
USB_CBW.bCBWLUN = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
USB_CBW.bCDBLength = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
USB_CBW.CBWCDB[0] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
USB_CBW.CBWCDB[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
USB_CBW.CBWCDB[2] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
USB_CBW.CBWCDB[3] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
USB_CBW.CBWCDB[4] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
USB_CBW.CBWCDB[5] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
USB_CBW.CBWCDB[6] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
USB_CBW.CBWCDB[7] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
USB_CBW.CBWCDB[8] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
USB_CBW.CBWCDB[9] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
USB_CBW.CBWCDB[10] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
USB_CBW.CBWCDB[11] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
USB_CBW.CBWCDB[12] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
USB_CBW.CBWCDB[13] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
USB_CBW.CBWCDB[14] = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
USB_CBW.CBWCDB[15] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
if(!Kernel_Flag.BITS.Device_Init)
{
Kernel_Flag.BITS.Device_Init = 1;
Init_Device();
}
if(USB_CBW.Signature.VALUE != 0x55534243) //check for valid signature in CBW
Invalid_CBW();
else
{
CDB_Process();
Kernel_Flag.BITS.Send_CSW = 1;
}
}
if(Kernel_Flag.BITS.Error_Occur || Kernel_Flag.BITS.Transfer_Error)
Error_Handle();
if(Kernel_Flag.BITS.Send_CSW && !USB_Device.BITS.Halt)
{
CSW_Status();
USB_CSW.bCSWStatus = 0;
}
}
//***********************************************************************
//* *
//* Routine : CDB Process *
//* Input : IDE device taskfile register *
//* Output : None *
//* Function : ATAPI protocol process *
//* *
//***********************************************************************
void CDB_Process(void)
{
if(Kernel_Flag.BITS.MASTER_ATAPI_DRIVE||
Kernel_Flag.BITS.SLAVE_ATAPI_DRIVE)
ATAPI_CMD_Protocol();
else
ATA_CMD_Translator();
}
//***********************************************************************
//* *
//* Routine : ATAPI_CMD_PROTOCOL *
//* Input : Endpoint FIFO *
//* Output : None *
//* Function : to check if command block wrapper is invalid *
//* *
//***********************************************************************
void ATAPI_CMD_Protocol(void)
{
Byte_Transfered_Count.VALUE = 0;
if(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();
}
D14_Cntrl_Reg.D14_ERROR_FEATURE_TASKFILE = 1; //DMA Transfer
Atapi_Bytecount.VALUE = USB_CBW.Length.VALUE;
D14_Cntrl_Reg.D14_BYTECOUNT_LSB_TASKFILE = Atapi_Bytecount.Byte[3];
D14_Cntrl_Reg.D14_BYTECOUNT_MSB_TASKFILE = Atapi_Bytecount.Byte[2];
D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE = ATAPI_PACKET_COMMAND;
do
{
switch(Check_ATAPI_Phase())
{
case ATAPI_Cmd_Packet_Phase :
D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[0];
D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[1];
D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[2];
D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[3];
D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[4];
D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[5];
D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[6];
D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[7];
D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[8];
D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[9];
D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[10];
D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = USB_CBW.CBWCDB[11];
Prev_State = ATAPI_Cmd_Packet_Phase;
break;
case ATAPI_Write_Phase :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
D14_Cntrl_Reg.D14_DMA_ENDPOINT = 4;
//ATAPI Required Byte Count
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_LSB = Atapi_Bytecount.Byte[3];
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE2 = Atapi_Bytecount.Byte[2];
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE3 = Atapi_Bytecount.Byte[1];
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_MSB = Atapi_Bytecount.Byte[0];
D14_Cntrl_Reg.D14_DMA_COMMAND = MDMA_Write_Command;
while(!DMA_Int_Flag.BITS.CMD_INTRQ_OK && !DMA_Int_Flag.BITS.INTRQ_SEEN)
{
if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
return;
}
Byte_Transfered_Count.Byte[3] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_LSB;
Byte_Transfered_Count.Byte[2] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE2;
Byte_Transfered_Count.Byte[1] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE3;
Byte_Transfered_Count.Byte[0] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_MSB;
if(DMA_Int_Flag.BITS.INTRQ_SEEN && !DMA_Int_Flag.BITS.CMD_INTRQ_OK)
{
DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
Temp = D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE;
if(Byte_Transfered_Count.VALUE != 0)
{
//added for future implementation as current version
//does not support this command
D14_Cntrl_Reg.D14_DMA_COMMAND = DMA_FLUSH;
Kernel_Flag.BITS.Transfer_Error = 1;
}
else
{
while(!DMA_Int_Flag.BITS.CMD_INTRQ_OK)
{
if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
return;
}
DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
}
}
else
{
if(DMA_Int_Flag.BITS.CMD_INTRQ_OK &&
DMA_Int_Flag.BITS.INTRQ_SEEN)
{
DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
}
else
{
DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
while(!DMA_Int_Flag.BITS.CMD_INTRQ_OK && !DMA_Int_Flag.BITS.INTRQ_SEEN)
{
if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
return;
}
DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
}
}
Byte_Transfered_Count.VALUE = (Atapi_Bytecount.VALUE - Byte_Transfered_Count.VALUE);
Atapi_Bytecount.VALUE = 0;
Prev_State = ATAPI_Write_Phase;
break;
case ATAPI_Read_Phase :
D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
D14_Cntrl_Reg.D14_DMA_ENDPOINT = 5;
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_LSB = Atapi_Bytecount.Byte[3];
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE2 = Atapi_Bytecount.Byte[2];
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE3 = Atapi_Bytecount.Byte[1];
D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_MSB = Atapi_Bytecount.Byte[0];
D14_Cntrl_Reg.D14_DMA_COMMAND = MDMA_Read_Command;
while(!DMA_Int_Flag.BITS.CMD_INTRQ_OK && !DMA_Int_Flag.BITS.INTRQ_SEEN)
{
if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
return;
}
Byte_Transfered_Count.Byte[3] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_LSB;
Byte_Transfered_Count.Byte[2] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE2;
Byte_Transfered_Count.Byte[1] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE3;
Byte_Transfered_Count.Byte[0] = D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_MSB;
if(DMA_Int_Flag.BITS.INTRQ_SEEN && !DMA_Int_Flag.BITS.CMD_INTRQ_OK)
{
DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
Temp = D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE;
//added for future implementation as current version
//does not support this command
if(Byte_Transfered_Count.VALUE != 0)
{
D14_Cntrl_Reg.D14_DMA_COMMAND = DMA_FLUSH;
Kernel_Flag.BITS.Transfer_Error = 1;
}
while(!DMA_Int_Flag.BITS.CMD_INTRQ_OK)
{
if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
return;
}
DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
}
else
{
if(DMA_Int_Flag.BITS.CMD_INTRQ_OK &&
DMA_Int_Flag.BITS.INTRQ_SEEN)
{
DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
}
else
{
DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
while(!DMA_Int_Flag.BITS.CMD_INTRQ_OK && !DMA_Int_Flag.BITS.INTRQ_SEEN)
{
if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -