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

📄 shell.c

📁 三星44B0的BOOTLOADER
💻 C
📖 第 1 页 / 共 3 页
字号:
	
	void (*fp)(void) = (void (*)(void))DFT_DOWNLOAD_ADDR;
	
	if(argc>1)
	{
		int	p = strtoul((unsigned char *)argv[1]);
		if(p>0)
			fp = (void (*)(void))p;			
	}
	
	Uart_Printf("Run program from 0x%x, are you sure? [y/n]", fp);
	
	while(1)
	{
		key = Uart_GetKey();
		if(key)
		{
			if(key=='y'||key=='Y')
			{
				Uart_SendByte(key);
				Uart_SendByte('\n');
				break;
			}
			if(key=='n'||key=='N')
			{
				Uart_SendByte(key);
				Uart_SendByte('\n');
				return 0;
			}				
		}
	}
	
	(*fp)();
	
	return 0;		
}


int ProgFlash(int argc, char *argv[])
{
	unsigned char key;
	unsigned int size = ~0;
	unsigned int data_begin = ~0;
	unsigned int prog_begin = ~0;
	unsigned int cache_cfg;

	if(argc!=4)
	{		
		Uart_Printf("Arguments error!\n");
		Uart_Printf("Usage:	prog a1 a2 size\na1 = program begin address\na2 = data pointer to ram\nsize = program size(Bytes)\n");
		return -1;
	}	
		
	prog_begin = strtoul((unsigned char *)argv[1]);			
	data_begin = strtoul((unsigned char *)argv[2]);
	size       = strtoul((unsigned char *)argv[3]);
	
	if(size==0)
	{
		Uart_Printf("Write 0 Bytes!\n");
		return -1;
	}
	
	if(prog_begin==-1||data_begin==-1)		//
	{
		Uart_Printf("Arguments error\n");
		return -1;
	}	
	
	Uart_Printf("program flash begin @0x%x, from ram data @0x%x, size = %dBytes\nAre you sure? [y/n]", prog_begin, data_begin, size);
	while(1)
	{
		key = Uart_GetKey();
		if(key)
		{
			if(key=='y'||key=='Y')
			{
				Uart_SendByte(key);
				Uart_SendByte('\n');
				break;
			}
			if(key=='n'||key=='N')
			{
				Uart_SendByte(key);
				Uart_SendByte('\n');
				return 0;
			}				
		}
	}		

	cache_cfg = rNCACHBE0;
	rNCACHBE0 = 0x20000000;
	SectorProg(prog_begin, (unsigned short *)data_begin, size);
	
	rNCACHBE0 = cache_cfg;
	
	return 0;
}
//*****************************************************************************

/******************************************************************************
【功能说明】通过TFTP软件,将目标代码通过以太网下载到SDRAM,然后
将下载的目标代码原原本本烧写到Flash中去,不对代码进行任何修改,适合于烧写BIOS
******************************************************************************/
int Bios_Auto_Prog_Flash(int argc, char *argv[])
{
	unsigned char key;
	char ch_tmp[4][10];
	char *para_ptr[4];	

	download_addr = DFT_DOWNLOAD_ADDR;

	ResetNic();
	Uart_Printf("Now begin address for download, use address 0x%x\n", download_addr);
	Uart_Printf("Load image file from host\n");
	Uart_Printf("Type tftp -i %d.%d.%d.%d put filename at the host PC\n", (IP_ADDRESS>>24)&0xff, (IP_ADDRESS>>16)&0xff, (IP_ADDRESS>>8)&0xff, IP_ADDRESS&0xff);
	Uart_Printf("Press ESC key to exit\n");	

	download_begin = 1;
	download_end = 0;
	
	while (1) 
	{
		NetSever();
		if ((key=Uart_GetKey())==ESC_KEY)
		{
			Uart_SendByte('\n');
			download_begin = 0;
			return 0 ;
		}
		if(download_end)
		{
			download_begin = 0;
			download_end = 0;
			goto Next_Program_Flash ;
		}
	}
		
	//*********************************************************************
Next_Program_Flash:
	ultostr((unsigned char *)ch_tmp[0], 0);	
	ultostr((unsigned char *)ch_tmp[1], DFT_DOWNLOAD_ADDR);	 	
	ultostr((unsigned char *)ch_tmp[2], download_len);		


	para_ptr[1] = ch_tmp[0];
	para_ptr[2] = ch_tmp[1];
	para_ptr[3] = ch_tmp[2];	
	//将直接将下载的目标代码原原本本烧写到Flash中去,不作任何改动
	
	ProgFlash(4, para_ptr);
	return	0;	
}
//*****************************************************************************

/******************************************************************************
【功能说明】通过TFTP软件,将目标代码通过以太网下载的SDRAM,然后将下载的代码烧写
到Flash中去,不过在Flash最低地址放置了跳转到BIOS的跳转指令,适合于烧写应用程序
******************************************************************************/
int APP_Auto_Prog_Flash(int argc, char *argv[])
{
	unsigned char key;
	char ch_tmp[3][10];
	char *para_ptr[4];	

	download_addr = DFT_DOWNLOAD_ADDR;

	ResetNic();
	Uart_Printf("Now begin address for download, use address 0x%x\n", download_addr);
	Uart_Printf("Load image file from host\n");
	Uart_Printf("Type tftp -i %d.%d.%d.%d put filename at the host PC\n", (IP_ADDRESS>>24)&0xff, (IP_ADDRESS>>16)&0xff, (IP_ADDRESS>>8)&0xff, IP_ADDRESS&0xff);
	Uart_Printf("Press ESC key to exit\n");	

	download_begin = 1;
	download_end = 0;
	
	while (1) 
	{
		NetSever();
		if ((key=Uart_GetKey())==ESC_KEY)
		{
			Uart_SendByte('\n');
			download_begin = 0;
			return 0 ;
		}
		if(download_end)
		{
			download_begin = 0;
			download_end = 0;
			goto Next_Program_Flash ;
		}
	}
		
	//*********************************************************************
Next_Program_Flash:
	ultostr((unsigned char *)ch_tmp[0], 0x10000);	
	ultostr((unsigned char *)ch_tmp[1], DFT_DOWNLOAD_ADDR);	 	
	ultostr((unsigned char *)ch_tmp[2], download_len);		

	para_ptr[1] = ch_tmp[0];
	para_ptr[2] = ch_tmp[1];
	para_ptr[3] = ch_tmp[2];	
	
	ProgFlash(4, para_ptr);
	return	0;	
}
//*****************************************************************************

int CopyFlash(int argc, char *argv[])
{
	unsigned int src, dst, size;
	unsigned int cache_cfg;
	char tmp[10];
	
	if(argc<4)
	{
		Uart_Printf("Usage : copy a1 a2 size\n");
		Uart_Printf("a1 = src address, a2 = dst address, size = copy bytes (all in hex)\n");
		return -1;
	}
	
	src  = strtoul((unsigned char *)argv[1]);
	dst  = strtoul((unsigned char *)argv[2]);
	size = strtoul((unsigned char *)argv[3]);
	if(src==-1||dst==-1||size==-1)
	{
		Uart_Printf("give error address\n");
		return	-1;
	}	

	cache_cfg = rNCACHBE0;
	rNCACHBE0 = 0x20000000;
	FlashRead(src, (unsigned short *)DFT_DOWNLOAD_ADDR, size);
	rNCACHBE0 = cache_cfg;

	argv[1] = argv[2];
	argv[2] = tmp;
	ultostr((unsigned char *)tmp, DFT_DOWNLOAD_ADDR);
	
	ProgFlash(4, argv);

	return 0;
}


//int BootLoader(int argc, char *argv[])
//{
//	unsigned char key;
//	
//	Uart_Printf("boot from flash, are you sure? [y/n]");
//	while(1)
//	{
//		key = Uart_GetKey();
//		if(key)
//		{
//			if(key=='y'||key=='Y')
//			{
//				void (*fp)(void) =(void (*)(void))BIOS_LOAD;
//				Uart_SendByte(key);
//				Uart_SendByte('\n');
//				(*fp)();							
//			}
//			if(key=='n'||key=='N')
//			{
//				Uart_SendByte(key);
//				Uart_SendByte('\n');
//				break;	
//			}
//		}			
//	}
//	
//	return 0;
//}


//int BackupBios(int argc, char *argv[])
//{
//	unsigned char key;
//	unsigned int cache_cfg;
//
//	Uart_Printf("move bios to the top of rom,are you sure? [y/n]");
//
//	while(1)
//	{
//		key = Uart_GetKey();
//		if(key)
//		{
//			if(key=='y'||key=='Y')
//			{
//				Uart_SendByte(key);
//				Uart_SendByte('\n');
//				break;
//			}
//			if(key=='n'||key=='N')
//			{
//				Uart_SendByte(key);
//				Uart_SendByte('\n');
//				return 0;
//			}				
//		}
//	}		
//
//	cache_cfg = rNCACHBE0;
//	rNCACHBE0 = 0x20000000;
//	FlashRead(0, (unsigned short *)DFT_DOWNLOAD_ADDR, 0xf000);
//	SectorProg(BIOS_BASE, (unsigned short *)DFT_DOWNLOAD_ADDR, 0xf000);
//	rNCACHBE0 = cache_cfg;
//
//	return 0;
//}


int MemoryDisplay(int argc, char*argv[])
{
	unsigned int sys_cfg;
	unsigned int src;
	unsigned int i, j;
	unsigned int *data;
	
	if(argc < 2)
		src = 0;
	else
	{
		src  = strtoul((unsigned char *)argv[1]);
		if(src%4 != 0) src-=src%4;
	}
	
	data = (unsigned int *)src;
	Uart_Printf("0x%8.8x: ",data);
	
	sys_cfg = rSYSCFG;
	rSYSCFG = 0x08;
	
	for(i=0;i<22;i++)
	{
		for(j=0;j<4;j++)
			Uart_Printf("%8.8x ",*data++);
		if(i<21)
			Uart_Printf("\n0x%8.8x: ",data);
	}
	Uart_SendByte('\n');

	rSYSCFG = sys_cfg;

	return 0;
}


int Flash2Mem(int argc, char*argv[])
{
	unsigned int src, dst, size, i;
	unsigned int cache_cfg;
	unsigned int *data_src, *data_dst;
	
	if(argc<4)
	{
		Uart_Printf("Usage : move a1 a2 size\n");
		Uart_Printf("a1 = src address, a2 = dst address, size = copy bytes (all in hex)\n");
		return -1;
	}

	src  = strtoul((unsigned char *)argv[1]);
	dst  = strtoul((unsigned char *)argv[2]);
	size = strtoul((unsigned char *)argv[3]);

	if(src==-1||dst==-1||size==-1||(dst-size)<src)
	{
		Uart_Printf("give error address\n");
		return	-1;
	}	
	data_src = (unsigned int *)src;
	data_dst = (unsigned int *)dst;

	cache_cfg = rNCACHBE0;
	rNCACHBE0 = 0x20000000;
	size = size%4 ? size/4+1 : size/4;
	for(i=0;i<size;i++)
		*data_dst++ = *data_src++;
	rNCACHBE0 = cache_cfg;

	Uart_Printf("move finished!\n");

	return 0;
}


//int SaveEnv(int argc, char*argv[])
//{
//	unsigned int * pdata;
//	unsigned int cache_cfg;
//
//	cache_cfg = rNCACHBE0;
//	rNCACHBE0 = 0x20000000;
//	pdata = (unsigned int*)(DFT_DOWNLOAD_ADDR+ENV_ADD);
//
//	FlashRead(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR), SECTOR_SIZE);			
//	*pdata++ = IP_ADDRESS;
//	*pdata++ = GATE_ADDRESS;
//	*pdata++ = MASK_ADDRESS;
//	*pdata++ = SERIAL_BAUD;
//	*pdata++ = MCLK_M;
//	*pdata++ = MCLK_P;
//	*pdata++ = MCLK_S;
//	SectorProg(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR), SECTOR_SIZE);	
//
//	rNCACHBE0 = cache_cfg;
//
//	return 0;	
//}
//
//
//int LoadEnv(int argc, char*argv[])
//{
//	unsigned int * pdata;
//	unsigned int cache_cfg;
//	unsigned int t_ip, t_gate, t_mask, t_baud, t_mclk;
//	unsigned char t_m, t_p, t_s, tt_s;
//	unsigned char key;
//	int i = 1;
//	
//	cache_cfg = rNCACHBE0;
//	rNCACHBE0 = 0x20000000;
//	pdata = (unsigned int*)(DFT_DOWNLOAD_ADDR+ENV_ADD);
//	FlashRead(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR), SECTOR_SIZE);			
//	rNCACHBE0 = cache_cfg;
//
//	t_ip = *pdata++;
//	t_gate = *pdata++;
//	t_mask = *pdata++;
//	t_baud = *pdata++;
//	t_m = *pdata++;
//	t_p = *pdata++;
//	t_s = *pdata++;
//
//	tt_s = t_s;
//	while(tt_s--)
//		i *= 2;	
//	t_mclk= (EXT_OSC_CLK*(t_m+8))/((t_p+2)*i);		
//
//	Uart_Printf("IP address : %u.%u.%u.%u\n", (t_ip>>24)&0xff, (t_ip>>16)&0xff, (t_ip>>8)&0xff, t_ip&0xff);
//	Uart_Printf("IP address : %u.%u.%u.%u\n", (t_gate>>24)&0xff, (t_gate>>16)&0xff, (t_gate>>8)&0xff, t_gate&0xff);
//	Uart_Printf("IP address : %u.%u.%u.%u\n", (t_mask>>24)&0xff, (t_mask>>16)&0xff, (t_mask>>8)&0xff, t_mask&0xff);
//	Uart_Printf("Serial baud : %d\n", t_baud);
//	Uart_Printf("Clock : %dHz\n", t_mclk);	
//
//	Uart_Printf("Load enviroment value from flash [y/n]");
//	
//	while(1)
//	{
//		key = Uart_GetKey();
//		if(key)
//		{
//			if(key=='y'||key=='Y')
//			{
//				Uart_SendByte(key);
//				Uart_SendByte('\n');
//				break;
//			}
//			if(key=='n'||key=='N')
//			{
//				Uart_SendByte(key);
//				Uart_SendByte('\n');
//				return 0;
//			}				
//		}
//	}
//
//	locnode.ip = IP_ADDRESS = t_ip;
//	locnode.gate = GATE_ADDRESS = t_gate;
//	locnode.mask = MASK_ADDRESS = t_mask;
//	MCLK_M = t_m; MCLK_P = t_p; MCLK_S = t_s;
//	SERIAL_BAUD = t_baud;
//
//	i = 8000;
//	while(i--);
//	ChangePllValue(MCLK_M, MCLK_P, MCLK_S);
//
//	i = 8000;
//	while(i--);		
//	Uart_Init(0,SERIAL_BAUD);
//	Uart_Getch();
//	
//	return 0;
//
//}

⌨️ 快捷键说明

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