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

📄 shell.c

📁 杭州立宇泰ARMsys-P型ARM开发板BIOS代码
💻 C
📖 第 1 页 / 共 3 页
字号:
			for(j=0; j<16; j++) 
			{
				//ch = ((unsigned char *)tmp_data)[(i<<4)+j];
				ch = ((U8 *)src)[(i<<4)+j];
				putch((ch>=0x20&&ch<0x80)?ch:'.');
			}
			putch('\n');		
		}

	} while(getch()!=ESC_KEY);
//关闭cache后读tmp_data并打印才正常	
	return 0;
}

#ifdef	SAVE_ENV_SUPPORT

int SaveEnv(int argc, char*argv[])
{	
	int i=0,argcRun;
	char *argvRun[3];
	U32 addr;
	char temp[2][10];
	
	argcRun=4;	
	addr=(U32)&Env;
	ultostr((char *)temp[0],addr);
	ultostr((char *)temp[1],sizeof(Env));
	
	argvRun[1] = "armsys7";
	argvRun[2] = temp[0];	
	argvRun[3] = temp[1];
	//printf("argvRun[2]=%x.\n",addr);
	//printf("argvRun[1]=%s.\n",argvRun[1]);
	//printf("argvRun[2]=%s.\n",argvRun[2]);
	//printf("argvRun[3]=%s.\n",argvRun[3]);
	i=NandProg(argcRun,argvRun);
	if(i == 0)
		puts("Save the system setting OK!!!\n");
	else
		puts("Don't save the system setting!!\n");	
	
	return 0;
}

int LoadEnv()
{
	int i=0,argcRun;
	char *argvRun[3];
	U32 addr;
	char temp[1][10];
	
	addr=(U32)&Env;
	ultostr((char *)temp[0],addr);
	
	argcRun=3;
	argvRun[1] = "armsys7";
	argvRun[2] = temp[0];
	i=NandLoad(argcRun,argvRun);
	if(i != 0)
		printf("\nNot find system setting file!!!\n");

	if(Strncmp((const char *)Env.flag, "params", 7))   
		return 1;							
											
	SetSysClockPara(Env.clk_para);

	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(Env.baud);
	
	if(Env.prog_s_addr&0x3)
		Env.prog_s_addr = SIZE_64K;
	if(Env.prog_r_addr&0x3)
		Env.prog_r_addr = DFT_DOWNLOAD_ADDR;
	download_addr= DFT_DOWNLOAD_ADDR;	
	Env.boot_params[255] = 0;
	
	return 0;
}

#endif		//SAVE_ENV_SUPPORT

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_GATE;		
	Env.baud         = DEFAULT_SERIAL_BAUD;	
	Env.current_uart = DEFAULT_SERIAL_PORT;	
	GetSysClockPara(Env.clk_para);			
	Env.prog_s_addr  = SIZE_64K;						
	Env.prog_r_addr  = DFT_DOWNLOAD_ADDR;	
	Env.saved_in = 0;						
	
	SerialSwitch(Env.current_uart);			
	SerialChgBaud(Env.baud);				
	download_addr= DFT_DOWNLOAD_ADDR;
}

#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		//SERIAL_PORTS_SWITCH

#ifdef	NAND_FLASH_SUPPORT			//对NAND-FLASH的操作,用FAT16

