📄 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;
}
else if (nthBit == 2)
{
bIsDone = TRUE;
}
ClearPending(BIT_CFCON);
if (nthBit == 3)
{
IsTBufFullContinue(&status);
if (status)
SetTransferCommand(ATA_CMD_CONTINUE);
}
else if (nthBit == 4)
{
IsSBufEmptyContinue(&status);
if (status)
SetTransferCommand(ATA_CMD_CONTINUE);
}
}
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);
}
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");
}
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");
}
printf("Reset added dip SW for general SMC mode! Press Enter\n");
getchar();
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;
unsigned int uSector;
unsigned int uDeviceMaxSectors;
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+4)%256);
Outp8(uReadBuf+i, 0);
}
bIsXferDone = FALSE;
ClearAllInterrupt();
pISR_CFCON = (unsigned)Isr_Ata;
rINTMSK &= (~BIT_CFCON); // unmask cfcon
for (i=0; i<uSector; i++)
{
StartWritingBlocks(deviceLBA+i, 1, uWriteBuf+i*512);
while(bIsXferDone != TRUE) ;
bIsXferDone = FALSE;
}
for (i=0; i<uSector; i++)
{
StartReadingBlocks(deviceLBA+i, 1, uReadBuf+i*512);
while(bIsXferDone != TRUE) ;
bIsXferDone = FALSE;
}
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");
}
rINTMSK |= BIT_CFCON; // mask cfcon
CloseATAMedia();
}
void TestUDmaMode_Int(void)
{
unsigned int uWriteBuf, uReadBuf;
unsigned int deviceLBA;
unsigned int uSector;
unsigned int uDeviceMaxSectors;
unsigned int uCurrentCount;
unsigned int uRemainderCount;
unsigned int uCurrentLba;
unsigned int uCurrentAddr;
unsigned int uRound;
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+4)%256);
Outp8(uReadBuf+i, 0);
}
bIsXferDone = FALSE;
ClearAllInterrupt();
ClearPending(BIT_CFCON);
rINTMSK &= (~BIT_CFCON); // unmask cfcon
pISR_CFCON = (unsigned)Isr_Ata;
// Max transfer block count per command is 256.
uRemainderCount = uSector;
uRound = 0;
while(uRemainderCount != 0) {
if(uRemainderCount>256) {
uCurrentCount = 256; //0 means 256
uRemainderCount -= 256;
} else {
uCurrentCount = uRemainderCount;
uRemainderCount = 0;
}
uCurrentLba = deviceLBA + uRound*256;
uCurrentAddr = uWriteBuf + uRound*256*512;
StartWritingBlocks(uCurrentLba, uCurrentCount, uCurrentAddr);
while(bIsXferDone != TRUE);
bIsXferDone = FALSE;
uRound++;
}
printf("Write Done\n");
uRemainderCount = uSector;
uRound = 0;
while(uRemainderCount != 0) {
if(uRemainderCount>256) {
uCurrentCount = 256; //0 means 256
uRemainderCount -= 256;
} else {
uCurrentCount = uRemainderCount;
uRemainderCount = 0;
}
uCurrentLba = deviceLBA + uRound*256;
uCurrentAddr = uReadBuf + uRound*256*512;
StartReadingBlocks(uCurrentLba, uCurrentCount, uCurrentAddr);
while(bIsXferDone != TRUE) ;
bIsXferDone = FALSE;
uRound++;
}
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");
}
rINTMSK |= BIT_CFCON; // mask cfcon
CloseATAMedia();
}
void Test_ATA(void)
{
int i, sel;
FUNC_MENU menu[]=
{
NULL, "Exit",
TestChangeModeToAta, "Change mode to ATA",
TestReset, "Reset ATA device\n",
TestBasicWriteRead, "Basic Write/Read test\n",
TestPioCpuMode, "PIO_CPU mode Write/Read test",
TestPioCpuModeRead, "PIO_CPU mode Read test",
TestPioDmaMode, "PIO_DMA mode Write/Read test [Polling mode]",
TestPioDmaModeRead, "PIO_DMA mode Read test [Polling mode]",
TestUdmaMode, "UDMA mode Write/Read test [Polling mode]",
TestUdmaModeRead, "UDMA mode Read test [Polling mode]\n",
TestPioDmaMode_Int, "PIO_DMA Write/Read test [Interrupt mode]",
TestUDmaMode_Int, "UDMA Write/Read test [Interrupt mode]\n",
0,0
};
while(1)
{
printf("\n");
for (i=0; (int)(menu[i].desc)!=0; i++)
printf("%2d: %s\n", i, menu[i].desc);
printf("\nSelect the function to test : ");
sel = GetIntNum();
printf("\n");
if (sel == 0)
break;
else if (sel>0 && sel<(sizeof(menu)/8-1))
(menu[sel].func)();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -