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

📄 shell.c

📁 1针对三星44B0的开发程序2对于网卡的驱动程序3程序采用C语言编程4采用ARM指令集5全部代码在 ADS1.2 中编译调试
💻 C
📖 第 1 页 / 共 3 页
字号:
		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))
		goto err_exit;
		
	if((mode==2)&&(addr&3))
		goto err_exit;
	
//	CacheDisable();
	CacheFlush();
//	CacheEnable();
	printf("mem @0x%-8x = 0x%x\n", addr, (mode==2)?*(U32 *)addr:(mode==1)?*(U16 *)addr:*(U8 *)addr);	
	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;
	
	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));
#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_ADDR;
	Env.baud         = DEFAULT_SERIAL_BAUD;
	Env.current_uart = DEFAULT_SERIAL_PORT;
	GetSysClockPara(Env.clk_para);
	Env.prog_s_addr  = 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

#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

#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)
		goto err_exit;
	
	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;
}

#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[])
{
	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) | ((3)<<8) | (100) ;			//设置默认IP地址
	Env.nic_cfg.mask = ((255)<<24) | ((255)<<16) | ((255)<<8) | (0) ;	
	Env.nic_cfg.gate = ((192)<<24) | ((168)<<16) | ((3)<<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 ;
	
	NorFlashProg( BIOS_ENV_ADDR, (U32)&Env, sizeof(Env) ) ;		//保存默认参数到Flash
 	
	return 0;
}
//*****************************************************************************

⌨️ 快捷键说明

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