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

📄 ata_test.c

📁 samsung 最新芯片2450 的测试程序.
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -