📄 sdram.c
字号:
/*
* Copyright (C) 2001, Spectrum Digital, Inc. All Rights Reserved.
*/
#define SDRAM8_DPAT 0xffffffff
unsigned long data_pattern_table[] = { 0x00000000, 0xffffffff, 0xaaaaaaaa, 0x55555555 };
/*
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 0xaaaa's
7. verfiy the fill, error 4
8. fill range with all 05555's
9. verfiy the fill, error 5
*/
unsigned long SDRAM_FillTest(unsigned long begin_add,
unsigned long end_add,
unsigned long bit_pattern)
{
volatile unsigned long *save_ptr;
volatile unsigned long loop_cnt;
volatile unsigned long loop_save;
volatile unsigned long *addr_ptr;
volatile unsigned long read_back;
volatile unsigned long save_add, addr;
/* save the start addr */
save_add = begin_add;
addr = begin_add;
loop_cnt = ((end_add - begin_add) >> 1) - 1;
loop_save = loop_cnt;
/* Write the pattern */
do
{
addr_ptr = (unsigned long *)addr;
*addr_ptr = bit_pattern; /* fill with pattern */
addr += 2;
} while( loop_cnt-- );
addr = save_add; /* get start again */
loop_cnt = loop_save;
do
{
addr_ptr = (unsigned long *)addr;
read_back = *addr_ptr;
bit_pattern &= SDRAM8_DPAT;
read_back &= SDRAM8_DPAT;
if ( read_back!= bit_pattern) /* verify pattern */
{
read_back = read_back;
return( read_back ); /* show error */
}
addr += 2;
} while( loop_cnt--);
return((unsigned long)0); /* show no error */
}
unsigned long SDRAM_AddrTest(unsigned long begin_add, unsigned long stop_add)
{
volatile unsigned long save_ptr;
volatile unsigned long loop_cnt;
volatile unsigned long loop_save;
volatile unsigned long *paddr;
volatile unsigned long read_back;
volatile unsigned long save_add, addr;
loop_cnt = (((stop_add) - (begin_add)) >> 1) - 1;
loop_save= loop_cnt;
addr = begin_add;
save_add = begin_add;
do
{
paddr = (unsigned long *)addr;
*paddr = addr; /* fill with address */
addr += 2;
} while( loop_cnt-- );
addr = save_add; /* get start again */
loop_cnt= loop_save;
do
{
paddr = (unsigned long *)addr;
read_back = *paddr;
read_back &= SDRAM8_DPAT;
if ( read_back != ( (addr) & SDRAM8_DPAT) ) /* verify data */
{
read_back = read_back;
return( (unsigned long )addr ); /* show error */
}
addr += 2;
} while( loop_cnt-- );
addr = save_add; /* get start again */
loop_cnt= loop_save;
do
{
paddr = (unsigned long *)addr;
*paddr = ~addr; /* fill with inverted address */
addr += 2;
} while( loop_cnt-- );
addr = save_add; /* get start again */
loop_cnt = loop_save;
do
{
paddr = (unsigned long *)addr;
read_back = *paddr;
read_back &= SDRAM8_DPAT ;
if ( read_back != (~addr & SDRAM8_DPAT) ) /* verify data */
{
return( (unsigned long )addr); /* show error */
}
addr += 2;
} while( loop_cnt-- );
return((unsigned long)0); /* show no error */
}
unsigned short SDRAM_Test()
{
unsigned long mem_error, start_add, end_add, j;
// Set up test range
start_add = 0x40000;
end_add = 0x200000;
// Test the address range
mem_error = SDRAM_AddrTest(start_add, end_add);
if (mem_error)
return /*mem_error*/1; /* show error */
// Fill with values from pattern table
for (j = 0; j < (sizeof(data_pattern_table)/sizeof(unsigned long)); j++)
{
mem_error = SDRAM_FillTest(start_add, end_add, data_pattern_table[j]);
if (mem_error)
return /*mem_error*/1; /* show error */
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -