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

📄 shell.c

📁 这个是FS44B0XII板子的BIOS源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
{
	Uart_Printf("System is running @ %dHz\n", MCLK);
	return 0;
}

int GetDate(int argc, char *argv[])
{
	int i, error = 0;
	char tmp[8];
	char *str;
	unsigned int year, month, day;
	
	RtcGetTime(&SysTime);
	Uart_Printf("Current date is %d-%x-%x %s\n", SysTime.year, SysTime.month, SysTime.day, WeekDay[SysTime.weekday-1]);

	if(argc<2)
		return 0;	
		
	str = argv[1];	
	
	for(i=0; i<5; i++)	
		tmp[i] = str[i];
	if(tmp[4]!='-')
		error = 1;
	year = strtodec(str, 4);
	if(year<2000||error)
	{			
		Uart_Printf("year error!\n");
		return 0;
	}		
				
	str += 5;
	i = 0;		
	if(str[++i]!='-')
		if(str[++i]!='-')
			error = 1;
	str[i] = 0;					
	month = strtobcd(str);
	if((month-1)>0x11||error)
	{				
		Uart_Printf("month error!\n");
		return 0;
	}		
		
	str += i+1;		
	i = 0;
	if(str[++i]!=0)
		if(str[++i]!=0)
			error = 1;
	str[i] = 0;		
	day = strtobcd(str);
	if((day-1)>0x30||error)
	{		
		Uart_Printf("day error!\n");
		return 0;
	}	
	
	SysTime.year  = year-2000;
	SysTime.month = month;
	SysTime.day   = day;		
	RtcSetDay(&SysTime);	
	
	Uart_Printf("Set date %d-%2x-%2x %s\n", year, month, day, WeekDay[SysTime.weekday-1]);
	
	return 1;
}


/*******************************************************************************************************/
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)>5)		//0-1 = 0xffffffff
		error = 1;
	
	if(!error)
	{
		SysTime.weekday = i+1;	//1~7
		RtcSetWeek(&SysTime);
		Uart_Printf("Set to %s\n", WeekDay[i]);
	}
	else
	{
		Uart_Printf("Please enter a number to set weekday\n");
		for(i=0; i<7; i++) {
			Uart_Printf("%d : %s\n", i, WeekDay[i]);
		}
	}
	
	return 0;	
}


/*******************************************************************************************************/
int GetTime(int argc, char *argv[])
{
	int i, error = 0;
	char *str;
	unsigned int hour, min, sec;
	
	RtcGetTime(&SysTime);
	Uart_Printf("Current time is %2x:%2x:%2x\n", SysTime.hour, SysTime.min, SysTime.sec);
	
	if(argc>1)
	{
		str = argv[1];
		i = 0;
		if(str[++i]!=':')
			if(str[++i]!=':')
				error = 1;
		str[i] = 0;		
		hour = strtobcd(str);
		if(hour>0x23||error)
		{
			Uart_Printf("hour error!\n");
			return error;
		}
		
		str	+= i+1;
		i = 0;		
		if(str[++i]!=':')
			if(str[++i]!=':')
				error = 1;
		str[i] = 0;		
		min = strtobcd(str);		
		if(min>0x59||error)
		{
			Uart_Printf("minute error!\n");
			return error;
		}
		
		str	+= i+1;
		i = 0;		
		if(str[++i]!=0)
			if(str[++i]!=0)
				error = 1;
		str[i] = 0;		
		sec = strtobcd(str);		
		if(sec>0x59||error)
		{
			Uart_Printf("second error!\n");
			return error;
		}
		
		SysTime.hour = hour;
		SysTime.min  = min;
		SysTime.sec = sec;		
		RtcSetTime(&SysTime);
		
		Uart_Printf("Set time %x:%x:%x\n", hour, min, sec);								
	}	
	
	return error;
}


/*******************************************************************************************************/
int ChgSysMclk(int argc, char *argv[])
{
	int i, mdiv, pdiv, sdiv;
	char tmp[4];
	
	Uart_Printf("This function is for adjust system running clock!!!\n");
	Uart_Printf("Current clock is %dHz\n", MCLK);
	Uart_Printf("Please enter the PLL parameter to use, mdiv[0-255], pdiv[0-63], sdiv[0-3]\n");
	
	Uart_Printf("mdiv: ");	
	if((mdiv=strtodec(tmp, GetParameter(tmp, 3)))<0)		
	{
		Uart_Printf("\nget mdiv Error!\n");
		return 0;
	}					
	
	Uart_Printf("\npdiv: ");
	if((pdiv=strtodec(tmp, GetParameter(tmp, 3)))<0)		
	{
		Uart_Printf("\nget pdiv Error!\n");
		return 0;
	}	
	
	Uart_Printf("\nsdiv: ");
	
	if((sdiv=strtodec(tmp, GetParameter(tmp, 3)))<0)		
	{
		Uart_Printf("\nget sdiv Error!\n");
		return 0;
	}		
	
	Uart_Printf("\nYou set System clock mdiv = %d, pdiv = %d, sdiv = %d\n", mdiv, pdiv, sdiv);
	
	i = 8000;
	while(i--);
		
	ChangePllValue(mdiv, pdiv, sdiv);
	
	i = 8000;
	while(i--);	
	Uart_Init(0,SERIAL_BAUD);
	Uart_Printf("Current clock is %dHz\n", MCLK);	
	MCLK_M = mdiv; MCLK_P = pdiv; MCLK_S = sdiv;
	
	return 0;
}


/*******************************************************************************************************/
int ChgBaudRate(int argc, char *argv[])
{
	int i;
	
	for(i=0; BaudSet[i]; i++)
		Uart_Printf("%d : %d\n", i, BaudSet[i]);
		
	Uart_Printf("Please enter choice : ");
	
	while(1)
	{
		int ch = Uart_Getch();
		
		if(ch<='6'||ch>='0')
		{
			SERIAL_BAUD = BaudSet[ch-'0'];
			Uart_Printf("Baud rate set to : %d\nPress any key to continue\n", SERIAL_BAUD);
			i = 0x4000;
			while(i--);		//wait transmit end
			Uart_Init(0,SERIAL_BAUD);
			Uart_Getch();
			break;
		}
			
	}	

	return 0;
}


/*******************************************************************************************************/
int SetIpAddr(int argc, char *argv[])
{
	int i, j, err = 0;
	char *str;
	char ch = '.';
	
	if(argc<2)
	{
		Uart_Printf("IP address : %u.%u.%u.%u\n", (IP_ADDRESS>>24)&0xff, (IP_ADDRESS>>16)&0xff, (IP_ADDRESS>>8)&0xff, IP_ADDRESS&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]<0||ip[j]>254||err)
		{
			Uart_Printf("IP address error\n");
			return -1;
		}			
		str += i+1;
	}
	
	Uart_Printf("Set IP address : %u.%u.%u.%u\n", ip[0], ip[1], ip[2], ip[3]);					
	IP_ADDRESS = (ip[0]<<24)|(ip[1]<<16)|(ip[2]<<8)|ip[3];
	locnode.ip = IP_ADDRESS;
	ArpInit();
	return 0;	
}


int LoadFromNet(int argc, char *argv[])
{
	unsigned char key;

	if(argc<2)
		download_addr = DFT_DOWNLOAD_ADDR;
	else {
		unsigned long tmp;
		tmp = strtoul((unsigned char*)argv[1]);
		download_addr = (tmp==-1)?download_addr:tmp;
	}

	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 -1;
		}
		if(download_end)
		{
			download_begin = 0;
			download_end = 0;
			return 0;
		}
	}
}
//*****************************************************************************

/******************************************************************************
【功能说明】将目标代码通过网口下载到SDRAM的默认下载地址,然后运行下载的目标代码
******************************************************************************/
int Net_Load_Run(int argc, char *argv[])
{	
	if(!LoadFromNet(argc, argv)) {
		void (*fp)(void) = (void (*)(void))download_addr;
		(*fp)();
	}
	return 0;	
}

#define	DNW_DOWNLOAD
#ifdef	DNW_DOWNLOAD
//中断入口内容不可确定,不要用中断
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((unsigned char*)argv[1]);
		download_addr = (tmp==-1)?download_addr:tmp;
	}
	
	buf = (unsigned char *)download_addr;
	
	printf("Now downloadfile 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;
	printf("Download File Size = %x\n", download_len);
	
	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("CheckSum error!\n");
		return -1;
	}
	
	puts("Dwonload success\n");
	return 0;
}

#else

int LoadFromUart(int argc, char *argv[])
{
	int start, time_out;
	int load_addr = DFT_DOWNLOAD_ADDR;
		
	if(argc>1)
	{
		start = strtoul((unsigned char*)argv[1]);
		if(start>0)
			load_addr = start;
	}
	start = load_addr;
	
	time_out = WAIT_TIME;	
	do{
		if(rUTRSTAT0&0x1)
		{
			*((unsigned char *)load_addr++) = Uart_GetKey();
			time_out = WAIT_TIME;
		}
	}while(--time_out);
	
	Uart_Printf("Received 0x%x bytes from serial port.\n", load_addr-start);
	
	return 0;
}

#endif


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

/******************************************************************************
【功能说明】将目标代码通过串口下载到SDRAM,然后运行下载的目标代码
******************************************************************************/
int Uart_Load_Run(int argc, char *argv[])
{
//	Uart_Printf( "Please send program [*.bin] from Uart :\n" );
	
	if(!LoadFromUart(argc, argv)) {
		void (*fp)(void) = (void (*)(void))download_addr;		
		(*fp)();
	}
	return 0;
}

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

int RunProgram(int argc, char *argv[])
{
	void (*fp)(void) = (void (*)(void))DFT_DOWNLOAD_ADDR;
	
	if(argc>1)
	{
		unsigned int p = strtoul((unsigned char *)argv[1]);
		if((p!=-1)&&!(p&3))
			fp = (void (*)(void))p;			
	}
	
	Uart_Printf("Run program from 0x%x, are you sure?", fp);
	
	if(!getyorn())
		return 0;
	
	(*fp)();
	
	return 0;
}


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

	prog_begin = 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((unsigned char *)argv[1]);
	if(argc>2)
		data_begin = strtoul((unsigned char *)argv[2]);
	if(argc>3)	
		size       = strtoul((unsigned char *)argv[3]);
	
	if((prog_begin==-1)||(data_begin==-1)) {
		Uart_Printf("Arguments error!\n");
		goto err_exit;
	}
	
	if(!size)
		Uart_Printf("Write 0 Bytes!\n");
	else {
		Uart_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;
		}

		cache_cfg = rNCACHBE0;
		rNCACHBE0 = 0x20000000;
		SectorProg(prog_begin, (unsigned short *)data_begin, size);
	
		if(modify_a0) {
			size = FlashSector(size-1)+SECTOR_SIZE;				
		
			FlashRead(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR+size), SECTOR_SIZE);			
			*(unsigned int *)(DFT_DOWNLOAD_ADDR+size+SECTOR_SIZE-4) = bios_load_addr;
			SectorProg(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR+size), SECTOR_SIZE);	
		}

		rNCACHBE0 = cache_cfg;
	}
		
	return 0;
	
err_exit:
	Uart_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 APP_Auto_Prog_Flash(int argc, char *argv[])
{
	char ch_tmp[3][10];
	char *para_ptr[5];
	int (*DnProg)(int argc, char *argv[]) = LoadFromNet;
	int prog_bios = 0;
	
	if(argc>1) {
		if(strncmp(argv[1], "-b", 3)==0)
			prog_bios = 1;
		else if(strncmp(argv[1], "-c", 3)==0)
			DnProg = LoadFromUart;
		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
				goto err_exit;
		}
	}

	if((DnProg)(0, NULL))
		return 0;
	
	ultostr((unsigned char *)ch_tmp[0], 0);	
	ultostr((unsigned char *)ch_tmp[1], 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];
	para_ptr[4] = prog_bios?"-no0":NULL;
	
	ProgFlash(prog_bios?5:4, para_ptr);
	return	0;

err_exit:
	Uart_Printf("Usage ap [-b] [-c]\n-b   for bios\n-c   download by uart\n");
	return -1;
}
//*****************************************************************************

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;
	}

⌨️ 快捷键说明

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