⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shell.c

📁 LPC2292 bios测试程序 说明:YL_LPC229X_BIOS_Data的目录说明
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -