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

📄 shell.c

📁 linux下三星4510的BSP驱动程序!已经试验成功
💻 C
📖 第 1 页 / 共 3 页
字号:
	if(argc<2)
		return 0;	
		
	str = argv[1];	
	
	if(str[4]!='-')
		error=1;
	str[4]=0;
	year = strtobcd(str);	
	if((year<0x2000)||(year>0x2099)||error) {
		printf("year error!\n");
		return -1;
	}
				
	str += 5;
	i = 0;		
	if(str[++i]!='-')
		if(str[++i]!='-')
			error = 1;
	str[i] = 0;					
	month = strtobcd(str);
	if((month-1)>0x11||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 = strtobcd(str);
	if((day-1)>0x30||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);	
		TimerInit(TIMER_FREQ);		
		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(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;
	tftp_main(download_addr, Env.nic_cfg.ip);
	if(download_len==-1) {
		puts("Tftp Download Aborted!\n");
	} else
		printf("\n Received %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;
    size = size & 0x1fffff ;
	printf("\ndownload size = 0x%x bytes\n", size);
	
	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;
		
	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
	
	(*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;

	//printf("clear memory from 0x%x to 0x%x\n", DRAM_BASE, __ENTRY);
	//memset((char *)DRAM_BASE, 0, (U32)__ENTRY-DRAM_BASE);
	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("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 *)DRAM_BASE, (char *)ROM_BASE, 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, 0xe000);
	NorFlashProg(BIOS_BASE, DFT_DOWNLOAD_ADDR, 0xe000);

	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%-8x:", src+(i<<4));
			for(j=0; j<16; j++) {
				//ch = ((unsigned char *)tmp_data)[(i<<4)+j];
				ch = ((unsigned char *)src)[(i<<4)+j];
				printf("%3x", 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))

⌨️ 快捷键说明

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