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

📄 memory_test.c

📁 dm270 source code
💻 C
字号:
/*
Module Name	: memory_test.c

Functions	: SDRAM_TEST
			  SRAM_TEST
    		  FLASH_TEST
    		  EEPROM_TEST
    		  
Purpose		: Test sdram , sram and flash

Author		: Otis	Yu

Notes		: 
*/

/*--------------------------------------------------------------------------*
*	Local header files						 							    *
*--------------------------------------------------------------------------*/
#include <demo/uart270.h>

/*--------------------------------------------------------------------------*
*	Extern global variables					 							    *
*--------------------------------------------------------------------------*/
extern char UART_outBuff[1024];
extern volatile unsigned short	UART0IntFlag;

/*--------------------------------------------------------------------------*
*	SDRAM Const, Macro, type definition				 					    *
*--------------------------------------------------------------------------*/
#define SDRAM_START_ADDR    0x00900000
#define SDRAM_SIZE          0x01000000    // 64M 

/*--------------------------------------------------------------------------*
*	SRAM Const, Macro, type definition				 					    *
*--------------------------------------------------------------------------*/
#define SRAM_START_ADDR     0x00100000
#define SRAM_SIZE           0x0000000    // 4M

/*--------------------------------------------------------------------------*
*	FLASH Const, Macro, type definition				 					    *
*--------------------------------------------------------------------------*/
#define	FLASH_CE	0x00100000			 	
 		 

#define	ADDR555		0x0555 
#define	ADDR2AA		0x02aa
#define	CS0CTRL1	0x30A00
#define	CS3CTRL1	0x30A0E
#define	CS4CTRL1	0x30A12
#define	CS0CTRL2	0x30A02
#define	CS3CTRL2	0x30A10
#define	CS4CTRL2	0x30A14
#define	VIDEOWIN_MODE				0x30682
#define	SYNCEN			0x30700
#define	PVEN			0x30780
#define	RETRY	    100

/*--------------------------------------------------------------------------*
*	EEPROM Const, Macro, type definition				 				    *
*--------------------------------------------------------------------------*/
#define EEPROM_I2C_ID			0xA0	// 0b10100000
#define EEPROM_MAX_BYTE			0x100
#define E_PASS  0
static	unsigned char	eep_data[256];
static	unsigned char	eep_addr = 0x00;

//
// Test sdram write, read and compare data

void SDARM_TEST(void) {
	unsigned int check;
	
	UART_sendString( UART0, "\r\n ***************SDARM  TEST***************" );
	check = 0;
	memset( SDRAM_START_ADDR, 0x5A, SDRAM_SIZE );	
	UART_sendString( UART0, "\r\n COMPARE " );	
	check = memcmp( SDRAM_START_ADDR, (SDRAM_START_ADDR+SDRAM_SIZE/2), SDRAM_SIZE/2 );
	if( check == 0 )
		UART_sendString( UART0, "\r\n PASS " );
	else
		UART_sendString( UART0, "\r\n ERROR " );

	memset( SDRAM_START_ADDR, 0, SDRAM_SIZE );
	UART_sendString( UART0, "\r\n ");
}

//
// Test sram write, read and compare data, first remove data to sdram on sram,
// last remove data to sram on sdram after test finish 

void SRAM_TEST(void) {
	int i, j, check;
	unsigned int sram_addr, sdram_addr;
	unsigned int temp;
	unsigned int *dst, *src;
	
	dst = (unsigned int *)(SDRAM_START_ADDR);
	src = (unsigned int *)(SRAM_START_ADDR);
	memcpy( dst, src, SRAM_SIZE );

	UART_sendString( UART0, "\r\n ****************SARM TEST****************" );
	check = 0;
	// Write
	sram_addr = SRAM_START_ADDR;
	for (j = 0; j < SRAM_SIZE ; j++) { 
		*((unsigned int*)sram_addr) = 0x55AA55AA; 
		sram_addr += 4;
		for (i = 0; i < 0x1 ; i++);
	}
	// Read
	sram_addr = SRAM_START_ADDR;
	for (j = 0; j < SRAM_SIZE ; j++) { 
		temp = 0;
		temp = *((unsigned int*)sram_addr);
		if( temp != 0x55AA55AA ) {
			check = 1;
		}
		sram_addr += 4;
		for (i = 0; i < 0x1 ; i++);
	}
	// Write
	sram_addr = SRAM_START_ADDR;
	for (j = 0; j < SRAM_SIZE ; j++) { 
		*((unsigned int*)sram_addr) = 0x0; 
		sram_addr += 4;
		for (i = 0; i < 0x1 ; i++);
	}
	
	sram_addr = SRAM_START_ADDR;
	sdram_addr = SDRAM_START_ADDR;
	for (j = 0; j < SRAM_SIZE ; j++) { 
		*((unsigned int*)sram_addr) = *((unsigned int*)sdram_addr); 
		sram_addr += 4;
		sdram_addr += 4;
		for (i = 0; i < 0x1 ; i++);
	}
	
	memset( SDRAM_START_ADDR, 0, SRAM_SIZE );
	
	if( check == 0 )
		UART_sendString( UART0, "\r\n PASS " );
	else
		UART_sendString( UART0, "\r\n ERROR " );

	UART_sendString( UART0, "\r\n " );
}

/*---------------------------------------------------------*
*	Brief		:	FLASH Reset
*	Return		:	keydata
*	Description :						
*----------------------------------------------------------*/
void fl_reset(unsigned short *ce){
	*ce = 0x00f0;
}
/*---------------------------------------------------------*
*	Brief		:	FLASH erace_all
*	Return		:	
*	Description :						
*----------------------------------------------------------*/
void erace_all(unsigned short *ce){

	int i;
	unsigned short DQ, l,m;
	unsigned short *addr;
	
	fl_reset(ce);
	for(i = 0; i < 1000; i++); 

	*(ce + ADDR555) = 0x00aa;
	*(ce + ADDR2AA) = 0x0055;
	*(ce + ADDR555) = 0x0080;
	*(ce + ADDR555) = 0x00aa;
	*(ce + ADDR2AA) = 0x0055;
	*(ce + ADDR555) = 0x0010;
	
	while( 1 )
	{
		addr = (unsigned short*) FLASH_CE;	
		DQ = *addr ;
		if (DQ & 0x0080)
		{
			UART_sendString( UART0, "\r\n Erase PASS!\r\n");
			break; // DQ7 == 1, completed
		}
		for (l=0; l<0xFFF; l++) m++;
		
		if (DQ & 0x0020) {  // DQ5 == 1,  time out
			
			DQ = *addr ;
			if (DQ & 0x0080)
			{
				UART_sendString( UART0, "\r\n Erase PASS!\r\n");
				break; // completed
			}
			else
			{
				UART_sendString( UART0, "\r\n Erase ERROR!\r\n");
				//NOR_FLASH_TIME_OUT;
			}
		}
	}
	
	//NOR_FLASH_OK;
}
/*---------------------------------------------------------*
*	Brief		:	FLASH erace_sector
*	Return		:	
*	Description :						
*----------------------------------------------------------*/
void erace_sector(unsigned short *ce){

	int i, cnt;
	unsigned short DQ, l,m;
	unsigned short *addr,sector_addr;
	
	fl_reset(ce);
	sector_addr = 0x0;
	for(i = 0; i < 1000; i++);asm("  NOP"); 
	//for(cnt = 0; cnt < 9; cnt++){
		*(ce + ADDR555) = 0x00aa;
		*(ce + ADDR2AA) = 0x0055;
		*(ce + ADDR555) = 0x0080;
		*(ce + ADDR555) = 0x00aa;
		*(ce + ADDR2AA) = 0x0055;
		*(ce + 0x0) = 0x0030;
	//	sector_addr += 1;
	//}
	for(i = 0; i < 5000; i++);asm("  NOP"); 

	while( 1 )
	{
		addr = (unsigned short*) FLASH_CE;	
		DQ = *addr ;
		if (DQ & 0x0080)
		{
			UART_sendString( UART0, "\r\n Erase PASS!\r\n");
			break; // DQ7 == 1, completed
		}
		for (l=0; l<0xFFF; l++) m++;
		
		if (DQ & 0x0020) {  // DQ5 == 1,  time out
			
			DQ = *addr ;
			if (DQ & 0x0080)
			{
				UART_sendString( UART0, "\r\n Erase PASS!\r\n");
				break; // completed
			}
			else
			{
				UART_sendString( UART0, "\r\n Erase ERROR!\r\n");
				//NOR_FLASH_TIME_OUT;
			}
		}
	}
	
	//NOR_FLASH_OK;
}
/*---------------------------------------------------------*
*	Brief		:	FLASH fl_write
*	Return		:	
*	Description :						
*----------------------------------------------------------*/
int fl_write(unsigned short *src, unsigned short *dst, int size)
{

	unsigned short *ce, dat1, dat2;
	int i, j, k;

	fl_reset(ce);
	ce = (unsigned short*)((int)dst & 0xfff00000);
	
	for(i = 0; i < size/2; i++){
		*(ce + ADDR555) = 0x00aa;
		*(ce + ADDR2AA) = 0x0055;
		*(ce + ADDR555) = 0x00a0;
		*dst = *src;
		
		
		for(j = 0; j < RETRY; j++){
			for(k= 0; k< 50; k++);
				
			dat1 = *dst;
			dat2 = *dst;

			if((dat1 == *src) & (dat2 == *src))
			break;
			
		 	if((dat1 & 0x20) & (dat2 & 0x20))
		 	{
		 		UART_sendString( UART0, "\r\n PROGRAM ERROR!\r\n");
		 		return -1;
		 	}
		}
	
		if(j < RETRY){
			//*src++;
			*dst++;
		}
		else
		{
			UART_sendString( UART0, "\r\n ERROR TIME OUT!\r\n");
			i--;
		}
		
	}
	UART_sendString( UART0, "\r\n PROGRAM PASS!\r\n");
	return 0;
}
/*---------------------------------------------------------*
*	Brief		:	FLASH device_ID
*	Return		:	keydata
*	Description :						
*----------------------------------------------------------*/
void device_ID(unsigned short *ce)
{
	unsigned short *addr;
	unsigned short manufacturer_id, device_id;
	
	*(ce + ADDR555) = 0x00aa;
	*(ce + ADDR2AA) = 0x0055;
	*(ce + ADDR555) = 0x0090;
		
	addr = (unsigned short*) FLASH_CE;
	manufacturer_id = *addr;
	addr = (unsigned short*) FLASH_CE + 1;
	device_id = *addr;
	
	fl_reset(ce);
	sprintf(UART_outBuff, "\r\n FLASH Manufacturer IS = 0x%x",manufacturer_id);
	UART_sendString( UART0,  UART_outBuff );
	sprintf(UART_outBuff, "\r\n FLASH DEVICE ID IS = 0x%x",device_id);
	UART_sendString( UART0,  UART_outBuff );
	
	if(manufacturer_id==0x00c2 && device_id==0x22a8)
	{
		UART_sendString( UART0, "\r\n Manufacturer IS  MXIC/MX29LV320AB");
		UART_sendString( UART0, "\r\n PASS\r\n");	
	}
	else
		UART_sendString( UART0, "\r\n ERROR; UNKNOW DEVICE\r\n");
}

/*---------------------------------------------------------*
*	Brief		:	FLASH ROM_Util
*	Return		:	
*	Description :						
*----------------------------------------------------------*/
void ROM_Util()
{
	
	unsigned short	d=0xaaaa;
	unsigned short	*inchar=&d;
	
	*(unsigned short*) VIDEOWIN_MODE = 0;
	*(unsigned short*) SYNCEN = 0;
	*(unsigned short*) PVEN = 0;	

	// emif initialization
	*(unsigned short*)CS0CTRL1 = 0x668a;
	*(unsigned short*)CS3CTRL1 = 0x668a;
	*(unsigned short*)CS4CTRL1 = 0x668a;
	
	*(unsigned short*)CS0CTRL2 = 0x2442;
	*(unsigned short*)CS3CTRL2 = 0x6442;	// CS3 16-bit
	*(unsigned short*)CS4CTRL2 = 0x6442;	// CS4 16-bit
	
	device_ID((unsigned short*)FLASH_CE);
	
	UART_sendString( UART0, "\r\n Erase now....");
	//erace_all((unsigned short*)FLASH_CE);
	erace_sector((unsigned short*)FLASH_CE);
	
	inchar=&d;
	fl_write((unsigned short*)inchar, (unsigned short*)FLASH_CE, 1024);
	
}
/*--------------------------------------------------------------------------*
*	Brief		:	FLASH_TEST			 									*
*	Return		:	None													*
*	Description	:															*
*--------------------------------------------------------------------------*/
void FLASH_TEST(void) {
	
	UART_sendString( UART0, "\r\n ****************FLASH TEST****************" );


	ROM_Util();
	UART_sendString( UART0, "\r\n Push Any Key(PC) Exit Test" );
	while(UART0IntFlag);
	UART0IntFlag = 1;

	//erace_all((unsigned short*)FLASH_CE);
	UART_sendString( UART0, "\r\n END" );
	UART_sendString( UART0, "\r\n " );
}

/*---------------------------------------------------------*
*	Brief		:	EEPROM  DEV_EEP_Write
*	Return		:	
*	Description :						
*----------------------------------------------------------*/
int DEV_EEP_Read( unsigned char addr, char* buf, unsigned short num )
{
	int 	flag=0;
	unsigned char	status=0, success, val_1;
	
	val_1=i2cReadReg((unsigned char)EEPROM_I2C_ID, addr, &success);
	
	flag += success;
    if(flag!=0){
		status=1;  //E_INVALID_INPUT;
	}
	
	return status;
}

/*---------------------------------------------------------*
*	Brief		:	EEPROM  DEV_EEP_Write
*	Return		:	
*	Description :						
*----------------------------------------------------------*/
int DEV_EEP_Write(unsigned char addr, char* buf, unsigned short num )
{
	int 	flag=0;
	unsigned char	status=0, success;
	
	i2cInit();
	i2cWriteReg((unsigned char)EEPROM_I2C_ID, addr, * buf, &success);
	
	flag += success;
	if(flag!=0){
		status=1;  //E_INVALID_INPUT;
	}
	
	return status;
	
}
/*---------------------------------------------------------*
*	Brief		:	EEPROM  API_Debug_EEP_ReadWrite
*	Return		:	
*	Description :						
*----------------------------------------------------------*/
void	API_Debug_EEP_ReadWrite( int times )
{
	static	int	i,j,k;
	
	
	UART_sendString( UART0, "\r\n Data Write now...." );
	for(j=times; j>0; j--)
	{
		eep_addr = 0x00;
		for(i=0;i<256;i++)
		{
			eep_data[i] = i;
			k = DEV_EEP_Write(eep_addr, &eep_data[i], 0x01);
			if( k != E_PASS )
			{
				UART_sendString( UART0, "\r\n WRITE ERROR\r\n" );
				return;
			}
			else	eep_addr++;
		}
		eep_data[0] = 0xFF;
		DEV_EEP_Write(0xFF, &eep_data[0], 0x01);
		UART_sendString( UART0, "\r\n WRITE PASS\r\n" );
		
		eep_addr = 0x00;
		UART_sendString( UART0, "\r\n Data Read now...." );
	
		for( i=0; i<256; i++ )
		{
			k = DEV_EEP_Read(eep_addr, &eep_data[i], 1);
			if( k != E_PASS )
			{
				UART_sendString( UART0, "\r\n READ ERROR\r\n" );
				return;
			}
			else	eep_addr++;
		}
		UART_sendString( UART0, "\r\n READ PASS\r\n" );
	}
	//UART_sendString( UART0, "\r\n EEPROM READ / WRITE PASS\r\n" );
}

/*--------------------------------------------------------------------------*
*	Brief		:	EEPROM_TEST			 									*
*	Return		:	None													*
*	Description	:															*
*--------------------------------------------------------------------------*/
void EEPROM_TEST(void) {
	
	
	UART_sendString( UART0, "\r\n ****************EEPROM TEST****************" );


	API_Debug_EEP_ReadWrite(1);
	UART_sendString( UART0, "\r\n Push Any Key(PC) Exit Test" );
	while(UART0IntFlag);
	UART0IntFlag = 1;
	
	
	UART_sendString( UART0, "\r\n END" );
	UART_sendString( UART0, "\r\n " );
}

⌨️ 快捷键说明

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