📄 shell.c
字号:
static unsigned int src_addr;
unsigned int src;
unsigned int i, j;
//unsigned int tmp_data[64];
if ( argc > 1 )
{
unsigned int tmp = strtoul( ( char * ) argv[1] );
src_addr = ( tmp == -1 ) ? src_addr : tmp;
src_addr &= ~0xf;
}
printf( "Press ESC key to exit, other key to continue...\n" );
do
{
src = src_addr;
src_addr += 0x100;
// CacheDisable();
CacheFlush(); //防止tmp_data被cache
// CacheEnable();
//for(i=0; i<64; i++)
// tmp_data[i] = ((unsigned int *)src)[i];
for ( i = 0; i < 16; i++ )
{
unsigned char ch;
printf( "0x%-8x:" , src + ( i << 4 ) );
for ( j = 0; j < 16; j++ )
{
//ch = ((unsigned char *)tmp_data)[(i<<4)+j];
ch = ( ( unsigned char * ) src )[( i << 4 ) + j];
printf( "%3x" , ch );
}
putch( ' ' );
putch( ' ' );
for ( j = 0; j < 16; j++ )
{
//ch = ((unsigned char *)tmp_data)[(i<<4)+j];
ch = ( ( unsigned char * ) src )[( i << 4 ) + j];
putch( ( ch >= 0x20 && ch < 0x80 ) ? ch : '.' );
}
putch( '\n' );
}
}
while ( getch() != ESC_KEY );
//关闭cache后读tmp_data并打印才正常
return 0;
}
int MemoryShow( int argc , char* argv[] )
{
unsigned long addr;
int mode;
if ( argc != 3 )
goto err_exit;
if ( !strncmp( argv[1] , "-c" , 3 ) )
mode = 0;
else if ( !strncmp( argv[1] , "-s" , 3 ) )
mode = 1;
else if ( !strncmp( argv[1] , "-l" , 3 ) )
mode = 2;
else
goto err_exit;
addr = strtoul( ( char * ) argv[2] );
if ( addr == -1 )
goto err_exit;
if ( ( mode == 1 ) && ( addr & 1 ) )
goto err_exit;
if ( ( mode == 2 ) && ( addr & 3 ) )
goto err_exit;
// CacheDisable();
CacheFlush();
// CacheEnable();
printf( "mem @0x%-8x = 0x%x\n" , addr ,
( mode == 2 ) ?
*( U32 * ) addr :
( mode == 1 ) ?
*( U16 * ) addr :
*( U8 * ) addr );
return 0;
err_exit : puts( "Usage : memd -c/s/l addr\n-c/s/l 8/16/32 bits\n" );
return -1;
}
int MemorySet( int argc , char* argv[] )
{
unsigned long addr;
int mode;
U32 data;
if ( argc != 4 )
goto err_exit;
if ( !strncmp( argv[1] , "-c" , 3 ) )
mode = 0;
else if ( !strncmp( argv[1] , "-s" , 3 ) )
mode = 1;
else if ( !strncmp( argv[1] , "-l" , 3 ) )
mode = 2;
else
goto err_exit;
addr = strtoul( ( char * ) argv[2] );
if ( addr == -1 )
goto err_exit;
data = strtoul( ( char * ) argv[3] );
if ( data == -1 )
goto err_exit;
if ( !mode )
{
/*__asm {
strb data, [addr]
}*/
outportb( data , addr );
}
else if ( mode == 1 )
{
if ( addr & 1 )
goto err_exit;
/*__asm {
strh data, [addr]
}*/
outportw( data , addr );
}
else if ( mode == 2 )
{
if ( addr & 3 )
goto err_exit;
/*__asm {
str data, [addr]
}*/
outportl( data , addr );
}
// printf("set mem @0x%-8x = 0x%x\n", addr, (mode==2)?*(U32 *)addr:(mode==1)?*(U16 *)addr:*(U8 *)addr);
//puts("set ");
//MemoryShow(3, argv);
return 0;
err_exit : puts( "Usage : memd -c/s/l addr data\n-c/s/l 8/16/32 bits\n" );
return -1;
}
#ifdef SAVE_ENV_SUPPORT
int SaveEnv( int argc , char* argv[] )
{
#ifdef SAVE_ENV_IN_NAND
NFSaveParams( ( char * ) &Env );
#else
NorFlashProg( BIOS_ENV_ADDR , ( U32 ) & Env , sizeof( Env ) );
#endif
return 0;
}
int LoadEnv()
{
int i;
#ifdef SAVE_ENV_IN_NAND
NFSearchParams( ( char * ) &Env );
#else
NorFlashRead( ( char * ) &Env , ( char * ) ( BIOS_ENV_ADDR ) ,
sizeof( Env ) );
#endif
if ( strncmp( ( const char * ) Env.flag , "params" , 7 ) )
return -1;
for ( i = 0; BaudSet[i]; i++ )
if ( Env.baud == BaudSet[i] )
break;
if ( !BaudSet[i] )
Env.baud = DEFAULT_SERIAL_BAUD;
SerialSwitch( Env.current_uart );
SerialChgBaud( 0 , Env.baud );
if ( Env.prog_s_addr & 0x3 )
Env.prog_s_addr = EXT_ROM_BASE + SIZE_64K;
if ( Env.prog_r_addr & 0x3 )
Env.prog_r_addr = DFT_DOWNLOAD_ADDR;
Env.boot_params[255] = 0;
return 0;
}
#endif
void DftEnvInit( void )
{
memset( &Env , 0 , sizeof( Env ) );
memcpy( Env.flag , "params" , 8 );
Env.nic_cfg.ip = DEFAULT_IP_ADDR;
Env.nic_cfg.mask = DEFAULT_IP_MASK;
Env.nic_cfg.gate = DEFAULT_IP_ADDR;
Env.baud = DEFAULT_SERIAL_BAUD;
Env.current_uart = DEFAULT_SERIAL_PORT;
Env.prog_s_addr = EXT_ROM_BASE ;
Env.prog_r_addr = DFT_DOWNLOAD_ADDR;
Env.NandPartition[0].size = 0;
Env.saved_in = 0; //use nor flash, nointrd
RTC_Def_Time_Set() ;
SerialSwitch( Env.current_uart );
SerialChgBaud( 0 , Env.baud );
}
#ifdef SERIAL_PORTS_SWITCH
int ChgUartPort( int argc , char* argv[] )
{
Env.current_uart = !Env.current_uart;
printf( "Set uart port%d...\n" , Env.current_uart ? 1 : 0 );
SerialSwitch( Env.current_uart );
return 0;
}
#endif
#ifdef NAND_FLASH_SUPPORT
int NandProg( int argc , char* argv[] )
{
unsigned int size = ~0;
unsigned int data_begin = ~0;
data_begin = download_addr;
size = download_len;
if ( argc > 1 )
data_begin = strtoul( ( char * ) argv[1] );
if ( argc > 2 )
size = strtoul( ( char * ) argv[2] );
if ( ( size == -1 ) || ( data_begin == -1 ) )
{
printf( "Arguments error\n" );
goto err_exit;
}
if ( size == 0 )
{
printf( "Write 0 Bytes!\n" );
return -1;
}
else
return WrFileToNF( data_begin , size );
err_exit:
printf( "Usage: nfprog addr size\naddr = data pointer to ram\nsize = program size(Bytes)\n" );
return -1;
}
int NandLoad( int argc , char* argv[] )
{
U32 load_part = -1;
download_addr = DFT_DOWNLOAD_ADDR;
if ( argc > 1 )
{
download_addr = strtoul( ( char * ) argv[1] );
if ( download_addr == -1 )
download_addr = DFT_DOWNLOAD_ADDR;
if ( argc > 2 )
load_part = strtoul( argv[2] );
}
printf( "Load data form nand flash to 0x%x\n" , download_addr );
return RdFileFrNF( download_addr , load_part );
}
int NandErase( int argc , char* argv[] )
{
return EraseNandPart();
}
int NandPart( int argc , char* argv[] )
{
unsigned long i, addr[8];
if ( !NandFlashSize )
return -1;
if ( ( argc <= 1 ) || ( argc > 9 ) )
goto err_exit;
addr[0] = 0;
for ( i = 1; i < argc; i++ )
{
addr[i] = strtoul( ( char * ) argv[i] );
if ( ( addr[i] == -1 ) ||
( addr[i] <= addr[i - 1] ) ||
( addr[i] & 0x3fff ) ||
( addr[i] > NandFlashSize ) )
goto err_exit;
}
printf( "Set %d partition(s) :\n" , argc - 1 );
for ( i = 0; i < argc - 1; i++ )
{
pNandPart[i].offset = addr[i];
pNandPart[i].size = addr[i + 1] - addr[i];
pNandPart[i].name = " ";
pNandPart[i + 1].size = 0;
printf( "part%d : start address 0x%-8x, size 0x%-8x\n" , i ,
pNandPart[i].offset , pNandPart[i].size );
}
return 0;
err_exit:
puts( "Usage : nfpart a1 a2 ... an\na1 = part1 end address, an = partn end address, n<=8, address must be 16KB align and don't excess the size of nand flash \n" );
return -1;
}
#endif
int SetProgAddr( int argc , char* argv[] )
{
int addr, obj;
if ( argc < 2 )
goto err_exit;
if ( !strncmp( argv[1] , "-s" , 3 ) )
obj = 0;
else if ( !strncmp( argv[1] , "-r" , 3 ) )
obj = 1;
else if ( !strncmp( argv[1] , "-i" , 3 ) )
obj = 2;
else if ( !strncmp( argv[1] , "-ni" , 4 ) )
{
Env.saved_in &= ~2;
return 0;
}
else if ( !strncmp( argv[1] , "-nor" , 5 ) )
{
Env.saved_in &= ~1;
return 0;
}
else if ( !strncmp( argv[1] , "-nand" , 6 ) )
{
Env.saved_in |= 1;
return 0;
}
else
goto err_exit;
if ( argc < 3 )
goto err_exit;
addr = strtoul( ( char * ) argv[2] );
if ( addr == -1 )
goto err_exit;
printf( "Set Program %s address = 0x%x\n" ,
( obj == 0 ) ? "save" : ( obj == 1 ) ? "run" : "initrd" , addr );
if ( obj == 0 )
Env.prog_s_addr = addr;
else if ( obj == 1 )
Env.prog_r_addr = addr;
else if ( obj == 2 )
{
Env.initrd_addr = addr;
Env.saved_in |= 2;
}
return 0;
err_exit:
puts( "Usage : setpa -s[-r][-i][-ni][-nor][-nand] [address]\n-s save address\n-r run address\n-i initrd save address\n-ni disable initrd\n-nor use nor flash to save\n-nand use nand flash to save\n" );
return -1;
}
int SetBootParams( int argc , char* argv[] )
{
char params[sizeof( Env.boot_params )];
int params_bytes;
puts( "Please enter params for boot, press Enter to complete, Esc to exit\n" );
params_bytes = GetParameter( params , sizeof( Env.boot_params ) - 1 );
putch( '\n' );
if ( params_bytes != -1 )
{
Env.boot_params[params_bytes] = 0;
while ( params_bytes )
{
params_bytes--;
Env.boot_params[params_bytes] = params[params_bytes];
}
}
return 0;
}
#define LINUX_PAGE_SHIFT 12
#define LINUX_PAGE_SIZE (1<<LINUX_PAGE_SHIFT)
#define COMMAND_LINE_SIZE 1024
struct param_struct
{
union
{
struct
{
unsigned long page_size; /* 0 */
unsigned long nr_pages; /* 4 */
unsigned long ramdisk_size; /* 8 */
unsigned long flags; /* 12 */
#define FLAG_READONLY 1
#define FLAG_RDLOAD 4
#define FLAG_RDPROMPT 8
unsigned long rootdev; /* 16 */
unsigned long video_num_cols; /* 20 */
unsigned long video_num_rows; /* 24 */
unsigned long video_x; /* 28 */
unsigned long video_y; /* 32 */
unsigned long memc_control_reg; /* 36 */
unsigned char sounddefault; /* 40 */
unsigned char adfsdrives; /* 41 */
unsigned char bytes_per_char_h; /* 42 */
unsigned char bytes_per_char_v; /* 43 */
unsigned long pages_in_bank[4]; /* 44 */
unsigned long pages_in_vram; /* 60 */
unsigned long initrd_start; /* 64 */
unsigned long initrd_size; /* 68 */
unsigned long rd_start; /* 72 */
unsigned long system_rev; /* 76 */
unsigned long system_serial_low; /* 80 */
unsigned long system_serial_high; /* 84 */
unsigned long mem_fclk_21285; /* 88 */
} s;
char unused[256];
} u1;
union
{
char paths[8][128];
struct
{
unsigned long magic;
char n[1024 - sizeof( unsigned long )];
} s;
} u2;
char commandline[COMMAND_LINE_SIZE];
};
void SetParams( void )
{
U32 i;
struct param_struct* params = ( struct param_struct* ) BOOT_PARAMS_ADDR;
for ( i = 0; i < ( sizeof( struct param_struct ) >> 2 ); i++ )
( ( U32 * ) params )[i] = 0;
params->u1.s.page_size = LINUX_PAGE_SIZE;
params->u1.s.nr_pages = ( SRAM_SIZE >> LINUX_PAGE_SHIFT );
// if(strlen((char *)boot_params)>=sizeof(boot_params))
// boot_params[sizeof(boot_params)-1] = 0;
memcpy( params->commandline , ( char * ) Env.boot_params ,
sizeof( Env.boot_params ) );
printf( "Set boot params = %s\n" , params->commandline );
}
#define MAX_DOWNLOAD_SIZE 0x200000
#ifdef XMODEM_DOWNLOAD_SUPPORT
int XmodemReceive( 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 by xmodem to 0x%x...\n" , download_addr );
download_len = XModemReceive( ( char * ) download_addr ,
MAX_DOWNLOAD_SIZE );
if ( download_len != -1 )
printf( "\nReceived %x bytes success\n" , download_len );
return download_len;
}
int XmodemReceiveRun( int argc , char* argv[] )
{
if ( XmodemReceive( argc , argv ) != -1 )
{
RunProgram( 0 , NULL );
}
return 0;
}
#endif
int SetBootKey( int argc , char* argv[] )
{
int keyno, keystat, boot = 0;
if ( argc < 3 )
goto err_exit;
keyno = strtoul( argv[1] );
keystat = strtoul( argv[2] );
if ( ( keyno > 4 ) || ( keyno < 1 ) || ( keystat > 1 ) || ( keystat < 0 ) )
goto err_exit;
keyno--;
if ( argc > 3 )
{
if ( !strncmp( "-b" , argv[3] , 6 ) )
boot = 1;
else
goto err_exit;
}
Env.boot_key = ( 'k' << 24 ) |
( 'b' << 16 ) |
( keyno << 12 ) |
( keystat << 8 ) |
( boot );
return 0;
err_exit:
printf( "Usage : keyrun keyno keystat [-b]\nkeyno key number 1~4\nkeystat 1->high, 0->low to autoboot\n-b execute boot\n" );
return -1;
}
int SetMachine( int argc , char* argv[] )
{
U32 machine, len;
if ( argc < 2 )
goto err_exit;
len = strlen( argv[1] );
machine = strtodec( argv[1] , len );
if ( ( len > 4 ) || ( machine == -1 ) )
goto err_exit;
Env.machine = machine;
return 0;
err_exit:
printf( "Usage : machine no\nno machine number(0~9999)\n" );
return -1;
}
#ifdef USB_DOWNLOAD_SUPPORT
int UsbDownload( int argc , char* argv[] )
{
download_addr = DFT_DOWNLOAD_ADDR;
if ( argc > 1 )
{
download_addr = strtoul( argv[1] );
if ( download_addr == -1 )
download_addr = DFT_DOWNLOAD_ADDR;
}
printf( "USB download file to 0x%x\n" , download_addr );
download_len = BoardUsbDownload( download_addr );
if ( download_len != -1 )
printf( "0x%x bytes received\n" , download_len );
return download_len;
}
int UsbDownloadRun( int argc , char* argv[] )
{
if ( UsbDownload( argc , argv ) != -1 )
{
RunProgram( 0 , NULL );
}
return 0;
}
#endif
/******************************************************************************
【功能说明】默认系统设置,设置系统主频、IP地址、波特率、启动参数等
******************************************************************************/
int Default_Setting( int argc , char* argv[] )
{
return 0 ;
}
//*****************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -