📄 pio.c
字号:
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x01;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x1f;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
for(count = 0; count < 54; count++)
Temp = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB; // Skip unused info
for(;count < 82; count++)
{
Temp = 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 = (UC) Temp;
count++;
}
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;
for(; count < 512; count++)
Temp = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;
break;
case READ_10:
// USB_Int_Flag.BITS.EP2TX = 0;
//Get the sector count from command packet
Sector_Count = USB_CBW.CBWCDB[7];
Endpt_FIFO[0] = USB_CBW.Length.dCBWDataTransferLength[0];
Endpt_FIFO[1] = USB_CBW.Length.dCBWDataTransferLength[1];
Endpt_FIFO[2] = USB_CBW.Length.dCBWDataTransferLength[2];
Endpt_FIFO[3] = USB_CBW.Length.dCBWDataTransferLength[3];
do
{
if(Sector_Count != 0)
{
Atapi_Bytecount.VALUE = 0x00020000;
USB_CBW.Length.VALUE -= 0x00020000;
D14_Cntrl_Reg.D14_INTERRUPT_TASKFILE = 0;
}
else
{
if(USB_CBW.Length.VALUE != 0)
{
Atapi_Bytecount.VALUE = USB_CBW.Length.VALUE;
D14_Cntrl_Reg.D14_INTERRUPT_TASKFILE = USB_CBW.CBWCDB[8];
Kernel_Flag.BITS.Transfer_Done = 1;
}
else
return;
}
D14_Cntrl_Reg.D14_SECTOR_NUMBER = USB_CBW.CBWCDB[5];
D14_Cntrl_Reg.D14_BYTECOUNT_LSB_TASKFILE = USB_CBW.CBWCDB[4];
D14_Cntrl_Reg.D14_BYTECOUNT_MSB_TASKFILE = USB_CBW.CBWCDB[3];
if(Kernel_Flag.BITS.MASTER_ATA_DRIVE)
D14_Cntrl_Reg.D14_DRIVE_SELECT_TASKFILE = (MASTER_DRIVE | LBA_MODE | USB_CBW.CBWCDB[2]);
else
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 = READ_DMA;
#else
//issue read multiple command
D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE = READ_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];
if(Kernel_Flag.BITS.Transfer_Error)
Prev_State = ATAPI_Read_Phase;
Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;
break;
case READ_CAPACITY:
// USB_Int_Flag.BITS.EP2TX = 0;
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 8;
D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = Drive_Setup.LBA[0];
D14_Cntrl_Reg.D14_DATA_PORT_MSB = Drive_Setup.LBA[1];
D14_Cntrl_Reg.D14_DATA_PORT_LSB = Drive_Setup.LBA[2];
D14_Cntrl_Reg.D14_DATA_PORT_MSB = Drive_Setup.LBA[3];
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x02;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
/* while(!USB_Int_Flag.BITS.EP2TX)
{
if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
break;
}
USB_Int_Flag.BITS.EP2TX = 0;
*/
Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;
break;
case READ_FORMAT_CAPACITIES:
// USB_Int_Flag.BITS.EP2TX = 0;
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 12;
D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x08;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = Drive_Setup.LBA[0];
D14_Cntrl_Reg.D14_DATA_PORT_MSB = Drive_Setup.LBA[1];
D14_Cntrl_Reg.D14_DATA_PORT_LSB = Drive_Setup.LBA[2];
D14_Cntrl_Reg.D14_DATA_PORT_MSB = Drive_Setup.LBA[3];
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x02;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
Byte_Transfered_Count.VALUE = 0x12;
Prev_State = ATAPI_Status_Phase;
Kernel_Flag.BITS.Transfer_Error = 1;
/* while(!USB_Int_Flag.BITS.EP2TX)
{
if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
break;
}
USB_Int_Flag.BITS.EP2TX = 0;
*/
break;
case REQUEST_SENSE:
// USB_Int_Flag.BITS.EP2TX = 0;
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x70;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = Error_Code.SENSE_KEY;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x0A;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = Error_Code.ASC;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = Error_Code.ASCQ;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;
/* while(!USB_Int_Flag.BITS.EP2TX)
{
if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
break;
}
USB_Int_Flag.BITS.EP2TX = 0;
*/
Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;
break;
case MODE_SENSE_10:
// USB_Int_Flag.BITS.EP2TX = 0;
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x2A;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;
/* while(!USB_Int_Flag.BITS.EP2TX)
{
if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
break;
}
USB_Int_Flag.BITS.EP2TX = 0;
*/
Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;
break;
case START_STOP_UNIT:
case MODE_SENSE_06:
case MODE_SELECT_06:
Error_Code.SENSE_KEY = 5;
Error_Code.ASC = 0x24;
Error_Code.ASCQ = 0;
Kernel_Flag.BITS.Error_Occur = 1;
Prev_State = ATAPI_Cmd_Packet_Phase;
Byte_Transfered_Count.VALUE = 0;
break;
case WRITE_10:
// USB_Int_Flag.BITS.EP2TX = 0;
//Get the sector count from command packet
Sector_Count = USB_CBW.CBWCDB[7];
Endpt_FIFO[0] = USB_CBW.Length.dCBWDataTransferLength[0];
Endpt_FIFO[1] = USB_CBW.Length.dCBWDataTransferLength[1];
Endpt_FIFO[2] = USB_CBW.Length.dCBWDataTransferLength[2];
Endpt_FIFO[3] = USB_CBW.Length.dCBWDataTransferLength[3];
do
{
if(Sector_Count != 0)
{
Atapi_Bytecount.VALUE = 0x00020000;
USB_CBW.Length.VALUE -= 0x00020000;
D14_Cntrl_Reg.D14_INTERRUPT_TASKFILE = 0;
}
else
{
if(USB_CBW.Length.VALUE != 0)
{
Atapi_Bytecount.VALUE = USB_CBW.Length.VALUE;
D14_Cntrl_Reg.D14_INTERRUPT_TASKFILE = USB_CBW.CBWCDB[8];
Kernel_Flag.BITS.Transfer_Done = 1;
}
else
return;
}
D14_Cntrl_Reg.D14_SECTOR_NUMBER = USB_CBW.CBWCDB[5];
D14_Cntrl_Reg.D14_BYTECOUNT_LSB_TASKFILE = USB_CBW.CBWCDB[4];
D14_Cntrl_Reg.D14_BYTECOUNT_MSB_TASKFILE = USB_CBW.CBWCDB[3];
if(Kernel_Flag.BITS.MASTER_ATA_DRIVE)
D14_Cntrl_Reg.D14_DRIVE_SELECT_TASKFILE = (MASTER_DRIVE | LBA_MODE | USB_CBW.CBWCDB[2]);
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -