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

📄 shell.c

📁 linux下三星4510的BSP驱动程序!已经试验成功
💻 C
📖 第 1 页 / 共 3 页
字号:
		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;
}

#ifdef ETHERNET_SUPPORT
int NetPortSwitch(unsigned int netport)
{
  NetPortNumber=netport;
  return 0;
}
#endif

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;	
	/**************************************/	
    //if(Env.netport==2)Env.current_netport=2;
    //else Env.current_netport=1; 
    if((Env.current_netport!=2)&&(Env.current_netport!=1))Env.current_netport=1;  
    
    NetPortSwitch(Env.current_netport);
     /**************************************/
     
	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;
	//NetPortNumber=2;
	/***************changge**************/
	//Env.nic_cfg.netport=1;     //默认8201
	//NetPortNumber=2;
	/************************************/
//	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);
	params->u1.s.nr_pages = (SIZE_64M >> 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[])
{
	DftEnvInit();
	NorFlashProg( BIOS_ENV_ADDR, (U32)&Env, sizeof(Env) ) ;		//保存默认参数到Flash
	return 0;
}

void Net_Test(void)
{
   Net_Test_Flag=1;
  //puts("\n net test start........\n");
  tftp_main(download_addr, Env.nic_cfg.ip);
  puts("\n over test net \n");
}

#ifdef TEST_SUPPORT
int  Test(int argc,char *argv[])
 {
   char *temp;
   int i;
   if(argc>1)
   {
    puts("/r don't input parameter\n");
    return 0;
    }
   while((getkey()!=ESC_KEY))
   {
   puts("1 IIC test\n");
   puts("2 net test\n");
   puts("3 key and led test\n");
   puts("4 usb test \n");
   puts("please enter 数字键进入相应的测试功能,按ESC键退出测试\n");
   *temp=getch();
   i=*temp;
  // i=(int)strtoul(temp);
	   switch(i)
	   	{
	   	
		  case '1':
		  	 {puts("start IIC test.........\n");		
			  Iic_Test();
			  break;
		  	 }
		  case '2':
		  	 {
		  	  puts("start net test.............\n");
			  Net_Test();
		      break;
		  	 }
		  case '3':
		     {puts("start key and led test...........\n");
		      ioptest();
		      break;
		      }
		 case '4':
		        {puts("usb test..............\n");
		         D12Main();
		         break;
		        }		         
		 //default:return 0;break;
	    case ESC_KEY : return 0;break;
	   	}
       puts("\n 请按任意键继续,按 ESC 键退出 \n");
   	}
   return 0;
 }  
 #endif
/***********************************************
function : ChgNetPort(int argc,char *argv[])
parameter: only one,number
return   : no useful
purpose  : select net port 
           1-->8201(default)
           2-->8019
author   : changguofeng 
************************************************/
      
#ifdef ETHERNET_SUPPORT
int ChgNetPort(int argc,char *argv[])
 {
  char *temp;
  switch(NetPortNumber)
    {
     case 1  : printf("RTL8201 is used \n");
               break;
     case 2  : printf("RTL8019 is used \n");
               break;
     default : printf(" no network card is used \n");
               break;
    } 
  puts("\n please select net port \n");
  puts("\n 1:rtl8201(default)   \n");
  puts("\n 2:rtl8019            \n");
  if((argc>2)||(argc<1))
  {
   puts("\n please input as follow : chgnet number \n");
   return -1;
   }
   puts("\n please enter number key : ");
   *temp=getch();
   switch(*temp)
   {
     case '1':{
              NetPortNumber=1;
              Env.current_netport=1;
              puts("\n rtl8201 is selected \n");
              break;
              }
     case '2':{
              NetPortNumber=2;
              Env.current_netport=2;
              puts("\n rtl8019 is selected  \n");
              break;
              }
     default :{
              NetPortNumber=1;
              Env.current_netport=1;
              puts("\n you don't select,so default \n");
              break;
              }
   }           
   return 0;           
}
#endif
   
  
  

⌨️ 快捷键说明

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