ata_test.c

来自「samsung 最新芯片2450 的测试程序.」· C语言 代码 · 共 712 行 · 第 1/2 页

C
712
字号
#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 + =
减小字号Ctrl + -
显示快捷键?