int NandProg(int argc, char *argv[])
{
	unsigned int size = ~0;
	unsigned int data_begin = ~0;
	int handle,i;
	char dir[]="\\code\\";
	char *buff,*str;	

	data_begin = download_addr;
	size       = download_len;	
	
	str = argv[1];
	if(argc==2 && str[0] == '?')
	{
		puts("Example 1 : nfw file_name \n");
		puts("Example 2 : nfw file_name source_address size_bytes \n");	
		return 0;
	}
	
	if(argc<2)
	{
		printf("You must input the file name!!\n");
		printf("Usage: \\>nfw file_name from_addr file_size\n");
		return -1;
	}
	str = strcat(dir,argv[1]);
					
	if(argc>2)
		data_begin = strtoul((char *)argv[2]);
	if(argc>3)	
		size       = strtoul((char *)argv[3]);	
	if((size==-1)||(data_begin==-1)) 
	{
		printf("Arguments error\n");
		return -1;
	}
	
	if(size==0) 
	{
		printf("Write 0 Bytes!\n");
		return -1;
	}
	else
	{
		printf("The file size is 0x%x bytes. Datas from the address 0x%x.\n",size,data_begin);
		
		handle=Fat_open(str);
		if((handle!=-1)&&(handle!=-2))
		{
			i=Fat_close(handle);
			printf("The same file in directory will be deleted!\nAre you sure?");
			if(!getyorn())
				return -1;
			i=Fat_remove(str);
		}
		
		handle = Fat_creat(str, 0x27);//0x27:txt file?
	    printf("fat_creat's file handle=%d\n",handle);
	    if(handle==0)
	    {
	    	printf("Begin Write the '%s' to Nand-Flash,please Waiting...\n",str);
			buff=(char *)data_begin;		
			i=Fat_write(handle, (char *)buff, size);
	        printf("fat_write's file handle=0x%xbyte\n",i);            
			i=Fat_lseek(handle, 0, SEEK_SET);
			i=Fat_close(handle);
		}
		i=Fat_open(str);
		printf("fat_open's result=%d\n",i);
		i=Fat_close(i); 
		if(i==0)
			printf("Finished writing!\n" );
		else 
			printf("Err:Writing file!\n" );
	
	
	}
		return 0;	
}
#endif
#ifdef NAND_FLASH_SUPPORT
int NandLoad(int argc, char *argv[])
{
	//NAND_FLASH_SUPPORT
	int handle,i;
	char *buff,*str,*stru;
	char dir[]="\\code\\";
	download_addr =DFT_DOWNLOAD_ADDR;
	
	str = argv[1];	
	if(argc == 2 && str[0] == '?')
	{
		puts("Example 1 : nfr file_name \n");	
		puts("Example 2 : nfr file_name destination_address run \n");
		return 0;
	}
	
	if(argc<2)
	{
		printf("You must input the file name!!\n");
		return -1;
	}					
	str = strcat(dir,argv[1]);
		
	if(argc>2) 
	{
		download_addr = strtoul((char *)argv[2]);
		if(download_addr==-1)
			download_addr = DFT_DOWNLOAD_ADDR;
	}
	stru=argv[3];		
	handle=Fat_open(str);	
	//printf("fat_open's result=%d\n",handle);
	if((handle==(-1))||(handle==(-2)))
	{
		printf("Err:Not find the '%s' !!!\n",str);
		return -1;
	}
	else
	{  
		printf("Open the '%s' from nand flash to 0x%x\n",str, download_addr); 				
		buff=(char *)download_addr;
		i=Fat_read(handle, buff, 0x5f0000);  	//max read size 4Mbyte
		printf("fat_read's result=0x%xbyte\n",i);
		i=Fat_close(handle);
		if(i==0)		
			printf("Complete read,You will run the code from 0x%x!\n",download_addr);
		else 
			printf("Err:Load the datas fail!!!\n");
		//Delay(5000);//it should be delay a long time for pc software stable
		
		//printf("xxxxxxxxxx\n");
		
		Delay(1000);
		
		//printf("xxxxxxxxxx\n");
		
		//Delay(5000);
		
		//printf("xxxxxxxxxx\n");
		
		if(stru[0]=='r')
		//{
		//	printf("here1");
			((void (*)(void))download_addr)();
		//}
		//else
			//printf("here2");
	}
	
		
	return 0;
}
#endif
int NandFileDel(int argc, char *argv[])
{
	int handle,i;
	char dir[]="\\code\\";
	char *str;	
		
	str = argv[1];
	if(argc == 2 && str[0] == '?')
	{
		puts("Example : nfdel filename \n");
		return 0;
	}
	
	if(argc<2)
	{
		printf("You must input the file name!!\n");
		printf("Usage: \\>nfw file_name \n");
		return -1;
	}
	str = strcat(dir,argv[1]);
					
	handle=Fat_open(str);	
	printf("fat_open's result=%d\n",handle);
	if((handle==(-1))||(handle==(-2)))
	{
		printf("Err:Not find the '%s' !!!\n",str);
		return -1;
	}
	else
	{ 	
		i=Fat_close(handle);
		printf("The '%s' file will be deleted! Are you sure?",argv[1]);
		if(!getyorn())
			return -1;
		i=Fat_remove(str);
		if(i==0)
			printf("The '%s' file was deleted!\n",argv[1]);
		else
			printf("The '%s' file Not deleted!\n",argv[1]);
	}
	
	return 0;

}

int NandErase(int argc, char *argv[])
{
	U32 NFsize_M;
	NFsize_M =(NandFlashSize>>20);
	printf("\nThe format NandFlash size is %dMByte!\n",NFsize_M);
	printf("The datas in Nandflash will be lost, are you sure?");
	if(!getyorn())
			return -1;
	if(NFsize_M==16 || NFsize_M==32 || NFsize_M==64 || NFsize_M==128)
		Fat_Format(NAND_FLASH_Drv,NFsize_M,PART_TYPE_FAT16);		//0x06 是BIGDOS FAT16分区代码
	else
		printf("\nNo supported Nand Flash Found!\n");
	return 0;
}

int NandShow(int argc, char*argv[])
{

	FatInit(1);	
	Fat16_Nandflash_test();

	return 0;
}

//#endif		//NAND_FLASH_SUPPORT

#define	MAX_DOWNLOAD_SIZE	0x200000

#ifdef	XMODEM_DOWNLOAD_SUPPORT

int XmodemReceive(int argc, char *argv[])
{
	char *str;
	
	str = argv[1];
	if(argc==2 && str[0] == '?')
	{
		puts("Default download address : xmload \n");
		puts("Set new download address : xmload destination_address \n");	
		return 0;
	}
	
	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 %u[0x%x] bytes success\n", download_len,download_len);
	
	return download_len;
}

int XmodemReceiveRun(int argc, char *argv[])
{
	if(XmodemReceive(argc, argv)!=-1) 
	{		
		RunProgram(0, NULL);
	}
	return 0;
}

#endif		//XMODEM_DOWNLOAD_SUPPORT

int showoem(int argc, char *argv[])
{
	ShowBootInfo();
	puts("公司名称   :杭州立宇泰电子有限公司\n");
	puts("公司网址   :www.hzlitai.com.cn \n");
	puts("联系地址   :杭州市登云路639号杭州电子市场2B166号\n");
	puts("联系电话   :86-0571-89902166 \n");
	puts("电子邮箱   :lyt_office@yahoo.com.cn \n");
	puts("技术交流   :86-0571-88331446 \n");
	puts("交流邮箱   :lyt_tech@yahoo.com.cn \n"); 
		
	return 0;
}

int run_uclinux(int argc, char *argv[])
{
	int i=0,argcRun;
	char *argvRun[3];
	printf("\nLoad image.rom...\n");
	src_addr=0x30000;
	des_addr=0xc100000;
	if(0xa0==*(unsigned char *)(src_addr+2))
	{
		for(i=0;i<0x180000;i++)
			*(unsigned char *)des_addr++ = *(unsigned char *)src_addr++;
			    
		printf("\nStart uClinux\n");
		//ram_addr=0xc100000;
		((void (*)(void))ram_addr)();
	}
	else
	{
		argcRun=4;
		argvRun[1]="uclinux";
		argvRun[2]="c100000";
		argvRun[3]="r";
		i=NandLoad(argcRun,argvRun);
		if(i != 0)
			printf("\nNot find uClinux progrom!!!\n");
	
	}
	return 0;
}

int boardtest(int argc, char *argv[])
{
	int i=0,argcRun;
	char *argvRun[3];
	printf("\nLoading ARMSYS7_TEST Program...\n");
	src_addr=0x010000;
	des_addr=0xc100000;
	if(0x3c==*(unsigned char *)src_addr)
	{
		for(i=0;i<0x20000;i++)
			*(unsigned char *)des_addr++ = *(unsigned char *)src_addr++;
			    
		printf("\nStart Boardtesting...\n");
		printf("\n");
		//ram_addr=0xc100000;
		((void (*)(void))ram_addr)();
	}
	else
	{
		argcRun=4;
		argvRun[1]="systest";
		argvRun[2]="c100000";
		argvRun[3]="r";
		i=NandLoad(argcRun,argvRun);
		if(i != 0 )
			printf("\nNot find ARMSYS7_TEST program!!!\n");
	}
	return 0;
}

/******************************************************************************
【功能说明】默认系统设置,设置系统主频、IP地址、波特率、启动参数等
******************************************************************************/
int Default_Setting(int argc, char *argv[])
{
	unsigned short m ;
	char c[] = "root=/dev/rom0 console=ttyS0,115200 devfs=mount" ;
	
	Env.clk_para[0] = 56 ;		//设置默认系统时钟
	Env.clk_para[1] = 2 ;
	Env.clk_para[2] = 1 ;
	Env.clk_para[3] = 64000000 ;
	rPLLCON = (56 << 12) | (2<< 4) | 1 ;
	
	Delay(50);
	TimerInit(TIMER_FREQ);		
	SerialChgBaud(115200);		//设置串口默认波特率
	Delay(10);

	Env.nic_cfg.ip = ((192)<<24) | ((168)<<16) | ((253)<<8) | (2) ;			//设置默认IP地址
	Env.nic_cfg.mask = ((255)<<24) | ((255)<<16) | ((255)<<8) | (0) ;	
	Env.nic_cfg.gate = ((192)<<24) | ((168)<<16) | ((253)<<8) | (1) ;	
	
	Env.prog_r_addr = 0xc100000 ;
	Env.prog_s_addr = 0x10000 ;
	
	m = 0 ;
	while( c[m] != 0 )
	{
		Env.boot_params[m] = c[m] ;
		m++ ;
	}
	Env.boot_params[ m + 1 ] = 0 ;
		 	
	return 0;
}

//*****************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -