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

📄 shell.c

📁 arm7 s3c44b0x开发板fs44b的bios启动源代码及使用说明 下载方法等
💻 C
📖 第 1 页 / 共 4 页
字号:
	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() ;		//
	tftp_main(download_addr, Env.nic_cfg.ip);
	CacheFlush() ;		//
	CacheEnable() ;		//
	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(%d) bytes success\n", download_len, 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;
		
	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();

	//DRAM_BASE	= 0x0c000000
	//BOOT_PARAMS_ADDR = (DRAM_BASE+0x100)
/*	if(((U32)fp & (~0xfff)) != (BOOT_PARAMS_ADDR & (~0xfff))) //modfied 2007.03.09
	{
		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>=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("copy flash from src to dst address\n");
		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;
	}
		
	//ROM_BASE			0x00000000
	//ROM_SIZE			SIZE_2M (0x00200000)
	//DRAM_BASE			0x00000000
	memcpy((char *)DRAM_BASE, (char *)ROM_BASE, ROM_SIZE);
//	download_addr = BIOS_LOAD;
	download_addr = *(U32 *)BIOS_LOAD;//BIOS_LOAD			(ROM_SIZE-4)
	RunProgram(0, NULL);
	return 0;
}

/*******************************************************************
[功能说明] 备份BIOS程序到 Flash 地址 1F0000 开始处
*******************************************************************/
int BackupBios(int argc, char *argv[])
{
	printf("move bios to the top of rom,are you sure?");

	if(!getyorn())
		return 0;
	
	//DRAM_BASE 0x0c000000
	//ROM_SIZE 	0x00200000
	//BIOS_SIZE 0x00010000
	//BIOS_BASE	(ROM_SIZE-BIOS_SIZE) = 0x1F0000
	//DFT_DOWNLOAD_ADDR (DRAM_BASE + 0x8000) = 0x0C008000
	NorFlashRead(DFT_DOWNLOAD_ADDR, 0, 0x10000);//0xe000
	NorFlashProg(BIOS_BASE, DFT_DOWNLOAD_ADDR, 0x10000);
//	NorFlashRead(DFT_DOWNLOAD_ADDR, 0, 0x1000);
//	NorFlashProg(BIOS_BASE, DFT_DOWNLOAD_ADDR, 0x1000);
	return 0;
}

/*******************************************************************
[功能说明] 显示 FLASH 数据
*******************************************************************/
int FlashDisplay(int argc, char*argv[])
{
	//memcpy((char *)(dst), (char *)(ROM_BASE+(src)), (int)(size))
	unsigned int src_addr = 0;
	unsigned int src;
	unsigned int i, j;
	unsigned int tmp_data[0x100];
	
	if(argc > 1) 
	{
		unsigned int tmp = strtoul((char *)argv[1]);
		src_addr  = (tmp==-1) ? src_addr : tmp;
		src_addr &= ~0xf;
		if(src_addr >= ROM_SIZE)
		{
			printf("Invalid flash address, the address is from 0~0x%x, 16Bits aligned\n", ROM_SIZE);
			return -1;
		}
	}
	
	printf("Press ESC key to exit, other key to continue...\n");

	do{
		src = src_addr;
		src_addr += 0x100;
		
		NorFlashRead(tmp_data, src, 0x100);
		
		for(i=0; i<16; i++) 
		{

			unsigned char ch;
			
			printf("0x%08x:", src+(i<<4));
			for(j=0; j<16; j++) 
			{
				//ch = ((unsigned char *)src)[(i<<4)+j];
				ch = ((unsigned char *)tmp_data)[(i<<4)+j];
				putch(' ');
				printf("%02x", 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');		
		}
		printf("Press ESC key to exit, other key to continue...\n");
	} while(src_addr < ROM_SIZE && getch()!=ESC_KEY);
//关闭cache后读tmp_data并打印才正常
	
	return 0;
}

#endif	/*NOR_FLASH_SUPPORT*/

/*******************************************************************
[功能说明] 内存显示
*******************************************************************/
int MemoryDisplay(int argc, char*argv[])
{
	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%08x:", src+(i<<4));
			for(j=0; j<16; j++) 
			{
				//ch = ((unsigned char *)tmp_data)[(i<<4)+j];
				ch = ((unsigned char *)src)[(i<<4)+j];
				putch(' ');
				printf("%02x", 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;
}

⌨️ 快捷键说明

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