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

📄 memtest.c

📁 基于ecos的redboot
💻 C
📖 第 1 页 / 共 2 页
字号:
	hex32out(badAddr);
 	printf(": ");
	hex32out(*((long *) badAddr));


	printf("\n");		/* Print out next line of mem dump */
	hex32out(badAddr + 4);		/* Starting address */
 	printf(": ");
	hex32out(*((long *) (badAddr + 4)));	/* First longword */
 	printf(" ");
	hex32out(*((long *) (badAddr + 8)));
 	printf(" ");
	hex32out(*((long *) (badAddr + 12)));
 	printf(" ");
	hex32out(*((long *) (badAddr + 16)));

 	printf("\n");
	hex32out(badAddr + 20);	
 	printf(": ");
	hex32out(*((long *) (badAddr + 20)));
 	printf(" ");
	hex32out(*((long *) (badAddr + 24)));
 	printf(" ");
	hex32out(*((long *) (badAddr + 28)));
 	printf(" ");
	hex32out(*((long *) (badAddr + 32)));

	/* DEBUG */
	printf ("\n\nReading back data in 32bit chunks:\n");
	addr = (unsigned long *)(badAddr - 16);
	printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
	addr = (unsigned long *)(badAddr - 12);
	printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
	addr = (unsigned long *)(badAddr - 8);
	printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
	addr = (unsigned long *)(badAddr - 4);
	printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
	addr = (unsigned long *)(badAddr);
	printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
	addr = (unsigned long *)(badAddr + 4);
	printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
	addr = (unsigned long *)(badAddr + 8);
	printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
	addr = (unsigned long *)(badAddr + 12);
	printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
	addr = (unsigned long *)(badAddr + 16);
	printf ("Address = 0x%08x, Data = 0x%08x\n", addr, *addr);
	printf ("\n");

	printf ("Reading back data in 16bit chunks:\n");
	saddr = (unsigned short *)(badAddr - 16);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr - 14);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr - 12);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr - 10);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr - 8);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr - 6);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr - 4);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr - 2);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr + 2);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr + 4);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr + 6);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr + 8);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr + 10);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr + 12);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr + 14);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	saddr = (unsigned short *)(badAddr + 16);
	printf ("Address = 0x%08x, Data = 0x%04x\n", saddr, *saddr);
	printf ("\n");

}

/*
 * Returns 1 if passed, 0 if failed.
 */

int
memTest (
	 long	startAddr,		/* Start address of test */
	 long	endAddr			/* End address + 1 */
	 )
{
	long	badAddr;		/* Addr test failed at */

	printf("\n");
	    
	if (onesTest(startAddr) == FAILED)
	{
		printf("\nWalking 1's test: failed");
		return 0;
	}
	printf("\nWalking 1's test: passed\n");

	/* rval = quadtest(startAddr); 

	switch (rval)
	{
		case 0:
			printf("\nQuadword test passed\n");
			break;

		case 1:
			printf("\nQuadword test failed: Quadword Write, Longword Read\n");
			dumpMem(startAddr);
			return 0;
			
		case 2:
			printf("\nQuadword test failed: Longword Write, Quadword Read\n");
			dumpMem(startAddr);
			return 0;			

		default:
			printf("\nQuadword test: Unknown return value 0x%X\n", rval);
			return 0;		
	}
	*/

	printf("\nLong word address test: ");
	if (LWAddr(startAddr, endAddr, &badAddr) == FAILED)
	{
		printf("failed");
		dumpMem(badAddr);
		return 0;
	}
	printf("passed");

	printf("\nLong word address bar test: ");
	if (LWBar(startAddr, endAddr, &badAddr) == FAILED)
	{
		printf("failed");
		dumpMem(badAddr);
		return 0;
	}
	printf("passed");

	printf("\nByte address test: ");
	if (ByteAddr(startAddr, endAddr, &badAddr) == FAILED)
	{
		printf("failed");
		dumpMem(badAddr);
		return 0;
	}
	printf("passed");

	printf("\nByte address bar test: ");
	if (ByteBar(startAddr, endAddr, &badAddr) == FAILED)
	{
		printf("failed");
		dumpMem(badAddr);
		return 0;
	}
	printf("passed");

	return 1;
}


/* 02/02/01 jwf */
/* Do alternating inverse long word address test */
static int
LWABar(long	start,			/* Starting address of test */
       long	end,			/* Ending address */
       long	*badAddr)		/* Failure address */
{
	register long	currentAddr;	/* Current address being tested */
	int				fail = 0;		/* Test hasn't failed yet */
	register long	data;

	/* In this test, the contents of each longword address toggles 
	   between the Address and the Address BAR */
	for(currentAddr = start; currentAddr < end; currentAddr += 4)
	{
		/* Address ending in 0x4 or 0xc */
		if (currentAddr & 4)
			*((long *) currentAddr) = ~currentAddr;

		/* Address ending in 0x0 or 0x8 */ 
		else
			*((long *) currentAddr) = currentAddr;
	}

	for (currentAddr = start; (currentAddr < end) && (!fail); currentAddr += 4)
	{
		data = *(long *) currentAddr;

		switch (currentAddr & 0xf)
		{
			case 0x0:
			case 0x8:
				if (data != currentAddr)
				{
					fail = 1;
					printf ("\nFailed at Address 0x%08X, Expected 0x%08X, Read 0x%08X\n",
						currentAddr, currentAddr, data);
				}
				break;

			case 0x4:
			case 0xc:
				if (data != ~currentAddr)
				{
					fail = 1;
					printf ("\nFailed at Address 0x%08X, Expected 0x%08X, Read 0x%08X\n",
						currentAddr, ~currentAddr, data);
				}
				break;

			default:
				fail = 1;
				printf ("\nFailed at Address 0x%08X, Unaligned address\n", currentAddr);
				break;
		}
	}

	if (fail) {
	    *badAddr = currentAddr - 4;
	    return FAILED;
	} else
	    return PASSED;
}


/* 02/02/01 jwf */
/*
 * Returns 1 if passed, 0 if failed.
 */
int
LoopMemTest (
	 long	startAddr,		/* Start address of test */
	 long	endAddr			/* End address + 1 */
	 )
{
	long	badAddr;		/* Addr test failed at */
	volatile int junk;
	extern int ecc_error_reported;

	/* indicate no ECC errors recorded */
	*MSB_DISPLAY_REG = DISPLAY_OFF;

	/* indicate passing test */
	*LSB_DISPLAY_REG = LETTER_P;

	while (1)
	{
		printf("\n");
			
		printf("\nLong word address test: ");
		if (LWAddr(startAddr, endAddr, &badAddr) == FAILED)
		{
			/* indicate failing test */
			*LSB_DISPLAY_REG = LETTER_F;

			printf("failed at Address 0x%08x\n", badAddr);
			printf("Performing Continuous Write/Read/!Write/Read...\n\n");
			while (1)
			{
				*(volatile int *)badAddr = badAddr;
				junk = *(volatile int *)badAddr;
				*(volatile int *)badAddr = ~badAddr;
				junk = *(volatile int *)badAddr;

				if (ecc_error_reported)
				{
					printf ("Disabling ECC reporting\n");
					/* disable single and multi-bit reporting */
					*(volatile unsigned long *)0x1534 = 0x4;
					ecc_error_reported = FALSE;
				}
			}
			return 0;	/* not reached */
		}
		printf("passed");

		printf("\nLong word address bar test: ");
		if (LWBar(startAddr, endAddr, &badAddr) == FAILED)
		{
			/* indicate failing test */
			*LSB_DISPLAY_REG = LETTER_F;

			printf("failed at Address 0x%08x\n", badAddr);
			printf("Performing Continuous Write/Read/!Write/Read...\n\n");
			while (1)
			{
				*(volatile int *)badAddr = badAddr;
				junk = *(volatile int *)badAddr;
				*(volatile int *)badAddr = ~badAddr;
				junk = *(volatile int *)badAddr;

				if (ecc_error_reported) 
				{
					printf ("Disabling ECC reporting\n");
					/* disable single and multi-bit reporting */
					*(volatile unsigned long *)0x1534 = 0x4;
					ecc_error_reported = FALSE;
				}
			}
			return 0;	/* not reached */
		}
		printf("passed");

		printf("\nAlternating Long word, Long word address bar test: ");
		if (LWABar(startAddr, endAddr, &badAddr) == FAILED)
		{
			/* indicate failing test */
			*LSB_DISPLAY_REG = LETTER_F;

			printf("failed at Address 0x%08x\n", badAddr);
			printf("Performing Continuous Write/Read/!Write/Read...\n\n");
			while (1)
			{
				*(volatile int *)badAddr = badAddr;
				junk = *(volatile int *)badAddr;
				*(volatile int *)badAddr = ~badAddr;
				junk = *(volatile int *)badAddr;

				if (ecc_error_reported) 
				{
					printf ("Disabling ECC reporting\n");
					/* disable single and multi-bit reporting */
					*(volatile unsigned long *)0x1534 = 0x4;
					ecc_error_reported = FALSE;
				}
			}
			return 0;	/* not reached */
		}
		printf("passed");
	}

	return 1;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -