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

📄 shell.c

📁 arm7 s3c44b0x开发板fs44b的bios启动源代码及使用说明 下载方法等
💻 C
📖 第 1 页 / 共 4 页
字号:
/*******************************************************************
[功能说明] 设置单个内存地址值
*******************************************************************/
int MemorySet(int argc, char*argv[])
{
	unsigned long addr;
	int mode;	
	U32 data;
	
	if(argc!=4)
		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;
	
	data = strtoul((char *)argv[3]);
	if(data==-1)
		goto err_exit;

	if(!mode) 
	{
		/*__asm {
			strb	data, [addr]
		}*/
		outportb(data, addr);
	}
	else if(mode==1) 
	{
		if(addr&1)
			goto err_exit;
		/*__asm {
			strh	data, [addr]
		}*/
		outportw(data, addr);
	}
	else if(mode==2) 
	{
		if(addr&3)
			goto err_exit;
		/*__asm {
			str	data, [addr]
		}*/
		outportl(data, addr);
	}
//	printf("set mem @0x%-8x = 0x%x\n", addr, (mode==2)?*(U32 *)addr:(mode==1)?*(U16 *)addr:*(U8 *)addr);
	
	//puts("set ");
	//MemoryShow(3, argv);
	
	return 0;

err_exit:
	puts("Usage : memd -c/s/l addr data\n-c/s/l   8/16/32 bits\n");
	return -1;	
}

/*******************************************************************
[功能说明] 保存环境变量支持函数
*******************************************************************/
#ifdef	SAVE_ENV_SUPPORT
int SaveEnv(int argc, char*argv[])
{
#ifdef	SAVE_ENV_IN_NAND
	NFSaveParams((char *)&Env);
#else
	NorFlashProg(BIOS_ENV_ADDR, (U32)&Env, sizeof(Env));//BIOS_ENV_ADDR (ROM_SIZE-0x200)0x1ffe00
#endif
	return 0;
}

int LoadEnv()
{
	int i;

#ifdef	SAVE_ENV_IN_NAND
	NFSearchParams((char *)&Env);
#else
	NorFlashRead((char *)&Env, (char *)(BIOS_ENV_ADDR), sizeof(Env));
#endif

	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 = ROM_BASE+SIZE_64K;
	if(Env.prog_r_addr&0x3)
		Env.prog_r_addr = DFT_DOWNLOAD_ADDR;
		
	Env.boot_params[255] = 0;
	
	return 0;
}
#endif
/******************************************************************************/

/*******************************************************************************
[功能说明] 默认环境初始化工作
*******************************************************************************/
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  = BIOS_BASE;//ROM_BASE+SIZE_64K;//SIZE_64K;
	Env.prog_r_addr  = DFT_DOWNLOAD_ADDR;
	Env.NandPartition[0].size = 0;
	Env.saved_in = 0;	//use nor flash, nointrd
	
	SerialSwitch(Env.current_uart);
	SerialChgBaud(Env.baud);
}

/*******************************************************************************
[功能说明] 串口操作支持函数
*******************************************************************************/
#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

/*******************************************************************
[功能说明] Nand Flash 操作支持函数
*******************************************************************/
#ifdef	NAND_FLASH_SUPPORT
int NandProg(int argc, char *argv[])
{
	unsigned int size = ~0;
	unsigned int data_begin = ~0;

	data_begin = download_addr;
	size       = download_len;
	
	if(argc>1)
		data_begin = strtoul((char *)argv[1]);
	if(argc>2)	
		size = strtoul((char *)argv[2]);	
	if((size==-1)||(data_begin==-1)) 
	{
		printf("Arguments error\n");
		goto err_exit;
	}
	
	if(size==0) 
	{
		printf("Write 0 Bytes!\n");
		return -1;
	}
	else
	{
		return WrFileToNF(data_begin, size);
	}

err_exit:
	printf("Usage:	nfprog addr size\naddr = data pointer to ram\nsize = program size(Bytes)\n");
	return -1;
}

int NandLoad(int argc, char *argv[])
{
	U32 load_part = -1;
	download_addr = DFT_DOWNLOAD_ADDR;
	
	if(argc>1) 
	{
		download_addr = strtoul((char *)argv[1]);
		if(download_addr==-1)
			download_addr = DFT_DOWNLOAD_ADDR;
		if(argc>2)
			load_part = strtoul(argv[2]);
	}
	
	printf("Load data form nand flash to 0x%x\n", download_addr);
	return RdFileFrNF(download_addr, load_part);
}

int NandErase(int argc, char *argv[])
{
	return EraseNandPart();
}

int NandPart(int argc, char*argv[])
{
	unsigned long i, addr[8];
	
	if(!NandFlashSize)
		return -1;
	if((argc<=1)||(argc>9))
		goto err_exit;

	addr[0] = 0;
	for(i=1; i<argc; i++) 
	{
		addr[i] = strtoul((char *)argv[i]);		
		if((addr[i]==-1)||(addr[i]<=addr[i-1])||(addr[i]&0x3fff)||(addr[i]>NandFlashSize))
			goto err_exit;
	}
	printf("Set %d partition(s) :\n", argc-1);
	for(i=0; i<argc-1; i++) 
	{
		pNandPart[i].offset = addr[i];
		pNandPart[i].size   = addr[i+1]-addr[i];
		pNandPart[i].name   = " ";
		pNandPart[i+1].size = 0;
		printf("part%d : start address 0x%-8x, size 0x%-8x\n", i, pNandPart[i].offset, pNandPart[i].size);
	}

	return 0;
	
err_exit:
	puts("Usage : nfpart a1 a2 ... an\na1 = part1 end address, an = partn end address, n<=8, address must be 16KB align and don't excess the size of nand flash \n");
	return -1;
}
#endif
/******************************************************************************/

int SetProgAddr(int argc, char *argv[])
{
	int addr, obj;
	
	if(argc<2)
		goto err_exit;		
	
	if(!strncmp(argv[1], "-s", 3))
		obj = 0;
	else if(!strncmp(argv[1], "-r", 3))
		obj = 1;
	else if(!strncmp(argv[1], "-i", 3))
		obj = 2;
	else if(!strncmp(argv[1], "-ni", 4)) 
	{
		Env.saved_in &= ~2;
		return 0;
	} 
	else if(!strncmp(argv[1], "-nor", 5)) 
	{
		Env.saved_in &= ~1;
		return 0;
	} 
	else if(!strncmp(argv[1], "-nand", 6)) 
	{
		Env.saved_in |= 1;
		return 0;
	} 
	else
	{
		goto err_exit;
	}
	
	if(argc<3)
		goto err_exit;
	addr = strtoul((char*)argv[2]);
	if(addr==-1)
		goto err_exit;
	
	printf("Set Program %s address = 0x%x\n", (obj==0)?"save":(obj==1)?"run":"initrd", addr);
	if(obj==0)
		Env.prog_s_addr = addr;
	else if(obj==1)
		Env.prog_r_addr = addr;
	else if(obj==2) 
	{
		Env.initrd_addr = addr;
		Env.saved_in |= 2;
	}
	
	return 0;
err_exit:
	puts("Usage : setpa -s[-r][-i][-ni][-nor][-nand] [address]\n-s    save address\n-r    run address\n-i    initrd save address\n-ni   disable initrd\n-nor  use nor flash to save\n-nand use nand flash to save\n");
	return -1;
}
/******************************************************************************/

int SetBootParams(int argc, char *argv[])
{
	char params[sizeof(Env.boot_params)];
	int params_bytes;
	
	puts("Please enter params for boot, press Enter to complete, Esc to exit\n");
	params_bytes = GetParameter(params, sizeof(Env.boot_params)-1);
	putch('\n');
	if(params_bytes!=-1) 
	{
		Env.boot_params[params_bytes] = 0;
		while(params_bytes) 
		{
			params_bytes--;
			Env.boot_params[params_bytes] = params[params_bytes];		
		}
	}
	return 0;
}

#define LINUX_PAGE_SHIFT	12
#define LINUX_PAGE_SIZE		(1<<LINUX_PAGE_SHIFT)
#define COMMAND_LINE_SIZE 	1024

struct param_struct {
    union {
	struct {
	    unsigned long page_size;			/*  0 */
	    unsigned long nr_pages;				/*  4 */
	    unsigned long ramdisk_size;			/*  8 */
	    unsigned long flags;				/* 12 */
#define FLAG_READONLY	1
#define FLAG_RDLOAD		4
#define FLAG_RDPROMPT	8
	    unsigned long rootdev;				/* 16 */
	    unsigned long video_num_cols;		/* 20 */
	    unsigned long video_num_rows;		/* 24 */
	    unsigned long video_x;				/* 28 */
	    unsigned long video_y;				/* 32 */
	    unsigned long memc_control_reg;		/* 36 */
	    unsigned char sounddefault;			/* 40 */
	    unsigned char adfsdrives;			/* 41 */
	    unsigned char bytes_per_char_h;		/* 42 */
	    unsigned char bytes_per_char_v;		/* 43 */
	    unsigned long pages_in_bank[4];		/* 44 */
	    unsigned long pages_in_vram;		/* 60 */
	    unsigned long initrd_start;			/* 64 */
	    unsigned long initrd_size;			/* 68 */
	    unsigned long rd_start;				/* 72 */
	    unsigned long system_rev;			/* 76 */
	    unsigned long system_serial_low;	/* 80 */
	    unsigned long system_serial_high;	/* 84 */
	    unsigned long mem_fclk_21285;       /* 88 */
	} s;
	char unused[256];
    } u1;
    union {
	char paths[8][128];
	struct {
	    unsigned long magic;
	    char n[1024 - sizeof(unsigned long)];
	} s;
    } u2;
    char commandline[COMMAND_LINE_SIZE];
};
/******************************************************************************/

void SetParams(void)
{
	U32 i;
	struct param_struct *params = (struct param_struct *)BOOT_PARAMS_ADDR;

	for(i=0; i<(sizeof(struct param_struct)>>2); i++)
		((U32 *)params)[i] = 0;
	params->u1.s.page_size = LINUX_PAGE_SIZE;
	params->u1.s.nr_pages = (DRAM_SIZE >> LINUX_PAGE_SHIFT);
	
//	if(strlen((char *)boot_params)>=sizeof(boot_params))
//		boot_params[sizeof(boot_params)-1] = 0;
	memcpy(params->commandline, (char *)Env.boot_params, sizeof(Env.boot_params));
	
	printf("Set boot params = %s\n", params->commandline);
}

#define	MAX_DOWNLOAD_SIZE	0x200000

/******************************************************************************
【功能说明】XMODEM 下载支持函数
******************************************************************************/
#ifdef	XMODEM_DOWNLOAD_SUPPORT
int XmodemReceive(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 by xmodem to 0x%x...\n", download_addr);

	download_len = XModemReceive((char *)download_addr, MAX_DOWNLOAD_SIZE);
	if(download_len!=-1)
		printf("\nReceived %x bytes success\n", download_len);
	
	return download_len;
}
/******************************************************************************/

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

int SetBootKey(int argc, char *argv[])
{
	int keyno, keystat, boot = 0;
	
	if(argc<3)
		goto err_exit;
	
	keyno   = strtoul(argv[1]);
	keystat = strtoul(argv[2]);
	
	if((keyno>4)||(keyno<1)||(keystat>1)||(keystat<0))
		goto err_exit;
	keyno--;
	
	if(argc>3) 
	{
		if(!strncmp("-b", argv[3], 6))
			boot = 1;
		else
			goto err_exit;
	}
	Env.boot_key = ('k'<<24)|('b'<<16)|(keyno<<12)|(keystat<<8)|(boot);
	
	return 0;	
	
err_exit:
	printf("Usage : keyrun keyno keystat [-b]\nkeyno   key number 1~4\nkeystat 1->high, 0->low to autoboot\n-b   execute boot\n");
	return -1;
}
/******************************************************************************/

int SetMachine(int argc, char *argv[])
{
	U32 machine, len;
	
	if(argc<2)
	{
		printf("Machine Number is %d\n", Env.machine);
		return 0;
	}
	
	len = strlen(argv[1]);
	machine = strtodec(argv[1], len);
	if((len>4)||(machine==-1))
		goto err_exit;
		
	Env.machine = machine;
	return 0;

err_exit:
	printf("Usage : machine no\nno   machine number(0~9999)\n");
	return -1;
}

/******************************************************************************
【功能说明】USB 下载支持函数
******************************************************************************/
#ifdef	USB_DOWNLOAD_SUPPORT
int UsbDownload(int argc, char *argv[])
{
	download_addr = DFT_DOWNLOAD_ADDR;
	if(argc>1) 
	{
		download_addr = strtoul(argv[1]);
		if(download_addr==-1)
			download_addr = DFT_DOWNLOAD_ADDR;
	}
	
	printf("USB download file to 0x%x\n", download_addr);
	download_len =  BoardUsbDownload(download_addr);
	if(download_len!=-1)
		printf("0x%x bytes received\n", download_len);
	return download_len;
}
/******************************************************************************/

int UsbDownloadRun(int argc, char *argv[])
{
	if(UsbDownload(argc, argv)!=-1) 
	{
		RunProgram(0, NULL);
	}
	return 0;
}
#endif

/******************************************************************************
【功能说明】默认系统设置,设置系统主频、IP地址、波特率、启动参数等
******************************************************************************/
int Default_Setting(int argc, char *argv[])
{
	U32 obj;

	if(argc < 2)
	{
		goto err_exit;
	}

	if(!strncmp(argv[1], "-s", 3))
		obj = 0;
	else 
	if(!strncmp(argv[1], "-u", 3))
		obj = 1;
	else
		goto err_exit;
	
	if(obj == 1)
	{
		unsigned short m ;
		char c[] = "root=/dev/rom0 console=ttyS0,115200 devfs=mount" ;
		
		Env.clk_para[0] = 53 ;		//设置默认系统时钟
		Env.clk_para[1] = 3 ;
		Env.clk_para[2] = 1 ;
		Env.clk_para[3] = 61000000 ;
		rPLLCON = (53 << 12) | (3<< 4) | 1 ;
		
		Delay(50);
		TimerInit(TIMER_FREQ);		
		SerialChgBaud( 115200 );		//设置串口默认波特率
		Delay(10);

		Env.nic_cfg.ip 	 = ((192)<<24) | ((168)<<16) | ((1)<<8) | (132) ;			//设置默认IP地址
		Env.nic_cfg.mask = ((255)<<24) | ((255)<<16) | ((255)<<8) | (0) ;	
		Env.nic_cfg.gate = ((192)<<24) | ((168)<<16) | ((1)<<8) | (1) ;	
		
		Env.prog_r_addr = 0xc300000 ;
		Env.prog_s_addr = 0x10000 ;
		
		m = 0 ;
		while( c[m] != 0 )
		{
			Env.boot_params[m] = c[m] ;
			m++ ;
		}
		Env.boot_params[ m + 1 ] = 0 ;
	}
	else
	{
		memcpy(Env.flag, "params", 8);
		memcpy(Env.boot_params, "", 256);
		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  = BIOS_BASE;//ROM_BASE+SIZE_64K;//SIZE_64K;
		Env.prog_r_addr  = DFT_DOWNLOAD_ADDR;
		Env.NandPartition[0].size = 0;
		Env.saved_in = 0;	//use nor flash, nointrd
		
		SerialSwitch(Env.current_uart);
		SerialChgBaud(Env.baud);
	}
	
	NorFlashProg( BIOS_ENV_ADDR, (U32)&Env, sizeof(Env) ) ;		//保存默认参数到Flash
 	
	return 0;
err_exit:
		printf("Usage : defset -s|-u\n -s is default setup of board configure\n -u is default setup of unlinux\n");
		return -1;
}

⌨️ 快捷键说明

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