shell.c

来自「三星公司ARM7处理器S3C44B0的BIOS源程序」· C语言 代码 · 共 1,932 行 · 第 1/3 页

C
1,932
字号
		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;
}
//*****************************************************************************
#if GUWJ

#if 0
void __irq Key_Interrupt(void)
{	
    //which_int_key = rEXTINTPND ;
    //rEXTINTPND = 0xf ;		//clear EXTINTPND reg.		
    //rI_ISPC = BIT_EINT4567 ;		//clear pending_bit

    rPCONG = rPCONG & (~(0x3f<<10));		//GPC567 is input
#if 0
    switch(which_int_key)
   {
        	case 1:
        	    //printf("\nEINT4 had been occured...\n");
				LedSet(0x2);
        	    which_int_key=0;
        	    break;
        	case 2:
        	    printf("\nEINT5 had been occured...\n");
				LedSet(0x4);
        	    which_int_key=0;
        	    break;
        	case 4:
        	    printf("\nEINT6 had been occured...\n");
				LedSet(0x8);
        	    which_int_key=0;
        	    break;
        	case 8:
        	    printf("\nEINT7 had been occured...\n");
				LedSet(0x1);
        	    which_int_key=0;
        	    break;
        	default :
        	    break;
    }
#endif
 	printf("\nEINT had been occured...\n");
 	//while( (rPDATG&0x00e0) != 0x00e0  ) ;
 	Delay( 50 );
    rPCONG = rPCONG | ( 0x3f<<10 );		//EINT7~5
}

void int_test_init(void)
{
    pISR_EINT4567 = (unsigned)Key_Interrupt ;

	rINTCON = 0x5 ;		//无向量中断模式
	rINTMOD = 0x0 ;		//All=IRQ mode

    rPCONG = rPCONG | ( 0x3f<<10 );	//EINT7~5
    rPUPG = rPUPG & (~(7<<5)) ;		//pull up resister is enable
	rEXTINT = rEXTINT & (~(0xfff<<20)) ;		//EINT567低电平触发中断
	
    pISR_EINT4567 = (unsigned)Key_Interrupt ;
    rINTMSK = ~( BIT_GLOBAL | BIT_EINT4567 ) ;	//start INT
}
#else
volatile char which_int_key = 0 ;
void __irq Key_Interrupt(void)
{	

	printf("\n...void __irq Key_Interrupt(void)...\n");

	which_int_key = rEXTINTPND ;
    rEXTINTPND = 0xf ;		//clear EXTINTPND reg.		
    rI_ISPC = BIT_EINT4567 ;		//clear pending_bit

    rPCONG = rPCONG & (~(0x3f<<10));		//GPC567 is input

    switch(which_int_key)
   {
        	case 1:
        	    printf("\nEINT4 had been occured...\n");
				LedSet(0x2);
        	    which_int_key=0;
        	    break;
        	case 2:
        	    printf("\nEINT5 had been occured...\n");
				LedSet(0x4);
        	    which_int_key=0;
        	    break;
        	case 4:
        	    printf("\nEINT6 had been occured...\n");
				LedSet(0x8);
        	    which_int_key=0;
        	    break;
        	case 8:
        	    printf("\nEINT7 had been occured...\n");
				LedSet(0x1);
        	    which_int_key=0;
        	    break;
        	default :
        	    break;
    }
 
 	while( (rPDATG&0x00e0) != 0x00e0  ) ;
 	Delay( 50 ) ;		//
    rPCONG = rPCONG | ( 0x3f<<10 );		//EINT7~5
}

//#define _MMUTT_SIZE SIZE_16K
void Eint567_Test( void )
{
	printf( "\nInterrupt Test!\n" );
	
    printf("\n\n注意由于本项测试使用了中断,所以必须将本项目的目标代码烧写入Flash的0地址\n");
    printf("这样Flash中才有中断向量,不过只需要烧入一次就行了,以后JTAG调试或网口下载运行本程序就没有问题了\n");
    printf("可以使用netload或者是comload下载本目标代码到SDRAM,然后用Prog 0烧写代码到Flash(不覆盖0地址跳转指令)\n\n");

    pISR_EINT4567 = (unsigned)Key_Interrupt ;
	printf( "---1---\n" );

	rINTCON = 0x5 ;		//无向量中断模式
	printf( "---2---\n" );
	rINTMOD = 0x0 ;		//All=IRQ mode
	printf( "---3---\n" );

    rPCONG = rPCONG | ( 0x3f<<10 );	//EINT7~5
    printf( "---4---\n" );
    rPUPG = rPUPG & (~(7<<5)) ;		//pull up resister is enable
    printf( "---5---\n" );
	rEXTINT = rEXTINT & (~(0xfff<<20)) ;		//EINT567低电平触发中断
	printf( "---6---\n" );
    pISR_EINT4567 = (unsigned)Key_Interrupt ;
	printf( "---7---\n" );
    rINTMSK = ~( BIT_GLOBAL | BIT_EINT4567 ) ;	//start INT

	printf( "\nPlease press the button key2,key3,key4!   Press ESC to Exit!\n" );
	
    while( !( kbhit && (getkey()==ESC_KEY) ) ) 
    {
		LedSet(0x05);		//LED点亮/熄灭状态设置
		Delay(160);
		LedSet(0x0a);		//LED点亮/熄灭状态设置
		Delay(160);
    }
	printf( "---9---\n" );
    rINTMSK = BIT_GLOBAL ;	//disable INT
    printf( "---10---\n" );
}
#endif
int guwj_test(int argc, char *argv[])
{
	printf("---int guwj_test(int argc, char *argv[])---\n");
	Delay(100);
	printf("---int guwj_test(int argc, char *argv[])---\n");
	Delay(100);
	printf("---int guwj_test(int argc, char *argv[])---\n");
	Delay(100);
	printf("---int guwj_test(int argc, char *argv[])---\n");
	Delay(100);
	printf("---int guwj_test(int argc, char *argv[])---\n");
	
	//int_test_init();
	Eint567_Test();
	while(1)
	{
		;
	}
}
#endif

⌨️ 快捷键说明

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