📄 pio.c
字号:
//***********************************************************************
// *
// P H I L I P S P R O P R I E T A R Y *
// *
// COPYRIGHT (c) 1999 BY PHILIPS SINGAPORE (APIC). *
// -- ALL RIGHTS RESERVED -- *
// *
// File Name : PIODebug.c *
// Author : Albert Goh *
// Created : 3 March 2000 *
// *
//***********************************************************************
//***********************************************************************
// *
// PIODebug.c contain the routine for the debugging of the PIO,UDMA & *
// MDMA mode of the D14. It will transfer data via the various mode *
// *
//***********************************************************************
//***********************************************************************
// *
// Module History *
// ************** *
// *
// Date Version Author Changes *
// ==== ======= ====== ======= *
// 030300 0.1 Albert Created *
// *
// *
//***********************************************************************
//***********************************************************************
//* *
//* Include Files Definition *
//* *
//***********************************************************************
#include "standard.h"
#include "Kernel.h"
#include "D14.h"
#define MDMA_MODE
//***********************************************************************
//* *
//* External Definition *
//* *
//***********************************************************************
extern volatile D14_CNTRL_REG xdata D14_Cntrl_Reg;
extern DMA_INT_FLAG DMA_Int_Flag;
extern USB_DEVICE_REQ idata USB_Device_Request;
extern USB_INT_FLAG USB_Int_Flag;
extern USB_DEVICE USB_Device;
extern KERNEL Kernel_Flag;
extern UI count;
extern UI Temp;
extern void Init_D14(void);
extern void Init_Device(void);
extern UC idata Endpt_FIFO[64];
extern UC code *Descriptor_Ptr;
extern DRIVE_CONFIG Drive_Setup;
extern void Start_mSEC_Timer(Data);
extern void Start_SEC_Timer(Data);
extern void Init_Device(void);
extern DATA_SWAP idata Data_Swap;
//***********************************************************************
//* *
//* Variables Definition *
//* *
//***********************************************************************
UC ATAPI_State;
UC Prev_State;
UC Sector_Count;
USBCBW USB_CBW;
USBCSW USB_CSW;
BYTECOUNT Byte_Transfered_Count;
ATAPI_BYTECOUNT Atapi_Bytecount;
ERROR Error_Code;
//***********************************************************************
//* *
//* Prototype Definition *
//* *
//***********************************************************************
void CDB_Process(void);
bit Check_Valid_CBW(void);
void Invalid_CBW(void);
void CSW_Status(void);
void Get_CBW(void);
void Read_1F0(void);
void ATA_CMD_Translator(void);
void ATAPI_CMD_Protocol(void);
void Data_Transfer(void);
void Error_Handle(void);
void TaskFile_Update(UC Command);
void Check_Busy(void);
void Read_1F0(void);
//***********************************************************************
//* *
//* Routine Definition *
//* *
//***********************************************************************
//***********************************************************************
//* *
//* Routine : TaskFile Update *
//* Input : IDE device taskfile register *
//* Output : None *
//* Function : to get a copy of IDE device taskfile register *
//* *
//***********************************************************************
void TaskFile_Update(UC Command)
{
D14_Cntrl_Reg.D14_DMA_COMMAND = Command;
//Check for taksfile update command completion
while(!DMA_Int_Flag.BITS.TASKFILE_READ_COMPLETE)
{
if(Kernel_Flag.BITS.Bus_Reset)
return;
}
DMA_Int_Flag.BITS.TASKFILE_READ_COMPLETE = 0;
}
//***********************************************************************
//* *
//* Routine : Check Busy *
//* Input : IDE device taskfile register *
//* Output : None *
//* Function : to check if IDE device is busy *
//* *
//***********************************************************************
void Check_Busy(void)
{
D14_Cntrl_Reg.D14_DMA_COMMAND = POLL_BUSY;
//Check for Poll Bisuy comamnd completion
while(!DMA_Int_Flag.BITS.BSY_DRQ_POLL_DONE)
{
if(Kernel_Flag.BITS.Bus_Reset)
return;
}
DMA_Int_Flag.BITS.BSY_DRQ_POLL_DONE = 0;
}
//***********************************************************************
//* *
//* Routine : Read 1F0 *
//* Input : IDE device taskfile register *
//* Output : None *
//* Function : to read data taskfile register *
//* *
//***********************************************************************
void Read_1F0(void)
{
D14_Cntrl_Reg.D14_DMA_COMMAND = READ_1F0;
//Check for read 1F0 command completion
while(!DMA_Int_Flag.BITS.START_READ_1F0_RD_FIFO)
{
if(Kernel_Flag.BITS.Bus_Reset)
return;
}
DMA_Int_Flag.BITS.START_READ_1F0_RD_FIFO = 0;
}
//***********************************************************************
//* *
//* Routine : Check ATAPI Phase *
//* Input : IDE device taskfile register *
//* Output : None *
//* Function : to determine the state of IDE device *
//* *
//***********************************************************************
UC Check_ATAPI_Phase(void)
{
//Transfer is set to DMA mode
switch(ATAPI_State)
{
case ATAPI_Cmd_Packet_Phase :
if(USB_CBW.Length.VALUE != 0)
{
if(USB_CBW.dCBWFlags == 0x80)
ATAPI_State = ATAPI_Read_Phase;
else
ATAPI_State = ATAPI_Write_Phase;
}
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(ATAPI_State);
}
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;
}
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(ATAPI_State);
}
DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;
DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
}
}
TaskFile_Update(READ_3F6_TASKFILE);
if(USB_CBW.CBWCDB[0] == 0x0b)
Temp = 1;
ATAPI_State = ATAPI_Status_Phase;
}
break;
case ATAPI_Read_Phase :
case ATAPI_Write_Phase :
TaskFile_Update(READ_3F6_TASKFILE);
ATAPI_State = ATAPI_Status_Phase;
break;
case ATAPI_Status_Phase :
default :
Check_Busy();
TaskFile_Update(READ_3F6_TASKFILE);
TaskFile_Update(READ_1F2_TASKFILE);
Temp = D14_Cntrl_Reg.D14_ALT_STATUS_DEVCNTRL_TASKFILE;
if(Temp & 0x01)
ATAPI_State = ATAPI_Status_Phase;
Temp &= 0x08;
Temp |= D14_Cntrl_Reg.D14_INTERRUPT_TASKFILE;
Temp &= 0x0B;
ATAPI_State = Temp;
break;
}
return(ATAPI_State);
}
//***********************************************************************
//* *
//* Routine : PIO Debug Mode *
//* Input : None *
//* Output : None *
//* Function : main PIO loop *
//* *
//***********************************************************************
void PIO_Debug_Mode(void)
{
D14_Cntrl_Reg.D14_ENDPT_INDEX = 4; //point to Bulk Out Endpoint
D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2; //point to Bulk Out Endpoint
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -