📄 test_sdram_64bit.c
字号:
/*++
* 摘要:
* 针对SDRAM的测试程序。
*
* 版本日期:
*
*
* 修改:
*
*
--*/
#include <stdio.h>
#include <std.h>
#include <mem.h>
#include <sys.h>
#include <csl_stdinc.h>
#include "DP1000_led.h"
#include "test_sdram.h"
Ptr bufRead;
extern Int L2SRAM;
/*++
Description:
向Memroy存储区填充数据。
Arguments:
IN Uint32 start,输入的Memory的开始位置,有效值范围0x8000 0000~0x8800 0000(128M)
IN Uint32 end,输入的Memory的结束位置,有效值范围0x8000 0000~0x8800 0000
IN double val,输入的要填充的数据值,有效值范围double型
Return Value:
0,正确;
-1,错误。
--*/
Int16
MEM_fill(
Uint32 start,
Uint32 len,
Uint32 n
)
{
Uint32 i, j, end;
Uint32 *valP;
double valStart = 0x33333333;
double val1 = 0x55555555;
double val2 = 0xAAAAAAAA;
double value;
/* Calculate end of range */
end = start + len;
*(Uint32*)start = valStart;
*(Uint32*)(start + 4) = valStart;
valStart = *((double *)start);
*(Uint32*)start = val1;
*(Uint32*)(start + 4) = val1;
val1 = *((double *)start);
*(Uint32*)start = val2;
*(Uint32*)(start + 4) = val2;
val2 = *((double *)start);
/* Fill a range with start value */
for (i = start; i < end; i+=8)
{
*((double *)i) = valStart;
}
// printf("start MEM_inverse() \n");
/* Fill a range with a value */
for (i = start; i < end; i+=16)
{
*((double *)i) = val1;
*((double *)(i + sizeof(val1))) = val2;//VAL2
}
// Verify the data one by one
for (i = start; i < end; i+=(sizeof(val1) + sizeof(val2)))
{
value = *(double*)i;
if(value != val1)
{
valP = (Uint32*)&value;
printf("SigErr:blog =%4d, addr=0x%X, value = 0x%X %X \n", n, i, *(valP + 1), *valP);
return -1;
}
value = *(double*)(i+sizeof(val1));
if(value != val2)
{
valP = (Uint32*)&value;
printf("SigErr:blog =%4d, addr=0x%X, value = 0x%X %X \n", n, (i + sizeof(val1)), *(valP + 1), *valP);
return -1;
}
}
// printf(" start reading and verifying data section by section... \n");
// Verify the data section by section, section size is NUM_READ
for (i = start; i < end;)
{
memset(bufRead, 0, 0x8000);
// read one section continuously
for(j = 0; j < NUM_READ; i += 8, j += 8)
{
*(double*)((Uint32)bufRead + j) = *((double *)i);
}
//verify this section
for(j = 0; j < NUM_READ; j += 16)
{
value = *(double*)((Uint32)bufRead + j);
if(value != val1)
{
valP = (Uint32*)&value;
printf("SecErr:blog =%4d, addr=0x%8X, value = 0x%X %X\n", n, (i - NUM_READ + j), *(valP + 1), *valP);
return -1;
}
value = *(double*)((Uint32)bufRead + j + sizeof(val1));
if(value != val2)
{
valP = (Uint32*)&value;
printf("SecErr:blog =%4d, addr=0x%8X, value = 0x%X %X\n", n, (i - NUM_READ + j + 8), *(valP + 1), *valP);
return -1;
}
}
}
return 0;
}
/*++
Description:
将Memroy先写入0x5555 5555 5555 5555,然后检测是否正确,
然后写入0xAAAA AAAA AAAA AAAA,然后检测是否正确。
Arguments:
IN Uint32 start,输入的Memory的开始位置,有效值范围0x8000 0000~0x8800 0000
IN Uint32 end,输入的Memory的结束位置,有效值范围0x8000 0000~0x8800 0000
Return Value:
0,正确;
-1,错误。
--*/
Int16
MEM_reverse(
Uint32 start,
Uint32 len
)
{
Uint32 i, j, end;
double val1 = 0x55555555;
double val2 = 0xAAAAAAAA;
/* Calculate end of range */
end = start + len;
*(Uint32*)start = val1;
*(Uint32*)(start + 4) = val1;
val1 = *((double *)start);
*(Uint32*)start = val2;
*(Uint32*)(start + 4) = val2;
val2 = *((double *)start);
// printf("start MEM_inverse() \n");
/* Fill a range with a value */
for (i = start; i < end; i+=16)
{
*((double *)i) = val1;
*((double *)(i + sizeof(val1))) = val2;
}
// Verify the data one by one
for (i = start; i < end; i+=(sizeof(val1) + sizeof(val2)))
{
if(*(double*)i != val1)
{
printf("Reverse ERROR: addr=%#x, value = %#x \n", i, *(double*)i);
return -1;
}
if(*(double*)(i+sizeof(val1)) != val2)
{
printf("Reverse ERROR: addr=%#x, value = %#x \n", (i + 8), *(double*)(i + 8));
return -1;
}
}
// printf(" start reading and verifying data section by section... \n");
// Verify the data section by section, section size is NUM_READ
for (i = start; i < end;)
{
memset(bufRead, 0, 0x8000);
// read one section continuously
for(j = 0; j < NUM_READ; i += 8, j += 8)
{
*(double*)((Uint32)bufRead + j) = *((double *)i);
}
//verify this section
for(j = 0; j < NUM_READ; j += 16)
{
if(*(double*)((Uint32)bufRead + j) != val1)
{
printf("Reverse ERROR: addr=%#x, value = %#x \n", (i - NUM_READ + j), *(double*)(i - NUM_READ + j));
return -1;
}
if(*(double*)((Uint32)bufRead + j + sizeof(val1)) != val2)
{
printf("Reverse ERROR: addr=%#x, value = %#x \n", (i - NUM_READ + j + 8), *(double*)(i - NUM_READ + j + 8));
return -1;
}
}
}
return 0;
}
/*++
Description:
向Memroy进行逐位检查。
Arguments:
IN Uint32 start,输入的Memory的开始位置,有效值范围0x8000 0000~0x8800 0000
IN Uint32 end,输入的Memory的结束位置,有效值范围0x8000 0000~0x8800 0000
Return Value:
0,正确;
-1,错误。
--*/
Int16
MEM_walking(
Uint32 start,
Uint32 len
)
{
Uint32 i,j;
Uint32 mask;
Uint32 end = start + len;
// printf("start MEM_walking() \n");
for (i = start; i < end; i+=4)
{
/* Walking ones and zeros */
mask = 1;
for (j = 0; j < 32; j++)
{
/* Test one in bit position i */
*((Uint32 *)i) = mask;
if (*((Uint32 *)i) != mask)/* Check data */
{
printf("Bit ERROR: addr=%#x, value = %#x \n", i, *((Uint32 *)i));
return -1;
}
/* Test zero in bit position i */
*((Uint32 *)i) = ~mask;
if(*((Uint32 *)i) != (~mask))/* Check data */
{
printf("Bit ERROR: addr=%#x, value = %#x \n", i, *((Uint32 *)i));
return -1;
}
mask = mask << 1;
}
}
return 0;
}
/*++
Description:
将MEM分成区域来检测。
Arguments:
IN Uint32 start,输入的Memory的开始位置,有效值范围0x8000 0000~0x8800 0000
IN Uint32 end,输入的Memory的结束位置,有效值范围0x8000 0000~0x8800 0000
Return Value:
0,正确;
-1,错误。
--*/
Int16 MEM_fill_test(start, len)
{
Int16 status = 0;
Int16 numBlog;
Int16 i;
Uint32 blogAddr;
// printf("start MEM_fill_test() \n");
/* Check external memory (byte 0x80000000 to byte 0x88000000) */
//-----------------------------------------------------------------------
numBlog = len / BLOG_LEN;
for(i = 0; i < numBlog; i++)
{
blogAddr = start + i * BLOG_LEN;
status |= MEM_fill(blogAddr, BLOG_LEN, i);
}
// printf("all %d blogs test finished! \n", numBlog);
//-----------------------------------------------------------------------
return status;
}
/*++
Description:
所有的MEM测试程序。
Arguments:
IN Uint32 start,输入的Memory的开始位置,有效值范围0x8000 0000~0x8800 0000
IN Uint32 end,输入的Memory的结束位置,有效值范围0x8000 0000~0x8800 0000
Return Value:
0,正确;
-1,错误。
--*/
Int16 MEM_test(Uint32 start, Uint32 len)
{
Int16 status = 0;
status |= MEM_fill_test(start, len);
status |= MEM_reverse(start, len);
// status |= MEM_walking(start, len);
return status;
}
/*++
Description:
SDRAM测试程序调用程序。
Arguments:
Return Value:
0,正确;
-1,错误。
--*/
Int16 TEST_sdram()
{
Int16 status = 0;
if((bufRead = MEM_alloc(L2SRAM, NUM_READ, 128)) == MEM_ILLEGAL)
{
printf("MEM_alloc failture!\n");
return SYS_EALLOC;
}
/* Check external memory (byte 0x80000000 to byte 0x88000000) */
status |= MEM_test(SDRAM_START_ADDR, SDRAM_LEN);
MEM_free(L2SRAM, bufRead, NUM_READ);
if(status)
{
return -1;
}
else
{
REG32(DP1000_LED_REG_ON) = 0x02;
return 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -