📄 ata_test.c
字号:
#include "system.h"
#include "etc.h"
#include "ata.h"
#include "cf.h"
#define CODEC_MEM_ST 0x31000000
static volatile bool bIsDone;
static volatile bool bIsXferDone;
void __irq Isr_Ata(void)
{
unsigned int nthBit;
bool status;
if (!FindInterruptRequest(&nthBit)) {
ClearPending(BIT_CFCON);
}
// printf("[I] %x",nthBit);
Clear_Pending(nthBit);
if (nthBit == 0 || nthBit == 1)
{
IsDmaDone();
bIsXferDone = TRUE;
printf("data all transfer!~~\n");
}
else if (nthBit == 2)
{
bIsDone = TRUE;
printf("ata device interrupt!~~\n");
}
//ClearPending(BIT_CFCON);
if (nthBit == 3)
{
IsTBufFullContinue(&status);
if (status)
SetTransferCommand(ATA_CMD_CONTINUE);
printf("track buffer is half full\n");
}
else if (nthBit == 4)
{
IsSBufEmptyContinue(&status);
if (status)
SetTransferCommand(ATA_CMD_CONTINUE);
printf("source buffer is empty\n");
}
ClearPending(BIT_CFCON);
}
void TestReset(void)
{
ResetAll();
}
void TestChangeModeToAta(void)
{
ChangeATAMode();
}
// No need to select mode in OpenMedia()
void TestBasicWriteRead(void)
{
unsigned int uWriteBuf, uReadBuf;
unsigned int deviceLBA;
unsigned int uSector;
unsigned int uDeviceMaxSectors;
unsigned int i;
uWriteBuf = CODEC_MEM_ST;
uReadBuf = CODEC_MEM_ST + 0x400000;
OpenATAMedia();
GetMaxSectors(&uDeviceMaxSectors);
printf("\nInput device sector address[max: 0x%x]\n",uDeviceMaxSectors);
deviceLBA = (unsigned int)GetIntNum();
printf("Input sector count[max: 0x%x]\n",uDeviceMaxSectors-deviceLBA);
uSector = (unsigned int)GetIntNum();
for (i=0; i<uSector*512; i++)
{
Outp8(uWriteBuf+i, (i+0)%256);
Outp8(uReadBuf+i, 0);
}
printf("Press Enter \n");
getchar();
WriteATABlocks(deviceLBA, uSector, uWriteBuf);
ReadATABlocks( deviceLBA, uSector, uReadBuf);
if (Compare32(uWriteBuf, uReadBuf, uSector*128) == FALSE)
{
printf("Error detected\n");
Dump32(uReadBuf, uSector*128);
}
else
{
printf("Write/Read operation is OK\n");
}
CloseATAMedia();
}
void TestPioCpuMode(void)
{
unsigned int uWriteBuf, uReadBuf;
unsigned int deviceLBA;
unsigned int uSector;
unsigned int uDeviceMaxSectors;
unsigned int i;
uWriteBuf = CODEC_MEM_ST;
uReadBuf = CODEC_MEM_ST + 0x400000;
OpenATAMediaWithMode(PIO_CPU);
GetMaxSectors(&uDeviceMaxSectors);
printf("\nInput device sector address[max: 0x%x]\n",uDeviceMaxSectors);
deviceLBA = (unsigned int)GetIntNum();
printf("Input sector count[max: 0x%x]\n",uDeviceMaxSectors-deviceLBA);
uSector = (unsigned int)GetIntNum();
for (i=0; i<uSector*512; i++)
{
Outp8(uWriteBuf+i, (i+1)%256);
Outp8(uReadBuf+i, 0);
}
pISR_CFCON = (unsigned)Isr_Ata; // test for interrupt
rINTMSK &= (~BIT_CFCON); // unmask cfcon // test for interrupt
WriteATABlocks(deviceLBA, uSector, uWriteBuf);
ReadATABlocks( deviceLBA, uSector, uReadBuf);
if (Compare32(uWriteBuf, uReadBuf, uSector*128) == FALSE)
{
printf("Error detected\n");
Dump32(uReadBuf, uSector*128);
}
else
{
printf("Write/Read in PIO_CPU mode is OK\n");
}
rINTMSK |= (~BIT_CFCON); // unmask cfcon // test for interrupt
CloseATAMedia();
}
void TestPioCpuModeRead(void)
{
unsigned int uReadBuf;
unsigned int deviceLBA;
unsigned int uSector;
unsigned int uDeviceMaxSectors;
unsigned int i;
uReadBuf = CODEC_MEM_ST + 0x400000;
OpenATAMediaWithMode(PIO_CPU);
GetMaxSectors(&uDeviceMaxSectors);
printf("\nInput device sector address[max: 0x%x]\n",uDeviceMaxSectors);
deviceLBA = (unsigned int)GetIntNum();
printf("Input sector count[max: 0x%x]\n",uDeviceMaxSectors-deviceLBA);
uSector = (unsigned int)GetIntNum();
for (i=0; i<uSector*512; i=i+4)
{
Outp32(uReadBuf+i, 0);
}
ReadATABlocks( deviceLBA, uSector, uReadBuf);
Dump32(uReadBuf, uSector*128);
CloseATAMedia();
}
void TestPioDmaMode(void)
{
unsigned int uWriteBuf, uReadBuf;
unsigned int deviceLBA;
unsigned int uSector;
unsigned int uDeviceMaxSectors;
unsigned int i;
uWriteBuf = CODEC_MEM_ST;
uReadBuf = CODEC_MEM_ST + 0x400000;
OpenATAMediaWithMode(PIO_DMA);
GetMaxSectors(&uDeviceMaxSectors);
printf("\nInput device sector address[max: 0x%x]\n",uDeviceMaxSectors);
deviceLBA = (unsigned int)GetIntNum();
printf("Input sector count[max: 0x%x]\n",uDeviceMaxSectors-deviceLBA);
uSector = (unsigned int)GetIntNum();
for (i=0; i<uSector*512; i++)
{
Outp8(uWriteBuf+i, (i+2)%256);
Outp8(uReadBuf+i, 0);
}
printf("Get Ready\n");
getchar();
WriteATABlocks(deviceLBA, uSector, uWriteBuf);
ReadATABlocks( deviceLBA, uSector, uReadBuf);
if (Compare32(uWriteBuf, uReadBuf, uSector*128) == FALSE)
{
printf("Error detected\n");
Dump32(uReadBuf, uSector*128);
}
else
{
printf("Write/Read in PIO DMA mode is OK\n");
}
CloseATAMedia();
}
void TestPioDmaModeRead(void)
{
unsigned int uReadBuf;
unsigned int deviceLBA;
unsigned int uSector;
unsigned int uDeviceMaxSectors;
unsigned int i;
uReadBuf = CODEC_MEM_ST + 0x400000;
OpenATAMediaWithMode(PIO_DMA);
GetMaxSectors(&uDeviceMaxSectors);
printf("\nInput device sector address[max: 0x%x]\n",uDeviceMaxSectors);
deviceLBA = (unsigned int)GetIntNum();
printf("Input sector count[max: 0x%x]\n",uDeviceMaxSectors-deviceLBA);
uSector = (unsigned int)GetIntNum();
for (i=0; i<uSector*512; i=i+4)
{
Outp32(uReadBuf+i, 0);
}
ReadATABlocks( deviceLBA, uSector, uReadBuf);
Dump32(uReadBuf, uSector*128);
CloseATAMedia();
}
void TestUdmaMode(void)
{
unsigned int uWriteBuf, uReadBuf;
unsigned int deviceLBA;
unsigned int uSector;
unsigned int uDeviceMaxSectors;
unsigned int i;
uWriteBuf = CODEC_MEM_ST;
uReadBuf = CODEC_MEM_ST + 0x400000;
OpenATAMediaWithMode(UDMA);
GetMaxSectors(&uDeviceMaxSectors);
printf("\nInput device sector address[max: 0x%x]\n",uDeviceMaxSectors);
deviceLBA = (unsigned int)GetIntNum();
printf("Input sector count[max: 0x%x]\n",uDeviceMaxSectors-deviceLBA);
uSector = (unsigned int)GetIntNum();
for ( i=0; i<uSector*512; i++)
{
Outp8(uWriteBuf+i, (i+3)%256);
Outp8(uReadBuf+i, 0);
}
WriteATABlocks(deviceLBA, uSector, uWriteBuf);
printf("Write Done\n");
ReadATABlocks( deviceLBA, uSector, uReadBuf);
printf("Read Done\n");
if (Compare32(uWriteBuf, uReadBuf, uSector*128) == FALSE)
{
printf("Error detected\n");
Dump32(uReadBuf, uSector*128);
}
else
{
printf("Write/Read in UDMA mode is OK\n");
}
CloseATAMedia();
}
void TestUdmaModeRead(void)
{
unsigned int uReadBuf;
unsigned int deviceLBA;
unsigned int uSector;
unsigned int uDeviceMaxSectors;
unsigned int i;
uReadBuf = CODEC_MEM_ST + 0x400000;
OpenATAMediaWithMode(UDMA);
GetMaxSectors(&uDeviceMaxSectors);
printf("\nInput device sector address[max: 0x%x]\n",uDeviceMaxSectors);
deviceLBA = (unsigned int)GetIntNum();
printf("Input sector count[max: 0x%x]\n",uDeviceMaxSectors-deviceLBA);
uSector = (unsigned int)GetIntNum();
for (i=0; i<uSector*512; i=i+4)
{
Outp32(uReadBuf+i, 0);
}
ReadATABlocks( deviceLBA, uSector, uReadBuf);
Dump32(uReadBuf, uSector*128);
CloseATAMedia();
}
void TestPioDmaMode_Int(void)
{
unsigned int i=0;
unsigned int uWriteBuf, uReadBuf;
unsigned int deviceLBA;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -