📄 memory_test.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 + -