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

📄 shell.c

📁 这个是FS44B0XII板子的BIOS源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	
	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[])
{	
	Uart_Printf("boot from flash, are you sure?");
	if(getyorn()) {
		void (*fp)(void) =(void (*)(void))BIOS_LOAD;
		(*fp)();
	}
	return 0;
}


int BackupBios(int argc, char *argv[])
{
	unsigned int cache_cfg;

	Uart_Printf("move bios to the top of rom,are you sure?");

	if(!getyorn())
		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[])
{
	static unsigned int src_addr;
//	unsigned int sys_cfg;
	unsigned int src;
	unsigned int i, j;
	unsigned int tmp_data[64];
	
	if(argc > 1) {
		unsigned int tmp = strtoul((unsigned char *)argv[1]);
		src_addr  = (tmp==-1)?src_addr:tmp;
		src_addr &= ~0xf;
	}
	
	
	Uart_Printf("Press ESC key to exit, other key to continue...\n");
//	sys_cfg = rSYSCFG;
//	rSYSCFG = 0x08;
	do {
		unsigned int *pLRU;

		src = src_addr;
		src_addr += 0x100;
		
		pLRU = (unsigned int *)0x10004000;
		for(i=0; i<(128<<2); i+=4)
			pLRU[i] = 0;		
	
		for(i=0; i<64; i++)
			tmp_data[i] = ((unsigned int *)src)[i];

		for(i=0; i<16; i++) {
			unsigned char ch;
			
			Uart_Printf("0x%-8x:", src+(i<<4));
			for(j=0; j<16; j++) {
				ch = ((unsigned char *)tmp_data)[(i<<4)+j];
				Uart_Printf("%3x", ch);
			}
			Uart_SendByte(' ');
			Uart_SendByte(' ');
			for(j=0; j<16; j++) {
				ch = ((unsigned char *)tmp_data)[(i<<4)+j];
				Uart_SendByte((ch>=0x20&&ch<0x80)?ch:'.');
			}
			Uart_SendByte('\n');		
		}
		

	} while(Uart_Getch()!=0x1b);
//	rSYSCFG = sys_cfg;	//关闭cache后读tmp_data并打印才正常
	
	return 0;
}

int MemoryShow(int argc, char*argv[])
{
	unsigned long addr;
	int mode;
	U32 sys_cfg;
	
	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((unsigned 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;
	
	sys_cfg = rSYSCFG;
	rSYSCFG = 8;
	printf("mem @0x%-8x = 0x%x\n", addr, (mode==2)?*(U32 *)addr:(mode==1)?*(U16 *)addr:*(U8 *)addr);
	rSYSCFG = sys_cfg;
	return 0;

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

int MemorySet(int argc, char*argv[])
{
	unsigned long addr;
	int mode;	
	U32 data, sys_cfg;
	
	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((unsigned char *)argv[2]);
	if(addr==-1)
		goto err_exit;
	
	data = strtoul((unsigned char *)argv[3]);
	if(data==-1)
		goto err_exit;

	sys_cfg = rSYSCFG;
	rSYSCFG = 8;
	
	if(!mode) {
		__asm {
			strb	data, [addr]
		}
	} else if(mode==1) {
		if(addr&1)
			goto err_exit;
		__asm {
			strh	data, [addr]
		}
	} else if(mode==2) {
		if(addr&3)
			goto err_exit;
		__asm {
			str	data, [addr]
		}
	}
	
//	printf("set ""mem @0x%-8x = 0x%x\n", addr, (mode==2)?*(U32 *)addr:(mode==1)?*(U16 *)addr:*(U8 *)addr);
	rSYSCFG = sys_cfg;
	
	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;	
}

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

static void SetParams(void);

int MoveRun(int argc, char *argv[])
{
	unsigned long size = 0x100000, i;
	unsigned char *s, *r;
	void (*fp)(void);

	if((prog_s_addr>=__ROM_SIZE)||(prog_s_addr&0xfff)||(prog_r_addr&0xfff)) {
		puts("Bad address\n");
		return -1;
	}
	
	SetParams();
	
	s = (unsigned char *)prog_s_addr;
	r = (unsigned char *)prog_r_addr;
	size = __ROM_SIZE - prog_s_addr;
	for(i=0; i<size; i++)
		r[i] = s[i];
	fp = (void (*)(void))prog_r_addr;
	(*fp)();
	return 0;
}

int SaveEnv(int argc, char*argv[])
{
	int i;
	unsigned int cache_cfg;
	EnvParams *params;	

	cache_cfg = rNCACHBE0;
	rNCACHBE0 = 0x20000000;
	params = (EnvParams *)(DFT_DOWNLOAD_ADDR+ENV_ADD);

	FlashRead(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR), SECTOR_SIZE);
	
	params->flag[0]      = 'p';
	params->flag[1]      = 'a';
	params->flag[2]      = 'r';
	params->flag[3]      = 'a';
	params->flag[4]      = 'm';
	params->flag[5]      = 's';
	params->flag[6]      = 0;
	params->nic_cfg.ip   = IP_ADDRESS;
	params->nic_cfg.mask = MASK_ADDRESS;
	params->nic_cfg.gate = GATE_ADDRESS;
	params->baud         = SERIAL_BAUD;
	params->sys_clk      = MCLK_M|(MCLK_P<<8)|(MCLK_S<<16);
	params->prog_s_addr  = prog_s_addr;
	params->prog_r_addr  = prog_r_addr;
	for(i=0; i<8; i++)
		params->NandPartition[i] = NandPartition[i];
	for(i=0; i<sizeof(boot_params); i++)
		params->boot_params[i] = boot_params[i];
	
	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;
	EnvParams params;
	unsigned long t_mclk;
	unsigned char t_m, t_p, t_s, tt_s;	
	int i, err;
	
	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;
	
	params = *(EnvParams*)pdata;
	if(strcmp((const char *)params.flag, "params"))
		return -1;
	
	err = 0;
	for(i=0; i<8; i++) {
//		printf("%d, %x ,%x\n", i, params.NandPartition[i].offset, params.NandPartition[i].size);
		err  = (params.NandPartition[i].offset|params.NandPartition[i].size)&0x3fff;
		if(!err) {
			NandPartition[i].offset = params.NandPartition[i].offset;
			NandPartition[i].size   = params.NandPartition[i].size;
		} else
			break;
	}
	
	t_m = params.sys_clk;
	t_p = params.sys_clk>>8;
	t_s = params.sys_clk>>16;

	i = 1;
	tt_s = t_s;
	while(tt_s--)
		i *= 2;	
	t_mclk= (EXT_OSC_CLK*(t_m+8))/((t_p+2)*i);
	
	if((t_mclk<10000000)||(t_mclk>100000000)) {
		t_m = 120;
		t_p = 8;
		t_s = 1;
		t_mclk = 64000000;
	}		
	
	for(i=0; BaudSet[i]; i++)
		if(params.baud==BaudSet[i])
			break;
	if(!BaudSet[i])
		params.baud = 115200;
	if(!argc) {
		ChangePllValue(t_m, t_p, t_s);
		Uart_Init(0, params.baud);
	}
	
	prog_s_addr = params.prog_s_addr;
	prog_r_addr = params.prog_r_addr;
	if(prog_s_addr&0xfff)
		prog_s_addr = 0x1000;
	if(prog_r_addr&0xfff)
		prog_r_addr = 0xc008000;

	for(i=0; i<sizeof(boot_params); i++)
		boot_params[i] = params.boot_params[i];
	boot_params[i-1] = 0;
	
	Uart_Printf("IP address : %u.%u.%u.%u\n", (params.nic_cfg.ip>>24)&0xff, (params.nic_cfg.ip>>16)&0xff, (params.nic_cfg.ip>>8)&0xff, params.nic_cfg.ip&0xff);
	Uart_Printf("IP MASK    : %u.%u.%u.%u\n", (params.nic_cfg.mask>>24)&0xff, (params.nic_cfg.mask>>16)&0xff, (params.nic_cfg.mask>>8)&0xff, params.nic_cfg.mask&0xff);
	Uart_Printf("IP GATE    : %u.%u.%u.%u\n", (params.nic_cfg.gate>>24)&0xff, (params.nic_cfg.gate>>16)&0xff, (params.nic_cfg.gate>>8)&0xff, params.nic_cfg.gate&0xff);
	Uart_Printf("Serial baud : %d\n", params.baud);
	Uart_Printf("Clock : %dHz\n", t_mclk);
	Uart_Printf("Program save address 0x%x\n", prog_s_addr);
	Uart_Printf("Program run address 0x%x\n", prog_r_addr);
	Uart_Printf("Program boot params : %s\n", params.boot_params);
	
	if(argc!=0) {
		Uart_Printf("Load enviroment value from flash?");
		if(!getyorn())
			return 0;
	}
	
	locnode.ip = IP_ADDRESS = params.nic_cfg.ip;
	locnode.mask = GATE_ADDRESS = params.nic_cfg.mask;
	locnode.gate = MASK_ADDRESS = params.nic_cfg.gate;
	MCLK_M = t_m; MCLK_P = t_p; MCLK_S = t_s;
	SERIAL_BAUD = params.baud;

	i = 8000;
	while(i--);
	ChangePllValue(MCLK_M, MCLK_P, MCLK_S);

	i = 8000;
	while(i--);		
	Uart_Init(0,SERIAL_BAUD);
	if(argc!=0)
		Uart_Getch();
	
	return 0;

}

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

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

int NandLoad(int argc, char*argv[])
{
	RdFileFrNF(0, 0);
	return 0;
}

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

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((unsigned 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++) {
		NandPartition[i].offset = addr[i];
		NandPartition[i].size   = addr[i+1]-addr[i];
		NandPartition[i].name   = " ";
		NandPartition[i+1].size = 0;
		printf("part%d : start address 0x%-8x, size 0x%-8x\n", i, NandPartition[i].offset, NandPartition[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;
}

int SetProgAddr(int argc, char *argv[])
{
	int addr, s;
	
	if(argc!=3)
		goto err_exit;
		
	
	if(!strncmp(argv[1], "-s", 3))
		s = 1;
	else if(!strncmp(argv[1], "-r", 3))
		s = 0;
	else
		goto err_exit;
	
	addr = strtoul((unsigned char*)argv[2]);
	if(addr==-1)
		goto err_exit;
	
	printf("Set Program %s address = 0x%x\n", s?"save":"run", addr);
	if(s)
		prog_s_addr = addr;
	else
		prog_r_addr = addr;
	
	return 0;
err_exit:
	puts("Usage : setpa -s[-r] address\n-s   save address\n-r   run address\n");
	return -1;
}

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

static 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;
	strcpy(params->commandline, (char *)boot_params);
	
	printf("Set boot params = %s\n", params->commandline);
}

⌨️ 快捷键说明

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