📄 pio.c
字号:
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_Read_Phase;
break;
case ATAPI_Status_Phase :
D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2;
if(D14_Cntrl_Reg.D14_ALT_STATUS_DEVCNTRL_TASKFILE & 0x01)
Kernel_Flag.BITS.Error_Occur = 1;
else
Kernel_Flag.BITS.Error_Occur = 0;
return;
default :
break;
}
}
while(1);
}
//***********************************************************************
//* *
//* Routine : Invalid CBW *
//* Input : Endpoint FIFO *
//* Output : None *
//* Function : to check if command block wrapper is invalid *
//* *
//***********************************************************************
void Invalid_CBW(void)
{
do
{
D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1; //stall Bulk Out Endpoint
while(!USB_Int_Flag.BITS.EP0SETUP)
{
if(Kernel_Flag.BITS.Bus_Reset)
return;
}
USB_Int_Flag.BITS.EP0SETUP = 0;
D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 0;
D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = OFF; //disable FIFO
D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = ON; //disable FIFO
D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
while(!USB_Int_Flag.BITS.EP0TX)
{
if(Kernel_Flag.BITS.Bus_Reset)
break;
}
USB_Int_Flag.BITS.EP0TX = 0;
while(!USB_Int_Flag.BITS.EP0SETUP)
{
if(Kernel_Flag.BITS.Bus_Reset)
return;
}
D14_Cntrl_Reg.D14_ENDPT_INDEX = 0x20;
USB_Device_Request.bmRequestType = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
USB_Device_Request.bRequest = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
USB_Device_Request.wValue = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
USB_Device_Request.wIndex = D14_Cntrl_Reg.D14_DATA_PORT_MSB;
USB_Device_Request.wLength = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
if(USB_Device_Request.bmRequestType == 0x21 &&
USB_Device_Request.bRequest == 0xff &&
USB_Device_Request.wValue == 0 &&
USB_Device_Request.wLength == 0)
{
Init_Device();
return;
}
}
while(1);
}
//***********************************************************************
//* *
//* Routine : Error Handling *
//* Input : Sense Key Additional Sense Code *
//* Output : None *
//* Function : to initialize error handling *
//* *
//***********************************************************************
void Error_Handle(void)
{
// USB_Int_Flag.BITS.EP2TX = 0;
if(USB_CBW.Length.VALUE != 0 && Prev_State == ATAPI_Cmd_Packet_Phase &&
USB_CBW.dCBWFlags == 0x80)
{
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;
}
if(USB_CBW.dCBWFlags == 0x80)
{
while(D14_Cntrl_Reg.D14_BUFFER_STATUS != 0)
{
if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
return;
}
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
USB_Device.BITS.Halt = 1;
}
else
{
if((Byte_Transfered_Count.VALUE == Atapi_Bytecount.VALUE) && Prev_State == ATAPI_Write_Phase)
{
if(Kernel_Flag.BITS.MASTER_ATAPI_DRIVE ||
Kernel_Flag.BITS.SLAVE_ATAPI_DRIVE)
{
D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
D14_Cntrl_Reg.D14_DMA_ENDPOINT = 1;
D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
USB_Device.BITS.Halt = 1;
}
}
}
if(Kernel_Flag.BITS.Error_Occur)
USB_CSW.bCSWStatus = 1;
else
USB_CSW.bCSWStatus = 0;
Kernel_Flag.BITS.Transfer_Error = 0;
Kernel_Flag.BITS.Error_Occur = 0;
}
//***********************************************************************
//* *
//* Routine : CSW Status *
//* Input : Endpoint FIFO *
//* Output : command status wrapper *
//* Function : to initialize endpoint FIFO with command status *
//* wrapper *
//***********************************************************************
void CSW_Status(void)
{
USB_CSW.Residue.VALUE = USB_CBW.Length.VALUE - Byte_Transfered_Count.VALUE;
Kernel_Flag.BITS.Bus_Reset = 0;
D14_Cntrl_Reg.D14_DMA_ENDPOINT = 9;
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
while(D14_Cntrl_Reg.D14_BUFFER_STATUS != 0)
{
if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
return;
}
D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 13;
D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x55;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x53;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x42;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x53;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = USB_CBW.dCBWTag[0];
D14_Cntrl_Reg.D14_DATA_PORT_MSB = USB_CBW.dCBWTag[1];
D14_Cntrl_Reg.D14_DATA_PORT_LSB = USB_CBW.dCBWTag[2];
D14_Cntrl_Reg.D14_DATA_PORT_MSB = USB_CBW.dCBWTag[3];
D14_Cntrl_Reg.D14_DATA_PORT_LSB = USB_CSW.Residue.dCSWDataResidue[3];
D14_Cntrl_Reg.D14_DATA_PORT_MSB = USB_CSW.Residue.dCSWDataResidue[2];
D14_Cntrl_Reg.D14_DATA_PORT_LSB = USB_CSW.Residue.dCSWDataResidue[1];
D14_Cntrl_Reg.D14_DATA_PORT_MSB = USB_CSW.Residue.dCSWDataResidue[0];
D14_Cntrl_Reg.D14_DATA_PORT_LSB = USB_CSW.bCSWStatus;
Kernel_Flag.BITS.Send_CSW = 0;
}
//***********************************************************************
//* *
//* Routine : ATA CDB Process *
//* Input : CBW Command *
//* Output : None *
//* Function : to translate the ATAPI to ATA command *
//* *
//***********************************************************************
void ATA_CMD_Translator(void)
{
Sector_Count = 0;
switch (USB_CBW.CBWCDB[0])
{
case INQUIRY:
// USB_Int_Flag.BITS.EP2TX = 0;
if(Kernel_Flag.BITS.MASTER_ATA_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_ENDPT_INDEX = 5;
if(USB_CBW.Length.VALUE == 6)
{
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00; //Direct access device
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00; //Non-removable media device
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x01;
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x1f;
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00;
Byte_Transfered_Count.VALUE = USB_CBW.Length.VALUE;
return;
}
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;
D14_Cntrl_Reg.D14_BYTECOUNT_LSB_TASKFILE = 0;
D14_Cntrl_Reg.D14_BYTECOUNT_MSB_TASKFILE = 2;
//issue identify device command
D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE = ID_ATA_DEVICE;
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;
Read_1F0();
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00; //Direct access device
D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0x00; //Non-removable media device
D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x00;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -