📄 memtest2.c
字号:
/*--------------------------------------------------------*/
/* SPECTRUM DIGITAL INC. */
/*--------------------------------------------------------*/
/* Program space memory test */
/*--------------------------------------------------------*/
/* */
/* filename: memtest2.c */
/* original: 03/01/97 by: mls */
/* last update: 02/18/2000 by: rrp for 2407 */
/*--------------------------------------------------------*/
#include "prot2407.h"
#define PROG_START_ADDR 0x2000 /* must be greater than "etext" */
/* test.map file - near end */
#define PROG_END_ADDR 0xfdff /* SD each memory bank/test */
unsigned int prog_pattern_table[] = { 0x0000, 0xffff, 0x0000, 0xaaaa, 0x5555 };
#define BUF_SIZE 1024
unsigned int data_buffer[BUF_SIZE]; /* holds data written into prog space */
/*
This memory test does the following:
1. check the range, error 1
2. fill range with all 0's
3. verfiy the fill, error 2
4. fill range with all 0xffff's
5. verfiy the fill, error 3
6. fill range with all 0's
7. verfiy the fill, error 4
8. fill range with all 0xaaaa's
9. verfiy the fill, error 5
10. fill range with all 05555's
11. verfiy the fill, error 6
*/
unsigned int d_fill_test2(unsigned int *begin_ptr,
unsigned int *stop_ptr,
unsigned int bit_pattern)
{
unsigned int ret_val;
unsigned int temp_val;
unsigned int len;
unsigned int i;
unsigned int save_add;
unsigned int save_len;
unsigned int next_add;
temp_val = (*stop_ptr) - (*begin_ptr); /* watch for ffff-0 rollover */
temp_val++;
save_add = *begin_ptr; /* save the start addr */
save_len = temp_val;
/* check data lines */
for (i=0;i<BUF_SIZE;i++)
{
data_buffer[i] = bit_pattern;
}
do
{
if (temp_val >= BUF_SIZE)
{
len = BUF_SIZE;
}
else
{
len = temp_val;
}
temp_val -= len;
/* fill with pattern */
blk_mv_d2p( &data_buffer[0], /* buffer */
len, /* length */
begin_ptr); /* destination */
next_add = *begin_ptr + BUF_SIZE;
*begin_ptr = next_add;
} while (temp_val);
*begin_ptr = save_add; /* get start again */
temp_val = save_len;
do
{
if (temp_val >= BUF_SIZE)
{
len = BUF_SIZE;
}
else
{
len = temp_val;
}
temp_val -= len;
/* change data in buffer */
for (i=0;i<BUF_SIZE;i++)
{
data_buffer[i] = ~bit_pattern;
}
/* read data from prog space */
blk_mv_p2d( begin_ptr, /* source addr */
len, /* length */
&data_buffer[0]); /* destination addr */
for (i=0;i<len;i++) /* verify pattern */
{
if (data_buffer[i] != bit_pattern)
{
return ((unsigned int)(begin_ptr + i));
}
}
next_add = *begin_ptr + BUF_SIZE;
*begin_ptr = next_add;
} while (temp_val);
return((unsigned int)0); /* show no error */
}
unsigned int d_addr_test2(unsigned int *begin_ptr,
unsigned int *stop_ptr)
{
unsigned int ret_val;
unsigned int temp_val;
unsigned int len;
unsigned int i;
unsigned int save_add;
unsigned int save_len;
unsigned int next_add;
temp_val = (*stop_ptr) - (*begin_ptr); /* watch for ffff-0 rollover */
temp_val++;
save_len = temp_val;
save_add = *begin_ptr; /* save the start addr */
do
{
for (i=0;i<BUF_SIZE;i++)
{
data_buffer[i] = (*begin_ptr) + i;
}
if (temp_val >= BUF_SIZE)
{
len = BUF_SIZE;
}
else
{
len = temp_val;
}
temp_val -= len;
/* fill with pattern */
blk_mv_d2p( &data_buffer[0], /* data buffer */
len, /* length */
begin_ptr ); /* destination addr */
next_add = *begin_ptr + BUF_SIZE;
*begin_ptr = next_add;
} while (temp_val);
*begin_ptr = save_add; /* get start again */
temp_val = save_len;
do
{
for (i=0;i<BUF_SIZE;i++)
{
data_buffer[i] = 0xffff;
}
if (temp_val >= BUF_SIZE)
{
len = BUF_SIZE;
}
else
{
len = temp_val;
}
temp_val -= len;
/* read data from prog space */
blk_mv_p2d( begin_ptr, /* source addr */
len, /* length */
&data_buffer[0]); /* destination addr */
for (i=0;i<len;i++) /* verify pattern */
{
if (data_buffer[i] != ((*begin_ptr) + i) )
{
return ((*begin_ptr) + i);
}
}
next_add = *begin_ptr + BUF_SIZE;
*begin_ptr = next_add;
} while (temp_val);
return((unsigned int)0); /* show no error */
}
unsigned int d_pattern_test2(unsigned int *start_ptr,
unsigned int *end_ptr)
{
unsigned int mem_error;
int i, j;
unsigned int save_start;
unsigned int save_end;
save_start = *start_ptr;
save_end = *end_ptr;
if ((*start_ptr) >= (*end_ptr) )
{
return((unsigned int)1); /* show 1st error */
}
i = sizeof(prog_pattern_table); /* get size of table */
for (j = 0; j < i; j++)
{
*start_ptr = save_start;
*end_ptr = save_end;
mem_error = d_fill_test2(start_ptr, end_ptr, prog_pattern_table[j]);
if (mem_error)
{
return((unsigned int)(j + 2)); /* show error */
}
}
j++;
*start_ptr = save_start;
*end_ptr = save_end;
mem_error = d_addr_test2(start_ptr, end_ptr);
if (mem_error)
{
return((unsigned int)(j + 2)); /* show error */
}
return((unsigned int)0); /* show no error */
}
unsigned int memtest2(void)
{
unsigned int mem_err;
unsigned int prog_start;
unsigned int prog_end;
mem_err = 0;
/* any number of memory banks */
/* can be put in here with */
/* different begin, end addrs */
prog_start = PROG_START_ADDR;
prog_end = PROG_END_ADDR;
mem_err = d_pattern_test2( &prog_start,
&prog_end );
return(mem_err); /* return the good or bad result */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -