📄 ata_driver.c
字号:
error = ATA_WaitRegBusy();
if (error)
return(error);
ATA_LBAL_B = *(pLBA+3);
error = ATA_WaitRegBusy();
if (error)
return(error);
ATA_LBAM_B = *(pLBA+2);
error = ATA_WaitRegBusy();
if (error)
return(error);
ATA_LBAH_B = *(pLBA+1);
error = ATA_WaitRegBusy();
if (error)
return(error);
if (*pLBA & 0xf0) // if memory > 128G
{
ATA_DDHR_B = 0x40;
error = ATA_WaitRegBusy();
if (error)
return(error);
if (ATACmd == kATACmdReadDMA)
{
ATA_DCR = (muint16) kATACmdReadDMAExt << kOneByte;
// error = ATA_WaitATABusyDRQ();
error = ATA_WaitATABusy();
if (error)
return(error);
ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMARD);
return (kATAPass);
}
else
{
if (ATACmd == kATACmdWriteDMA)
{
ATA_DCR = kATACmdWriteDMAExt << kOneByte;
error = ATA_WaitRegBusy();
if (error)
return(error);
while (mCheckBit(ATAINTRQ,PORTS));
// error = ATA_WaitATABusyDRQ();
error = ATA_WaitATABusy();
if (error)
return(error);
ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMAWR);
return (kATAPass);
}
}
}
else
{
ATA_DDHR_B =*pLBA | 0x40;
error = ATA_WaitRegBusy();
if (error)
return(error);
ATA_DCR = (muint16) ATACmd << kOneByte;
error = ATA_WaitRegBusy();
if (error)
return(error);
if (ATACmd == kATACmdReadDMA)
{
while (mCheckBit(ATAINTRQ,PORTS));
// error = ATA_WaitATABusyDRQ();
error = ATA_WaitATABusy();
if (error)
return(error);
ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMARD);
return (kATAPass);
}
else
{
if (ATACmd == kATACmdWriteDMA)
{
while (mCheckBit(ATAINTRQ,PORTS));
// error = ATA_WaitATABusyDRQ();
error = ATA_WaitATABusy();
if (error)
return(error);
ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMAWR);
return (kATAPass);
}
}
return (ATA_WaitATABusy());
}
}
// ==================================================================
// ATA_LBAATACommand1() -
//
// To set command to ATA device
//
// Input - = 7 command parameters
//
// Output - =
//
// Function returns error code
//
// ==================================================================
ATAErrorCode ATA_LBAATACommand1(muint8 Block, muint8 *pLBA, muint8 ATACmd)
{
ATAErrorCode error;
error = ATA_WaitRegBusy();
if (error)
return(error);
if (*pLBA & 0xf0) // if memory > 128G
{
ATA_DSCR_B = 0; // high byte of sector count
error = ATA_WaitRegBusy();
if (error)
return(error);
ATA_LBAL_B = (muint8) *pLBA; // LBA 31:24
error = ATA_WaitRegBusy();
if (error)
return(error);
ATA_LBAM_B = 0; // LBA 39:32
error = ATA_WaitRegBusy();
if (error)
return(error);
ATA_LBAH_B = 0;
error = ATA_WaitRegBusy(); // LBA 47:40
if (error)
return(error);
}
ATA_DSCR_B = Block;
error = ATA_WaitRegBusy();
if (error)
return(error);
ATA_LBAL_B = *(pLBA+3);
error = ATA_WaitRegBusy();
if (error)
return(error);
ATA_LBAM_B = *(pLBA+2);
error = ATA_WaitRegBusy();
if (error)
return(error);
ATA_LBAH_B = *(pLBA+1);
error = ATA_WaitRegBusy();
if (error)
return(error);
if (*pLBA & 0xf0) // if memory > 128G
{
ATA_DDHR_B = 0x40;
error = ATA_WaitRegBusy();
if (error)
return(error);
if (ATACmd == kATACmdReadDMA)
{
ATA_DCR = (muint16) kATACmdReadDMAExt << kOneByte;
error = ATA_WaitATABusyDRQ();
if (error)
return(error);
ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMARD);
return (kATAPass);
}
else
{
if (ATACmd == kATACmdWriteDMA)
{
ATA_DCR = kATACmdWriteDMAExt << kOneByte;
error = ATA_WaitRegBusy();
if (error)
return(error);
// error = ATA_WaitATABusyDRQ();
error = ATA_WaitATABusy();
if (error)
return(error);
ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMAWR);
return (kATAPass);
}
}
}
else
{
ATA_DDHR_B = (muint8) *pLBA | (0x40);
error = ATA_WaitRegBusy();
if (error)
return(error);
ATA_DCR = (muint16) ATACmd << kOneByte;
error = ATA_WaitRegBusy();
if (error)
return(error);
if (ATACmd == kATACmdReadDMA)
{
// while (mCheckBit(ATAINTRQ,PORTS));
error = ATA_WaitATABusy();
if (error)
return(error);
ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMARD);
return (kATAPass);
}
else
{
if (ATACmd == kATACmdWriteDMA)
{
// while (mCheckBit(ATAINTRQ,PORTS));
error = ATA_WaitATABusy();
if (error)
return(error);
ATA_DCR_L = (1<<ATAUDMA) | (1<<ATAUDMAWR);
return (kATAPass);
}
}
return (ATA_WaitATABusy());
}
}
// ==================================================================
// ATA_PIORead() -
//
// PIO Read data from ATA device
//
// Input - = Buffer pointer, Lenght of Transfer
//
// Output - = Data return in buffer pointer
//
// Function returns error code
//
// ==================================================================
ATAErrorCode ATA_PIORead(muint16 *pBuffer, muint16 XferWordLen)
{
int i, dummy;
ATAErrorCode error;
for (i=0; i<XferWordLen; i++) // get data
{
dummy = ATA_DDR;
// error = ATA_WaitRegBusy();
// if (error)
// return(error); // PIO
mATAWaitRegBusy;
*pBuffer++ = ATA_DDR;
}
error = ATA_WaitATABusy();
if (error)
return(error);
return (kATAPass);
}
// ==================================================================
// ATA_DummyPIORead() -
//
// PIO Read data from ATA device
//
// Input - = Buffer pointer, Lenght of Transfer
//
// Output - = Data return in buffer pointer
//
// Function returns error code
//
// ==================================================================
ATAErrorCode ATA_DummyPIORead(muint16 XferWordLen)
{
int i, dummy;
ATAErrorCode error;
for (i=0; i<XferWordLen; i++) // get data
{
dummy = ATA_DDR;
error = ATA_WaitRegBusy();
if (error)
return(error); // PIO
dummy = ATA_DDR;
}
return (kATAPass);
}
// ==================================================================
// ATA_PIOWrite() -
//
// PIO Read data from ATA device
//
// Input - = Buffer pointer, Lenght of Transfer
//
// Output -
//
// Function returns error code
//
// ==================================================================
ATAErrorCode ATA_PIOWrite(muint16 *pBuffer, muint16 XferWordLen)
{
int i;
ATAErrorCode error;
for (i=0; i<XferWordLen; i++) // get data
{
ATA_DDR = *pBuffer++;
// error = ATA_WaitRegBusy();
// if (error)
// return(error); // PIO
mATAWaitRegBusy;
}
error = ATA_WaitATABusy();
if (error)
return(error);
return (kATAPass);
}
ATAErrorCode ATA_PIOWriteTwoBlock(muint16 *pBuffer)
{
int i;
ATAErrorCode error;
for (i=0; i<0x100; i++) // get data
{
ATA_DDR = *pBuffer++;
mATAWaitRegBusy;
}
error = ATA_WaitATABusy();
if (error)
return(error);
for (i=0; i<0x100; i++) // get data
{
ATA_DDR = *pBuffer++;
mATAWaitRegBusy;
}
error = ATA_WaitATABusy();
if (error)
return(error);
return (kATAPass);
}
// ==================================================================
// ATA_WaitATABusy() -
//
// To wait until device not busy
//
// Input - = nil
//
// Output - = nil
//
// Function returns error code
//
// ==================================================================
ATAErrorCode ATA_WaitATABusy()
{
muint16 BegTime, CurTime;
muint8 Status;
ATAErrorCode error;
BegTime = MK_GetCurrentTime(); // begin time
do
{
error = ATA_WaitRegBusy();
ATA_DCR_L = 0;
mSet2Bit(ATASMR,ATAFR,ATA_HCFG_H);
mClear2Bit(ATASMR,ATAFR,ATA_HCFG_H);
if (error)
return(error);
Status = ATA_DSR_B; // get Status register
error = ATA_WaitRegBusy();
if (error)
return(error);
Status = ATA_DSR_B;
if (!mCheckBit(ATABSY,Status))
break;
CurTime = MK_GetCurrentTime(); // current time
}
while ( ((CurTime-BegTime) < kATATimeout) || ((BegTime - CurTime) < kATATimeout));
if (mCheckBit(ATABSY,Status)) // ATA still busy, timeout
{
gATAError = kSCSISKHardwareError; // timeout => hardware error
return(kCSWPhaseError);
}
if (mCheckBit(ATADF,Status)) // ATA Device Fault
{
gATAError = kSCSISKHardwareError; // device fault => hardware error
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -