📄 shell.c
字号:
printf( "Current date is %d-%d-%d [%s]\n" , SysTime.year , SysTime.month ,
SysTime.day , WeekDay[( SysTime.weekday - 1U ) % 7U] );
if ( argc < 2 )
return 0;
str = argv[1];
if ( str[4] != '-' )
error = 1;
str[4] = 0;
year = strtodec( str , strlen( str ) );
if ( ( year < 1978 ) || ( year > 4095 ) || error )
{
printf( "year error!\n" );
return -1;
}
str += 5;
i = 0;
if ( str[++i] != '-' )
if ( str[++i] != '-' )
error = 1;
str[i] = 0;
month = strtodec( str , strlen( str ) );
if ( ( month - 1 ) > 11 || error )
{
printf( "month error!\n" );
return -1;
}
str += i + 1;
i = 0;
if ( str[++i] != 0 )
if ( str[++i] != 0 )
error = 1;
str[i] = 0;
day = strtodec( str , strlen( str ) );
if ( ( day - 1 ) > 30 || error )
{
printf( "day error!\n" );
return -1;
}
SysTime.year = year;
SysTime.month = month;
SysTime.day = day;
RtcSetDay( &SysTime );
printf( "Set " );
GetDate( 0 , NULL );
return 0;
}
/*******************************************************************************************************/
int SetWeek( int argc , char* argv[] )
{
unsigned int i;
int error = 0;
if ( argc < 2 )
error = 1;
i = strtodec( argv[1] , 1 );
if ( ( i - 1 ) > 6 ) //0-1 = 0xffffffff
error = 1;
if ( !error )
{
SysTime.weekday = i; //1~7
RtcSetWeek( &SysTime );
//printf("Set to %s\n", WeekDay[i-1]);
GetDate( 0 , NULL );
}
else
{
printf( "Please enter a number to set weekday\n" );
for ( i = 1; i <= 7; i++ )
{
printf( "%d : %s\n" , i , WeekDay[i - 1] );
}
}
return 0;
}
#endif
/*******************************************************************************************************/
#ifdef SET_SYSCLK_SUPPORT
/*
int ChgSysClk(int argc, char *argv[])
{
printf("This function is for adjust system running clock!!!\n");
ShowSysClock(0, NULL);
if(!SetSysClock()) {
GetSysClockPara(Env.clk_para);
SerialChgBaud(Env.baud);
Delay(100);
ShowSysClock(0, NULL);
}
return 0;
}
*/
#endif
/*******************************************************************************************************/
int ChgBaudRate( int argc , char* argv[] )
{
int i;
for ( i = 0; BaudSet[i]; i++ )
printf( "%d : %d\n" , i , BaudSet[i] );
printf( "Please enter choice : " );
while ( 1 )
{
int ch = getch();
if ( ch <= '6' || ch >= '0' )
{
Env.baud = BaudSet[ch - '0'];
printf( "Baud rate set to : %d\nPress any key to continue\n" ,
Env.baud );
i = 0x4000;
while ( i-- ); //wait transmit end
SerialChgBaud( 0 , Env.baud );
getch();
break;
}
}
return 0;
}
/*******************************************************************************************************/
#ifdef TFTP_DOWNLOAD_SUPPORT
int SetIpAddr( int argc , char* argv[] )
{
int i, j, err = 0;
char* str;
char ch = '.';
U32 ip[4];
if ( argc < 2 )
{
printf( "IP address : %u.%u.%u.%u\n" ,
( Env.nic_cfg.ip >> 24 ) & 0xff ,
( Env.nic_cfg.ip >> 16 ) & 0xff , ( Env.nic_cfg.ip >> 8 ) & 0xff ,
Env.nic_cfg.ip & 0xff );
return 0;
}
str = argv[1];
for ( j = 0; j < 4; j++ )
{
if ( j == 3 )
ch = 0;
i = 0;
if ( str[++i] != ch )
if ( str[++i] != ch )
if ( str[++i] != ch )
err = 1;
str[i] = 0;
ip[j] = strtodec( str , i );
if ( ( ip[j] >= 255 ) || err )
{
printf( "IP address error\n" );
return -1;
}
str += i + 1;
}
printf( "Set IP address : %u.%u.%u.%u\n" , ip[0] , ip[1] , ip[2] , ip[3] );
Env.nic_cfg.ip = ( ip[0] << 24 ) |
( ip[1] << 16 ) |
( ip[2] << 8 ) |
ip[3];
return 0;
}
int LoadFromNet( int argc , char* argv[] )
{
if ( argc < 2 )
download_addr = DFT_DOWNLOAD_ADDR;
else
{
unsigned long tmp;
tmp = strtoul( ( char * ) argv[1] );
download_addr = ( tmp == -1 ) ? download_addr : tmp;
}
printf( "Now download file from net to 0x%x...\n" , download_addr );
download_len = -1;
CacheDisable() ; //change by gongjun 2004.10.18
tftp_main( download_addr , Env.nic_cfg.ip );
CacheFlush() ; //change by gongjun 2004.10.18
CacheEnable() ; //change by gongjun 2004.10.18
if ( download_len == -1 )
{
puts( "Tftp Download Aborted!\n" );
}
else
printf( "\nReceived %x bytes success\n" , download_len );
return download_len;
}
int NetLoadRun( int argc , char* argv[] )
{
if ( LoadFromNet( argc , argv ) > 0 )
{
RunProgram( 0 , NULL );
}
return 0;
}
#endif /*TFTP_DOWNLOAD_SUPPORT*/
//中断入口内容不可确定,不要用中断
int LoadFromUart( int argc , char* argv[] )
{
int i, size;
unsigned short dnCS, CheckSum;
unsigned char * buf = ( unsigned char * ) DFT_DOWNLOAD_ADDR;
unsigned char RxTmp[8];
if ( argc < 2 )
download_addr = DFT_DOWNLOAD_ADDR;
else
{
unsigned long tmp;
tmp = strtoul( ( char * ) argv[1] );
download_addr = ( tmp == -1 ) ? download_addr : tmp;
}
buf = ( unsigned char * ) download_addr;
printf( "Now download file from uart0 to 0x%x...\n" , download_addr );
i = 0;
while ( i < 4 )
RxTmp[i++] = getch();
i = 0;
size = *( unsigned long * ) RxTmp - 4;
while ( i < size )
buf[i++] = getch();
download_len = size - 2;
dnCS = ( buf[size - 1] << 8 ) | buf[size - 2];
CheckSum = 0;
for ( size -= 3; size >= 0; size-- )
CheckSum += buf[size];
if ( dnCS != CheckSum )
{
// printf("get CS=0x%08x, cal CS=0x%08x\n", dnCS, CheckSum);
puts( "\nCheckSum error!\n" );
download_len = -1;
}
else
printf( "\nReceived %x bytes success\n" , download_len );
return download_len;
}
int UartLoadRun( int argc , char* argv[] )
{
if ( LoadFromUart( argc , argv ) > 0 )
{
RunProgram( 0 , NULL );
}
return 0;
}
//*****************************************************************************
int RunProgram( int argc , char* argv[] )
{
void ( *fp ) ( U32 , U32 ) = ( void ( * ) ( U32 , U32 ) ) download_addr;
( *fp ) ( 0 , 0 ); //add by gongjun,直接启动程序
if ( argc > 1 )
{
unsigned int p = strtoul( ( char * ) argv[1] );
if ( ( p != -1 ) && !( p & 3 ) )
fp = ( void ( * ) ( U32 , U32 ) ) p;
}
printf( "Run program from 0x%x\n" , fp );
if ( argc )
{
printf( "are you sure?" );
if ( !getyorn() )
return 0;
}
DisableInt();
if ( ( ( U32 ) fp & ~0xfff ) != ( BOOT_PARAMS_ADDR & ~0xfff ) )
{
SetParams();
Delay( 10 );
}
CacheFlush();
CacheDisable(); //!!!???,先clean DCache, 再Disable DCache
BoardPrepareRun();
( *fp ) ( 0 , Env.machine );
return 0;
}
int MoveMem( int argc , char* argv[] )
{
unsigned int src, dst, size;
if ( argc < 4 )
{
printf( "Usage : move a1 a2 size\n" );
printf( "a1 = src address, a2 = dst address, size = copy bytes (all in hex)\n" );
return -1;
}
src = strtoul( ( char * ) argv[1] );
dst = strtoul( ( char * ) argv[2] );
size = strtoul( ( char * ) argv[3] );
if ( src == -1 || dst == -1 || size == -1 )
{
//||(dst-size)<src) {
printf( "give error address\n" );
return -1;
}
memcpy( ( char * ) dst , ( char * ) src , size );
printf( "move finished!\n" );
return 0;
}
int MoveRun( int argc , char* argv[] )
{
unsigned long size;
char* s, * r, * i;
if ( ( Env.prog_s_addr >= EXT_ROM_END ) ||
( Env.prog_s_addr & 0x3 ) ||
( Env.prog_r_addr & 0x3 ) )
{
puts( "Bad address\n" );
return -1;
}
//SetParams();
s = ( char * ) Env.prog_s_addr;
r = ( char * ) Env.prog_r_addr;
i = ( char * ) ( Env.initrd_addr & ~0xfff );
size = 0x100000;//ROM_END - Env.prog_s_addr;
#ifdef NAND_FLASH_SUPPORT
if ( Env.saved_in & 1 )
{
if ( RdFileFrNF( Env.prog_r_addr , ( U32 ) s >> 12 ) )
return -1;
if ( Env.saved_in & 2 )
if ( RdFileFrNF( DFT_INITRD_ADDR , ( U32 ) i >> 12 ) )
return -1;
}
else
#endif
#ifdef NOR_FLASH_SUPPORT
{
NorFlashRead( r , s , size );
if ( Env.saved_in & 2 )
NorFlashRead( DFT_INITRD_ADDR , i , 0x100000 );
}
#else
return 0;
#endif
download_addr = Env.prog_r_addr;
RunProgram( 0 , NULL );
return 0;
}
#ifdef NOR_FLASH_SUPPORT
int ProgFlash( int argc , char* argv[] )
{
unsigned int size = ~0;
unsigned int data_begin = ~0;
unsigned int prog_begin = ~0;
int overwrite0 = 1;
int modify_a0 = 0;
unsigned int bios_load_addr;
prog_begin = Env.prog_s_addr;
data_begin = download_addr;
size = download_len;
if ( !strncmp( argv[argc - 1] , "-no0" , 5 ) )
{
overwrite0 = 0;
argc--;
}
if ( argc > 1 )
prog_begin = strtoul( ( char * ) argv[1] );
if ( argc > 2 )
data_begin = strtoul( ( char * ) argv[2] );
if ( argc > 3 )
size = strtoul( ( char * ) argv[3] );
if ( ( prog_begin == -1 ) || ( data_begin == -1 ) || ( size == -1 ) )
{
printf( "Arguments error!\n" );
goto err_exit;
}
if ( !size )
{
printf( "Write 0 Bytes!\n" );
}
else
{
printf( "program flash begin @0x%x, from ram data @0x%x, size = %dBytes\nAre you sure?" ,
prog_begin , data_begin , size );
if ( !getyorn() )
return 0;
if ( ( prog_begin == 0 ) && overwrite0 )
{
unsigned int ins;
ins = *( unsigned int * ) data_begin;
if ( ( ins >> 24 ) == 0xea ) // instruction: b xxxx, now just support b instruction!!!
bios_load_addr = ( ( ins & 0xffffff ) << 2 ) + 8;
else
bios_load_addr = 4; // other instruction, jump to 4
//bios_load_addr = (bios_load_addr-BIOS_LOAD-8)/4;
//bios_load_addr = (bios_load_addr&0xffffff)|0xea000000;
*( unsigned int * ) data_begin = 0xea000000 +
( BIOS_BASE - 8 ) /
4;
modify_a0 = 1;
}
NorFlashProg( prog_begin , data_begin , size );
if ( modify_a0 )
NorFlashProg( BIOS_LOAD , ( U32 ) & bios_load_addr , 4 );
}
return 0;
err_exit:
printf( "Usage: prog a1 a2 size [-no0]\na1 = program begin address\na2 = data pointer to ram\nsize = program size(Bytes)\n-no0 = don't overwrite address 0\n" );
return -1;
}
//*****************************************************************************
/******************************************************************************
【功能说明】通过TFTP软件,将目标代码通过以太网下载的SDRAM,然后将下载的代码烧写
到Flash中去,不过在Flash最低地址放置了跳转到BIOS的跳转指令,适合于烧写应用程序
******************************************************************************/
int AutoLoadAndProgFlash( int argc , char* argv[] )
{
char ch_tmp[3][10];
char* para_ptr[5];
int ( *DnProg ) ( int argc , char * argv[] );
int prog_bios = 0;
#ifdef TFTP_DOWNLOAD_SUPPORT
DnProg = LoadFromNet;
#else
DnProg = XmodemReceive;
#endif
if ( argc > 1 )
{
if ( strncmp( argv[1] , "-b" , 3 ) == 0 )
prog_bios = 1;
else if ( strncmp( argv[1] , "-c" , 3 ) == 0 )
DnProg = LoadFromUart;
else if ( strncmp( argv[1] , "-x" , 3 ) == 0 )
DnProg = XmodemReceive;
else
goto err_exit;
if ( argc > 2 )
{
if ( strncmp( argv[2] , "-b" , 3 ) == 0 )
prog_bios = 1;
else if ( strncmp( argv[2] , "-c" , 3 ) == 0 )
DnProg = LoadFromUart;
else if ( strncmp( argv[1] , "-x" , 3 ) == 0 )
DnProg = XmodemReceive;
else
goto err_exit;
}
}
if ( ( DnProg ) ( 0 , NULL ) < 0 )
return 0;
ultostr( ( char * ) ch_tmp[0] , 0 );
ultostr( ( char * ) ch_tmp[1] , download_addr );
ultostr( ( char * ) ch_tmp[2] , download_len );
para_ptr[1] = ch_tmp[0];
para_ptr[2] = ch_tmp[1];
para_ptr[3] = ch_tmp[2];
para_ptr[4] = prog_bios ? "-no0" : NULL;
ProgFlash( prog_bios ? 5 : 4 , para_ptr );
return 0;
err_exit:
printf( "Usage ap [-b] [-c] [-x]\n-b for bios\n-c download by uart\n-x xmodem download\n" );
return -1;
}
//*****************************************************************************
int CopyFlash( int argc , char* argv[] )
{
unsigned int src, dst, size;
if ( argc < 4 )
{
printf( "Usage : copy a1 a2 size\n" );
printf( "a1 = src address, a2 = dst address, size = copy bytes (all in hex)\n" );
return -1;
}
src = strtoul( ( char * ) argv[1] );
dst = strtoul( ( char * ) argv[2] );
size = strtoul( ( char * ) argv[3] );
if ( src == -1 || dst == -1 || size == -1 )
{
printf( "give error address\n" );
return -1;
}
NorFlashRead( DFT_DOWNLOAD_ADDR , src , size );
NorFlashProg( dst , DFT_DOWNLOAD_ADDR , size );
return 0;
}
int BootLoader( int argc , char* argv[] )
{
printf( "boot from flash, are you sure?" );
if ( argc )
if ( !getyorn() )
return 0;
memcpy( ( char * ) SRAM_BASE , ( char * ) EXT_ROM_BASE , EXT_ROM_SIZE );
// download_addr = BIOS_LOAD;
download_addr = *( U32 * ) BIOS_LOAD;
RunProgram( 0 , NULL );
return 0;
}
/*int BackupBios(int argc, char *argv[])
{
printf("move bios to the top of rom,are you sure?");
if(!getyorn())
return 0;
NorFlashRead(DFT_DOWNLOAD_ADDR, 0, (Image$$ZI$$Base-Image$$RO$$Base) );
NorFlashProg(BIOS_BASE, DFT_DOWNLOAD_ADDR, (Image$$ZI$$Base-Image$$RO$$Base) );
return 0;
}*/
#endif /*NOR_FLASH_SUPPORT*/
int MemoryDisplay( int argc , char* argv[] )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -