⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ata_test.c

📁 三星2443芯片
💻 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 + -