📄 pio.c
字号:
D14_Cntrl_Reg.D14_DRIVE_SELECT_TASKFILE = (SLAVE_DRIVE| LBA_MODE | USB_CBW.CBWCDB[2]);
#ifdef MDMA_MODE
//issue read multiple command
D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE = WRITE_DMA;
#else
//issue read multiple command
D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE = WRITE_SECTOR;
#endif
Kernel_Flag.BITS.Auto_PIO = 0;
Kernel_Flag.BITS.MDMA_Mode = 1;
Kernel_Flag.BITS.UDMA_Mode = 0;
Data_Transfer();
//decrement the loop count and increase the LBA address
Sector_Count--;
USB_CBW.CBWCDB[4] += 1;
}while(!Kernel_Flag.BITS.Transfer_Done &&
!Kernel_Flag.BITS.Transfer_Error);
Kernel_Flag.BITS.Transfer_Done = 0;
USB_CBW.Length.dCBWDataTransferLength[0] = Endpt_FIFO[0];
USB_CBW.Length.dCBWDataTransferLength[1] = Endpt_FIFO[1];
USB_CBW.Length.dCBWDataTransferLength[2] = Endpt_FIFO[2];
USB_CBW.Length.dCBWDataTransferLength[3] = Endpt_FIFO[3];
Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;
break;
case TEST_UNIT_READY:
Error_Code.SENSE_KEY = 0;
Error_Code.ASC = 0;
Error_Code.ASCQ = 0;
Kernel_Flag.BITS.Error_Occur = 0;
case VERIFY_10:
case PREVENT_ALLOW_MEDIUM_REMOVAL:
default:
// USB_Int_Flag.BITS.EP2TX = 0;
if(USB_CBW.Length.VALUE != 0 && USB_CBW.dCBWFlags == 0x80)
{
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;
/* while(!USB_Int_Flag.BITS.EP2TX)
{
if(Kernel_Flag.BITS.Bus_Reset)
break;
}
USB_Int_Flag.BITS.EP2TX = 0;
*/
}
Byte_Transfered_Count.VALUE = 0;
break;
}
}
//***********************************************************************
//* *
//* Routine : Transfer Mode *
//* Input : None *
//* Output : DMA command *
//* Function : to initialize data transfer stage *
//* *
//***********************************************************************
void Data_Transfer(void)
{
#ifdef MDMA_MODE
if(USB_CBW.dCBWFlags == 0)
{
D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
D14_Cntrl_Reg.D14_DMA_ENDPOINT = 4;
}
else
{
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];
if(USB_CBW.dCBWFlags == 0)
D14_Cntrl_Reg.D14_DMA_COMMAND = MDMA_Write_Command;
else
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;
if(Byte_Transfered_Count.VALUE != 0 && USB_CBW.dCBWFlags == 0x80)
{
//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;
}
}
Atapi_Bytecount.VALUE = 0;
#else
if(USB_CBW.dCBWFlags == 0)
{
D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2;
Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;
do
{
//Poll for busy
Check_Busy();
TaskFile_Update(READ_3F6_TASKFILE);
}while(!(D14_Cntrl_Reg.D14_ALT_STATUS_DEVCNTRL_TASKFILE && 0x08));
do
{
for(count = 0; count < 512 ; count++)
{
D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
count++;
}
//check for interrupt
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.VALUE -= 512;
if(((USB_CBW.Length.VALUE <= 512 || Byte_Transfered_Count.VALUE == 0) &&
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;
return;
}
else
{
if(DMA_Int_Flag.BITS.INTRQ_SEEN && !DMA_Int_Flag.BITS.CMD_INTRQ_OK)
{
D14_Cntrl_Reg.D14_DMA_COMMAND = DMA_FLUSH;
Temp = D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE;
}
}
}while(Byte_Transfered_Count.VALUE != 0);
Byte_Transfered_Count.VALUE = 0;
}
else
{
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;
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2;
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];
Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;
do
{
Read_1F0();
for(count = 0; count < 512 ; count++)
{
D14_Cntrl_Reg.D14_DATA_PORT_LSB = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
count++;
}
if(USB_CBW.Length.VALUE <= 512)
return;
Byte_Transfered_Count.VALUE -= 512;
if(Byte_Transfered_Count.VALUE == 0)
return;
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;
}
if(DMA_Int_Flag.BITS.INTRQ_SEEN && !DMA_Int_Flag.BITS.CMD_INTRQ_OK)
{
D14_Cntrl_Reg.D14_DMA_COMMAND = DMA_FLUSH;
Temp = D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE;
}
DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
}while(Byte_Transfered_Count.VALUE != 0);
Byte_Transfered_Count.VALUE = 0;
}
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -