📄 test.c
字号:
ok &&
(arg < argc) &&
(token = argv[arg]) &&
shell_decode_token( token, &type, &decode );
arg++ )
{
switch( type )
{
case SHELL_TOKEN_OPTION :
/* Find match */
for(i=0;
(i<OPTION_COUNT) &&
(strcmp(decode.option, options[i].option) != 0);
i++) ;
switch(i)
{
case OPTION_HELP :
*help = TRUE;
break;
case OPTION_LOOP :
*until_break = TRUE;
break;
default :
error = SHELL_ERROR_OPTION;
shell_error_data = token;
ok = FALSE;
break;
}
break;
case SHELL_TOKEN_NUMBER :
if( count == 0 )
*parg1 = decode.number;
else if( count == 1 )
*parg2 = decode.number;
else if( count == 2 )
*parg3 = decode.number;
else
ok = FALSE;
count++;
break;
case SHELL_TOKEN_STRING :
/* Use raw token to find match with module name */
if( modix != MODULE_ALL )
ok = FALSE;
else
{
for(modix=0;
(modix < MODULE_ALL) &&
(strcmp(token, modules[modix].t_module_name) != 0);
(modix)++) ;
if( modix == MODULE_ALL )
ok = FALSE;
}
break;
}
}
if( !ok )
{
return error;
}
*pmodule = &modules[modix];
if( *help )
{
return
( *until_break || (count != 0) ) ?
SHELL_ERROR_SYNTAX :
OK;
}
if( *until_break )
{
return
( *help || (count != 0) || (modix != MODULE_ALL) ) ?
SHELL_ERROR_SYNTAX :
OK;
}
/* --- argument special considerations --- */
#define pstart parg1
#define psize parg2
#define ploops parg3
if( modix == MODULE_ALL )
get_default_ram(pstart, psize, ploops);
if( modix == MODULE_RAM )
{
if( count == 0 )
{
get_default_ram(pstart, psize, ploops);
count = 3;
}
if( count == 3 )
{
/* Check validity of addresses, and adjust if possible */
rc = ram_range_valid(pstart, psize);
if( rc != OK )
return rc;
}
}
#undef pstart
#undef psize
#undef ploops
/* --- special considerations end --- */
return
( count != modules[modix].t_arg_count ) ?
SHELL_ERROR_SYNTAX :
OK;
}
/************************************************************************
* test_all
************************************************************************/
static bool
test_all( void )
{
UINT32 rambase, srambase, size, loops;
srambase = 0;
get_default_ram( &rambase, &size, &loops );
SYSCON_read( SYSCON_BOARD_SRAM_BASE_ID, &srambase, sizeof(srambase) );
if( !do_test(&modules[ MODULE_RAM ], TRUE, rambase, size, loops) )
return FALSE;
if( SHELL_PUTC( '\n' ) ) return FALSE;
if (srambase)
{
if ( !do_test(&modules[ MODULE_RAM ], TRUE, KSEG1(srambase), size, loops) )
return FALSE;
if ( SHELL_PUTC( '\n' ) ) return FALSE;
}
if (!do_test( &modules[ MODULE_FLASH ], TRUE, 0, 0, 0 ))
return FALSE;
return TRUE;
}
/************************************************************************
* test_ram
************************************************************************/
static bool
test_ram(
UINT32 start,
UINT32 size,
UINT32 loops )
{
#define TEST_BLOCK 0x80000
char msg[80];
UINT32 (*func)( UINT32, UINT32, UINT32, UINT32 );
UINT32 cnt;
UINT32 dummy;
UINT32 newstart, newend;
bool error;
char *wheel = "|/-\\";
printf("Memory test from 0x%08X to 0x%08X, ",
start,
start + size - 4 );
if( !loops )
printf("loop indefinitely.\n" );
else
printf("%d loop%s\n", loops, loops == 1 ? "." : "s.");
if (loops != 1 || (size > TEST_BLOCK))
printf( "%s\n", shell_msg_ctrl_c);
error = FALSE;
for (cnt=0; ((loops == 0) || (cnt<loops)) && !error && !ctrl_c; cnt++)
{
printf("\rNow running loop %d %c",
cnt+1, wheel[wix = ((wix+1) & 0x3)]);
for ( newstart=start;
(newstart<start+size) && !error && !ctrl_c;
newstart += TEST_BLOCK)
{
if (newstart+TEST_BLOCK < start+size)
newend = newstart + TEST_BLOCK;
else
newend = start+size;
if (dummy = memtest(newstart, (UINT32) &dummy, newend, cnt))
{
error = TRUE;
printf("\nFailed at address: 0x%08X\n", dummy);
printf("Written Read Difference Re-Read\n");
for (cnt=0; cnt<8; cnt++)
printf("0x%08X 0x%08X 0x%08X 0x%08X\n",
errordump[cnt*2], errordump[cnt*2+1],
errordump[cnt*2] ^ errordump[cnt*2+1],
((UINT32 *) dummy)[cnt]);
}
if (!error)
{
printf("\b%c", wheel[wix = ((wix+1) & 0x3)]);
if ( GETCHAR_CTRLC(DEFAULT_PORT) )
ctrl_c = TRUE;
}
}
}
if (!ctrl_c)
printf("\n");
return !error;
}
/************************************************************************
* test_flash
************************************************************************/
static bool
test_flash( void )
{
UINT32 rc ;
t_FLASH_ctrl_descriptor flash_ctrl;
flash_ctrl.command = FLASH_CTRL_TEST_SYSTEMFLASH;
rc = IO_ctrl( SYS_MAJOR_FLASH_STRATA, 0, (UINT8 *)(&flash_ctrl)) ;
if (rc)
{
err = rc;
return FALSE ;
}
return TRUE;
}
/************************************************************************
* ram_range_valid
************************************************************************/
static UINT32
ram_range_valid(
UINT32 *pstart,
UINT32 *psize )
{
UINT32 adj_start;
UINT32 adj_size;
if( *pstart + *psize < MAX( *pstart, *psize ) )
{
/* Overflow */
return SHELL_ERROR_RAM_RANGE;
}
/* Adjust start and size to be 0x100 aligned */
adj_start = (*pstart + 0xff) & ~0xff;
adj_size = *psize & ~0xff;
while ( (adj_size != 0) &&
(adj_start + adj_size) > (*pstart + *psize) )
{
adj_size -= 0x100;
}
if( adj_size == 0 )
return SHELL_ERROR_RAM_RANGE;
*pstart = adj_start;
*psize = adj_size;
return
sys_validate_range( adj_start,
adj_size,
1,
TRUE );
}
/* Command definition for help */
static t_cmd cmd_def =
{
"test",
test,
"test [-l] | [-m] [ <module> [ <module arguments> ] ]",
"The test command can perform a number of self-tests on different\n"
"modules. If no module is supplied, all available modules are tested\n"
"and a final pass/fail status is indicated. If a module is specified,\n"
"only this module is tested.\n"
"\n"
"If the option '-m' is applied and no module is specified, a list\n"
"of the available modules is displayed.\n"
"\n"
"If the option '-m' is applied and a module is specified, additional\n"
"information about the module test and the optional arguments is\n"
"displayed.\n"
"\n"
"If the option '-l' is applied, all available modules are tested\n"
"repetitively, until Ctrl-C is pressed or a test fails. The '-l'\n"
"option cannot be specified together with other options or arguments.",
options,
OPTION_COUNT,
FALSE
};
/* Command definitions for SDB 't' command (secret command) */
static t_cmd cmd_def_sdb_lower =
{
"t",
test_sdb,
"t (Microsoft SDB command)",
"Performs self-test as required by Microsoft SDB requirements.\n"
"Detects and tests RAM and flash memories. A final pass/fail status\n"
"is indicated.\n"
"\n"
"In order to run this test, a minimum of 64 MByte SDRAM and 32 MByte\n"
"flash must be available. If these requirements are not met, the test\n"
"will not start at all.",
NULL,
0,
TRUE
};
/************************************************************************
* Implementation : Public functions
************************************************************************/
/************************************************************************
*
* shell_test_init
* Description :
* -------------
*
* Initialise command
*
* Return values :
* ---------------
*
* void
*
************************************************************************/
t_cmd *
shell_test_init( void )
{
return &cmd_def;
}
/************************************************************************
*
* shell_test_sdb_init
* Description :
* -------------
*
* Initialise command
*
* Return values :
* ---------------
*
* void
*
************************************************************************/
t_cmd *
shell_test_sdb_init( void )
{
return &cmd_def_sdb_lower;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -