diff options
| author | wdenk <wdenk> | 2003-01-11 09:48:40 +0000 | 
|---|---|---|
| committer | wdenk <wdenk> | 2003-01-11 09:48:40 +0000 | 
| commit | d0fb80c3021e15853895e9ae45ab9368d0fb52fa (patch) | |
| tree | a4e65529732e8058b15a0cef175f65312ec3eedd | |
| parent | a25f862ba8b9d8440973d0204c19fec859f953f3 (diff) | |
| download | olio-uboot-2014.01-d0fb80c3021e15853895e9ae45ab9368d0fb52fa.tar.xz olio-uboot-2014.01-d0fb80c3021e15853895e9ae45ab9368d0fb52fa.zip | |
* Restrict baudrate settings on LWMON to higher speedsLABEL_2003_01_11_1050
  when watchdog is on
* Update baudrate in bd_info when it gets changed
* Add watchdog trigger points while waiting for serial port
  (so far only 8xx -- needed on LWMON with 100ms watchdog)
* Improve command line tool to access the U-Boot's environment
  (figuration of the utility, using a config file)
| -rw-r--r-- | CHANGELOG | 8 | ||||
| -rw-r--r-- | board/lwmon/lwmon.c | 2 | ||||
| -rw-r--r-- | common/cmd_nvedit.c | 4 | ||||
| -rw-r--r-- | common/cmd_pcmcia.c | 2 | ||||
| -rw-r--r-- | common/environment.c | 2 | ||||
| -rw-r--r-- | common/hush.c | 52 | ||||
| -rw-r--r-- | cpu/mpc8xx/serial.c | 33 | ||||
| -rw-r--r-- | cpu/mpc8xx/start.S | 2 | ||||
| -rw-r--r-- | include/configs/lwmon.h | 9 | ||||
| -rw-r--r-- | tools/env/README | 43 | ||||
| -rw-r--r-- | tools/env/fw_env.c | 338 | ||||
| -rw-r--r-- | tools/env/fw_env.config | 7 | ||||
| -rw-r--r-- | tools/env/fw_env.h | 10 | 
13 files changed, 341 insertions, 171 deletions
| @@ -2,6 +2,14 @@  Changes since U-Boot 0.2.0:  ====================================================================== +* Update baudrate in bd_info when it gets changed + +* Add watchdog trigger points while waiting for serial port +  (so far only 8xx -- needed on LWMON with 100ms watchdog) + +* Improve command line tool to access the U-Boot's environment +  (figuration of the utility, using a config file) +  * Add single quote support for (old) command line parser  * Switch LWMON board default config from FRAM to EEPROM; diff --git a/board/lwmon/lwmon.c b/board/lwmon/lwmon.c index e797b3628..f255599cf 100644 --- a/board/lwmon/lwmon.c +++ b/board/lwmon/lwmon.c @@ -833,7 +833,7 @@ int do_kbd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  }  /* Read and set LSB switch */ -#define CFG_PC_TXD1_ENA		0x0008 +#define CFG_PC_TXD1_ENA		0x0008		/* PC.12 */  /***********************************************************************  F* Function:     int do_lsb (cmd_tbl_t *cmdtp, int flag, diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index 9b6d14fe2..c404157ac 100644 --- a/common/cmd_nvedit.c +++ b/common/cmd_nvedit.c @@ -232,6 +232,10 @@ int _do_setenv (int flag, int argc, char *argv[])  				baudrate);  			udelay(50000);  			gd->baudrate = baudrate; +#ifdef CONFIG_PPC +			gd->bd->bi_baudrate = baudrate; +#endif +  			serial_setbrg ();  			udelay(50000);  			for (;;) { diff --git a/common/cmd_pcmcia.c b/common/cmd_pcmcia.c index 8a3491ede..f9bd0ba89 100644 --- a/common/cmd_pcmcia.c +++ b/common/cmd_pcmcia.c @@ -282,7 +282,7 @@ static int check_ide_device (int slot)  	addr = (volatile uchar *)(CFG_PCMCIA_MEM_ADDR +  				  CFG_PCMCIA_MEM_SIZE * (slot * 4)); -	debug ("PCMCIA MEM: %08X\n", addr); +	debug ("PCMCIA MEM: %08lX\n", (ulong)addr);  	start = p = (volatile uchar *) addr; diff --git a/common/environment.c b/common/environment.c index 74bfd6269..1df387290 100644 --- a/common/environment.c +++ b/common/environment.c @@ -167,7 +167,7 @@ env_t environment __PPCENV__ = {  #ifdef  CONFIG_EXTRA_ENV_SETTINGS  	CONFIG_EXTRA_ENV_SETTINGS  #endif -	"\0"		/* Term. env_t.data with 2 NULLs */ +	"\0"		/* Term. env_t.data with 2 NULs */  	}  };  #ifdef CFG_ENV_ADDR_REDUND diff --git a/common/hush.c b/common/hush.c index 925474332..fcc355923 100644 --- a/common/hush.c +++ b/common/hush.c @@ -117,14 +117,15 @@  /* #include <dmalloc.h> */  /* #define DEBUG_SHELL */ -#ifdef BB_VER +#if 1  #include "busybox.h"  #include "cmdedit.h"  #else  #define applet_name "hush"  #include "standalone.h"  #define hush_main main -#undef BB_FEATURE_SH_FANCY_PROMPT +#undef CONFIG_FEATURE_SH_FANCY_PROMPT +#define BB_BANNER  #endif  #endif  #define SPECIAL_VAR_SYMBOL 03 @@ -430,7 +431,7 @@ static void setup_string_in_str(struct in_str *i, const char *s);  /*  close_me manipulations: */  static void mark_open(int fd);  static void mark_closed(int fd); -static void close_all(); +static void close_all(void);  #endif  /*  "run" the final data structures: */  static char *indenter(int i); @@ -902,7 +903,7 @@ static void b_reset(o_string *o)  static void b_free(o_string *o)  {  	b_reset(o); -	if (o->data != NULL) free(o->data); +	free(o->data);  	o->data = NULL;  	o->maxlen = 0;  } @@ -958,7 +959,7 @@ static int static_peek(struct in_str *i)  #ifndef __U_BOOT__  static inline void cmdedit_set_initial_prompt(void)  { -#ifndef BB_FEATURE_SH_FANCY_PROMPT +#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT  	PS1 = NULL;  #else  	PS1 = getenv("PS1"); @@ -970,11 +971,10 @@ static inline void cmdedit_set_initial_prompt(void)  static inline void setup_prompt_string(int promptmode, char **prompt_str)  {  	debug_printf("setup_prompt_string %d ",promptmode); -#ifndef BB_FEATURE_SH_FANCY_PROMPT +#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT  	/* Set up the prompt */  	if (promptmode == 1) { -		if (PS1) -			free(PS1); +		free(PS1);  		PS1=xmalloc(strlen(cwd)+4);  		sprintf(PS1, "%s %s", cwd, ( geteuid() != 0 ) ?  "$ ":"# ");  		*prompt_str = PS1; @@ -995,7 +995,7 @@ static void get_user_input(struct in_str *i)  	static char the_command[BUFSIZ];  	setup_prompt_string(i->promptmode, &prompt_str); -#ifdef BB_FEATURE_COMMAND_EDITING +#ifdef CONFIG_FEATURE_COMMAND_EDITING  	/*  	 ** enable command line editing only while a command line  	 ** is actually being read; otherwise, we'll end up bequeathing @@ -1176,7 +1176,7 @@ static void mark_closed(int fd)  	free(tmp);  } -static void close_all() +static void close_all(void)  {  	struct close_me *c;  	for (c=close_me_head; c; c=c->next) { @@ -1290,18 +1290,18 @@ static void pseudo_exec(struct child_prog *child)  		 * really dislike relying on /proc for things.  We could exec ourself  		 * from global_argv[0], but if we are in a chroot, we may not be able  		 * to find ourself... */ -#ifdef BB_FEATURE_SH_STANDALONE_SHELL +#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL  		{  			int argc_l;  			char** argv_l=child->argv;  			char *name = child->argv[0]; -#ifdef BB_FEATURE_SH_APPLETS_ALWAYS_WIN +#ifdef CONFIG_FEATURE_SH_APPLETS_ALWAYS_WIN  			/* Following discussions from November 2000 on the busybox mailing  			 * list, the default configuration, (without  			 * get_last_path_component()) lets the user force use of an  			 * external command by specifying the full (with slashes) filename. -			 * If you enable BB_FEATURE_SH_APPLETS_ALWAYS_WIN, then applets +			 * If you enable CONFIG_FEATURE_SH_APPLETS_ALWAYS_WIN then applets  			 * _aways_ override external commands, so if you want to run  			 * /bin/cat, it will use BusyBox cat even if /bin/cat exists on the  			 * filesystem and is _not_ busybox.  Some systems may want this, @@ -1524,13 +1524,26 @@ static int run_pipe_real(struct pipe *pi)  	struct child_prog *child;  	struct built_in_command *x;  	char *p; +# if __GNUC__ +	/* Avoid longjmp clobbering */ +	(void) &i; +	(void) &nextin; +	(void) &nextout; +	(void) &child; +# endif  #else  	int nextin;  	int flag = do_repeat ? CMD_FLAG_REPEAT : 0;  	struct child_prog *child;  	cmd_tbl_t *cmdtp;  	char *p; -#endif +# if __GNUC__ +	/* Avoid longjmp clobbering */ +	(void) &i; +	(void) &nextin; +	(void) &child; +# endif +#endif	/* __U_BOOT__ */  	nextin = 0;  #ifndef __U_BOOT__ @@ -3194,7 +3207,7 @@ static void *xrealloc(void *ptr, size_t size)  /* Make sure we have a controlling tty.  If we get started under a job   * aware app (like bash for example), make sure we are now in charge so   * we don't fight over who gets the foreground */ -static void setup_job_control() +static void setup_job_control(void)  {  	static pid_t shell_pgrp;  	/* Loop until we are in the foreground.  */ @@ -3243,7 +3256,7 @@ int hush_main(int argc, char **argv)  	/* Initialize some more globals to non-zero values */  	set_cwd(); -#ifdef BB_FEATURE_COMMAND_EDITING +#ifdef CONFIG_FEATURE_COMMAND_EDITING  	cmdedit_set_initial_prompt();  #else  	PS1 = NULL; @@ -3312,7 +3325,10 @@ int hush_main(int argc, char **argv)  	debug_printf("\ninteractive=%d\n", interactive);  	if (interactive) {  		/* Looks like they want an interactive shell */ -		fprintf(stdout, "\nhush -- the humble shell v0.01 (testing)\n\n"); +#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET  +		printf( "\n\n" BB_BANNER " hush - the humble shell v0.01 (testing)\n"); +		printf( "Enter 'help' for a list of built-in commands.\n\n"); +#endif  		setup_job_control();  	} @@ -3327,7 +3343,7 @@ int hush_main(int argc, char **argv)  	input = xfopen(argv[optind], "r");  	opt = parse_file_outer(input); -#ifdef BB_FEATURE_CLEAN_UP +#ifdef CONFIG_FEATURE_CLEAN_UP  	fclose(input);  	if (cwd && cwd != unknown)  		free((char*)cwd); diff --git a/cpu/mpc8xx/serial.c b/cpu/mpc8xx/serial.c index 0690300b2..2871084fc 100644 --- a/cpu/mpc8xx/serial.c +++ b/cpu/mpc8xx/serial.c @@ -24,6 +24,7 @@  #include <common.h>  #include <commproc.h>  #include <command.h> +#include <watchdog.h>  #if !defined(CONFIG_8xx_CONS_NONE)	/* No Console at all */ @@ -265,20 +266,16 @@ serial_putc(const char c)  	*/  	buf = (char *)tbdf->cbd_bufaddr; -#if 0 -	__asm__("eieio"); -	while (tbdf->cbd_sc & BD_SC_READY) -		__asm__("eieio"); -#endif  	*buf = c;  	tbdf->cbd_datlen = 1;  	tbdf->cbd_sc |= BD_SC_READY;  	__asm__("eieio"); -#if 1 -	while (tbdf->cbd_sc & BD_SC_READY) + +	while (tbdf->cbd_sc & BD_SC_READY) { +		WATCHDOG_RESET ();  		__asm__("eieio"); -#endif +	}  }  int @@ -298,8 +295,10 @@ serial_getc(void)  	/* Wait for character to show up.  	*/  	buf = (unsigned char *)rbdf->cbd_bufaddr; +  	while (rbdf->cbd_sc & BD_SC_EMPTY) -		; +		WATCHDOG_RESET (); +  	c = *buf;  	rbdf->cbd_sc |= BD_SC_EMPTY; @@ -524,20 +523,16 @@ serial_putc(const char c)  	*/  	buf = (char *)tbdf->cbd_bufaddr; -#if 0 -	__asm__("eieio"); -	while (tbdf->cbd_sc & BD_SC_READY) -		__asm__("eieio"); -#endif  	*buf = c;  	tbdf->cbd_datlen = 1;  	tbdf->cbd_sc |= BD_SC_READY;  	__asm__("eieio"); -#if 1 -	while (tbdf->cbd_sc & BD_SC_READY) + +	while (tbdf->cbd_sc & BD_SC_READY) {  		__asm__("eieio"); -#endif +		WATCHDOG_RESET (); +	}  }  int @@ -557,8 +552,10 @@ serial_getc(void)  	/* Wait for character to show up.  	*/  	buf = (unsigned char *)rbdf->cbd_bufaddr; +  	while (rbdf->cbd_sc & BD_SC_EMPTY) -		; +		WATCHDOG_RESET (); +  	c = *buf;  	rbdf->cbd_sc |= BD_SC_EMPTY; diff --git a/cpu/mpc8xx/start.S b/cpu/mpc8xx/start.S index a1b7effe8..213c9a9be 100644 --- a/cpu/mpc8xx/start.S +++ b/cpu/mpc8xx/start.S @@ -583,7 +583,7 @@ relocate_code:  	/* First our own GOT */  	add	r14, r14, r15 -	/* the the one used by the C code */ +	/* then the one used by the C code */  	add	r30, r30, r15  	/* diff --git a/include/configs/lwmon.h b/include/configs/lwmon.h index dc0099de4..66c79356f 100644 --- a/include/configs/lwmon.h +++ b/include/configs/lwmon.h @@ -203,7 +203,14 @@  #define CFG_HZ			1000	/* decrementer freq: 1 ms ticks */ -#define CFG_BAUDRATE_TABLE	{ 9600, 19200, 38400, 57600, 115200 } +/* + * When the watchdog is enabled, output must be fast enough in Linux. + */ +#ifdef CONFIG_WATCHDOG +#define CFG_BAUDRATE_TABLE	{		38400, 57600, 115200 } +#else +#define CFG_BAUDRATE_TABLE	{  9600, 19200, 38400, 57600, 115200 } +#endif  /*   * Low Level Configuration Settings diff --git a/tools/env/README b/tools/env/README index 2b54adf76..d8386f7f2 100644 --- a/tools/env/README +++ b/tools/env/README @@ -2,28 +2,43 @@  This is a demo implementation of a Linux command line tool to access  the U-Boot's environment variables. -Configuration is done via #defines in the fw_env.h file. The +For the run-time utiltity configuration uncomment the line +#define CONFIG_FILE  "/etc/fw_env.config" +in fw_env.h. + +See comments in the fw_env.config file for definitions for the +particular board. + +Configuration can also be done via #defines in the fw_env.h file. The  following lines are relevant:  #define HAVE_REDUND	/* For systems with 2 env sectors */  #define DEVICE1_NAME	"/dev/mtd1"  #define DEVICE2_NAME	"/dev/mtd2" -#define ENV1_SIZE	0x4000 -#define DEVICE1_ESIZE	0x4000 -#define ENV2_SIZE	0x4000 -#define DEVICE2_ESIZE	0x4000 +#define DEVICE1_OFFSET    0x0000 +#define ENV1_SIZE         0x4000 +#define DEVICE1_ESIZE     0x4000 +#define DEVICE2_OFFSET    0x0000 +#define ENV2_SIZE         0x4000 +#define DEVICE2_ESIZE     0x4000  Current configuration matches the environment layout of the TRAB  board.  Un-define HAVE_REDUND, if you want to use the utlities on a system -that does not have support for redundant environment enabled. The -DEVICEx_NAME constants define which MTD character device(s) is (are) -to be used to access the environment. If HAVE_REDUND is undefined, -DEVICE2_NAME is ignored, as is ENV2_SIZE and DEVICE2_ESIZE. ENVx_SIZE -defines the size in bytes taken by the environment, which may be less -then flash sector size, if the environment takes less then 1 sector. +that does not have support for redundant environment enabled. +If HAVE_REDUND is undefined, DEVICE2_NAME is ignored, +as is ENV2_SIZE and DEVICE2_ESIZE. + +The DEVICEx_NAME constants define which MTD character devices are to +be used to access the environment. + +The DEVICEx_OFFSET constants define the environment offset within the +MTD character device. + +ENVx_SIZE defines the size in bytes taken by the environment, which +may be less then flash sector size, if the environment takes less +then 1 sector. +  DEVICEx_ESIZE defines the size of the first sector in the flash -partition where the environment resides. It is assumed that the -environment is located in the first ENVx_SIZE bytes of the device -DEVICEx_NAME. +partition where the environment resides. diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index 5bf75ac2c..87b41ea59 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -41,6 +41,7 @@ typedef	unsigned char	uchar;  typedef struct envdev_s {  	uchar devname[16]; /* Device name */ +	ulong devoff;      /* Device offset */  	ulong env_size;    /* environment size */  	ulong erase_size;  /* device erase size */  } envdev_t; @@ -49,16 +50,13 @@ static envdev_t envdevices[2];  static int curdev;  #define DEVNAME(i)    envdevices[(i)].devname +#define DEVOFFSET(i)  envdevices[(i)].devoff  #define ENVSIZE(i)    envdevices[(i)].env_size  #define DEVESIZE(i)   envdevices[(i)].erase_size  #define CFG_ENV_SIZE ENVSIZE(curdev) -#ifdef HAVE_REDUND -#define ENV_SIZE (CFG_ENV_SIZE - sizeof(long) - 1) -#else -#define ENV_SIZE (CFG_ENV_SIZE - sizeof(long)) -#endif +#define ENV_SIZE      getenvsize()  typedef struct environment_s {  	ulong	crc;		/* CRC32 over data bytes	*/ @@ -67,46 +65,103 @@ typedef struct environment_s {  } env_t;  static env_t environment; -static int valid = 0; -#ifdef HAVE_REDUND +static int HaveRedundEnv = 0; +  static uchar active_flag = 1;  static uchar obsolete_flag = 0; -#endif +  #define XMK_STR(x)	#x  #define MK_STR(x)	XMK_STR(x)  static uchar default_environment[] = { -#ifdef	CONFIG_BOOTARGS +#if defined(CONFIG_BOOTARGS)  	"bootargs="	CONFIG_BOOTARGS			"\0"  #endif -#ifdef	CONFIG_BOOTCOMMAND +#if defined(CONFIG_BOOTCOMMAND)  	"bootcmd="	CONFIG_BOOTCOMMAND		"\0"  #endif -#if (CONFIG_BOOTDELAY >= 0) +#if defined(CONFIG_RAMBOOTCOMMAND) +	"ramboot="	CONFIG_RAMBOOTCOMMAND		"\0" +#endif +#if defined(CONFIG_NFSBOOTCOMMAND) +	"nfsboot="	CONFIG_NFSBOOTCOMMAND		"\0" +#endif +#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)  	"bootdelay="	MK_STR(CONFIG_BOOTDELAY)	"\0"  #endif -#if (CONFIG_BAUDRATE >= 0) +#if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)  	"baudrate="	MK_STR(CONFIG_BAUDRATE)		"\0"  #endif +#ifdef	CONFIG_LOADS_ECHO +	"loads_echo="	MK_STR(CONFIG_LOADS_ECHO)	"\0" +#endif  #ifdef	CONFIG_ETHADDR  	"ethaddr="	MK_STR(CONFIG_ETHADDR)		"\0"  #endif +#ifdef	CONFIG_ETH1ADDR +	"eth1addr="	MK_STR(CONFIG_ETH1ADDR)		"\0" +#endif +#ifdef	CONFIG_ETH2ADDR +	"eth2addr="	MK_STR(CONFIG_ETH2ADDR)		"\0" +#endif +#ifdef	CONFIG_ETHPRIME +	"ethprime="	CONFIG_ETHPRIME			"\0" +#endif  #ifdef	CONFIG_IPADDR  	"ipaddr="	MK_STR(CONFIG_IPADDR)		"\0"  #endif  #ifdef	CONFIG_SERVERIP  	"serverip="	MK_STR(CONFIG_SERVERIP)		"\0"  #endif -	"\0" +#ifdef	CFG_AUTOLOAD +	"autoload="	CFG_AUTOLOAD			"\0" +#endif +#ifdef	CONFIG_ROOTPATH +	"rootpath="	MK_STR(CONFIG_ROOTPATH)		"\0" +#endif +#ifdef	CONFIG_GATEWAYIP +	"gatewayip="	MK_STR(CONFIG_GATEWAYIP)	"\0" +#endif +#ifdef	CONFIG_NETMASK +	"netmask="	MK_STR(CONFIG_NETMASK)		"\0" +#endif +#ifdef	CONFIG_HOSTNAME +	"hostname="	MK_STR(CONFIG_HOSTNAME)		"\0" +#endif +#ifdef	CONFIG_BOOTFILE +	"bootfile="	MK_STR(CONFIG_BOOTFILE)		"\0" +#endif +#ifdef	CONFIG_LOADADDR +	"loadaddr="	MK_STR(CONFIG_LOADADDR)		"\0" +#endif +#ifdef	CONFIG_PREBOOT +	"preboot="	CONFIG_PREBOOT			"\0" +#endif +#ifdef	CONFIG_CLOCKS_IN_MHZ +	"clocks_in_mhz=" "1"				"\0" +#endif +#ifdef  CONFIG_EXTRA_ENV_SETTINGS +	CONFIG_EXTRA_ENV_SETTINGS +#endif +	"\0"		/* Termimate env_t data with 2 NULs */  };  static int  flash_io (int mode);  static uchar *envmatch(uchar *s1, uchar *s2);  static int env_init(void);  static int parse_config(void); - +#if defined(CONFIG_FILE) +static int get_config(char *); +#endif +static inline ulong getenvsize(void) +{ +	ulong rc = CFG_ENV_SIZE - sizeof(long); +	if (HaveRedundEnv) +		rc -= sizeof(char); +	return rc; +}  /*   * Search the environment for a variable. @@ -338,34 +393,37 @@ static int flash_io (int mode)  		return (-1);  	} -	len = sizeof(environment.crc) + sizeof(environment.flags); +	len = sizeof(environment.crc); +	if (HaveRedundEnv) { +		len += sizeof(environment.flags); +	}  	if (mode == O_RDWR) { -#ifdef HAVE_REDUND -		/* switch to next partition for writing */ -		otherdev = !curdev; -		if ((fdr = open(DEVNAME(otherdev), mode)) < 0) { -			fprintf (stderr,  -					 "Can't open %s: %s\n",  -					 DEVNAME(otherdev), strerror(errno)); -			return (-1); +		if (HaveRedundEnv) { +			/* switch to next partition for writing */ +			otherdev = !curdev; +			if ((fdr = open(DEVNAME(otherdev), mode)) < 0) { +				fprintf (stderr,  +						 "Can't open %s: %s\n",  +						 DEVNAME(otherdev), strerror(errno)); +				return (-1); +			} +		} else { +			otherdev = curdev; +			fdr = fd;  		} -#else -		otherdev = curdev; -		fdr = fd; -		len = sizeof(environment.crc); -#endif  		printf("Unlocking flash...\n");  		erase.length = DEVESIZE(otherdev); -		erase.start = 0; +		erase.start = DEVOFFSET(otherdev);  		ioctl (fdr, MEMUNLOCK, &erase); -#ifdef HAVE_REDUND -		erase.length = DEVESIZE(curdev); -		erase.start = 0; -		ioctl (fd, MEMUNLOCK, &erase); -		environment.flags = active_flag; -#endif +		if (HaveRedundEnv) { +			erase.length = DEVESIZE(curdev); +			erase.start = DEVOFFSET(curdev); +			ioctl (fd, MEMUNLOCK, &erase); +			environment.flags = active_flag; +		} +  		printf("Done\n");  		resid = DEVESIZE(otherdev) - CFG_ENV_SIZE;  		if (resid) { @@ -375,22 +433,16 @@ static int flash_io (int mode)  				  resid, strerror(errno));  				return (-1);  			} -			if (lseek (fdr, CFG_ENV_SIZE, SEEK_SET) == -1) { +			if (lseek (fdr, DEVOFFSET(otherdev) + CFG_ENV_SIZE, SEEK_SET) == -1) {  				fprintf (stderr,  				  "seek error on %s: %s\n",  -				   DEVNAME(curdev), strerror(errno)); +				   DEVNAME(otherdev), strerror(errno));  				return (-1);  			}  			if ((rc = read (fdr, data, resid)) != resid) {  				fprintf (stderr,  				  "read error on %s: %s\n",  -				  DEVNAME(curdev), strerror(errno)); -				return (-1); -			} -			if (lseek (fdr, 0, SEEK_SET) == -1) { -				fprintf (stderr, -				  "seek error on %s: %s\n",  -				  DEVNAME(curdev), strerror(errno)); +				  DEVNAME(otherdev), strerror(errno));  				return (-1);  			}  		} @@ -398,6 +450,7 @@ static int flash_io (int mode)  		printf("Erasing old environment...\n");  		erase.length = DEVESIZE(otherdev); +		erase.start = DEVOFFSET(otherdev);  		if (ioctl (fdr, MEMERASE, &erase) != 0) {  			fprintf (stderr, "MTD erase error on %s: %s\n",  			  DEVNAME(otherdev), strerror(errno)); @@ -407,6 +460,12 @@ static int flash_io (int mode)  		printf("Done\n");  		printf("Writing environment to %s...\n",DEVNAME(otherdev)); +		if (lseek (fdr, DEVOFFSET(otherdev), SEEK_SET) == -1) { +			fprintf (stderr, +			  "seek error on %s: %s\n",  +			  DEVNAME(otherdev), strerror(errno)); +			return (-1); +		}  		if (write(fdr, &environment, len) != len) {  			fprintf (stderr,  			  "CRC write error on %s: %s\n",  @@ -428,43 +487,47 @@ static int flash_io (int mode)  			}  			free(data);  		} -#ifdef HAVE_REDUND -		/* change flag on current active env partition */ -		if (lseek (fd, sizeof(ulong), SEEK_SET) == -1) { -			fprintf (stderr, -			  "seek error on %s: %s\n",  -			  DEVNAME(curdev), strerror(errno)); -			return (-1); -		} -		if (write (fd, &obsolete_flag, sizeof(obsolete_flag)) !=  -			sizeof(obsolete_flag)) { -			fprintf (stderr, -			 "Write error on %s: %s\n",  -			 DEVNAME(curdev), strerror(errno)); -			return (-1); +		if (HaveRedundEnv) { +			/* change flag on current active env partition */ +			if (lseek (fd, DEVOFFSET(curdev) + sizeof(ulong), SEEK_SET) == -1) { +				fprintf (stderr, +						 "seek error on %s: %s\n",  +						 DEVNAME(curdev), strerror(errno)); +				return (-1); +			} +			if (write (fd, &obsolete_flag, sizeof(obsolete_flag)) !=  +				sizeof(obsolete_flag)) { +				fprintf (stderr, +						 "Write error on %s: %s\n",  +						 DEVNAME(curdev), strerror(errno)); +				return (-1); +			}  		} -#endif  		printf("Done\n");  		printf("Locking ...\n");  		erase.length = DEVESIZE(otherdev); -		erase.start = 0; +		erase.start = DEVOFFSET(otherdev);  		ioctl (fdr, MEMLOCK, &erase); -#ifdef HAVE_REDUND -		erase.length = DEVESIZE(curdev); -		erase.start = 0; -		ioctl (fd, MEMLOCK, &erase); -		if (close(fdr)) { -			fprintf (stderr, -			 "I/O error on %s: %s\n",  -			 DEVNAME(otherdev), strerror(errno)); -			return (-1); +		if (HaveRedundEnv) { +			erase.length = DEVESIZE(curdev); +			erase.start = DEVOFFSET(curdev); +			ioctl (fd, MEMLOCK, &erase); +			if (close(fdr)) { +				fprintf (stderr, +						 "I/O error on %s: %s\n",  +						 DEVNAME(otherdev), strerror(errno)); +				return (-1); +			}  		} -#endif  		printf("Done\n");  	} else { -#ifndef HAVE_REDUND -		len = sizeof(environment.crc); -#endif + +		if (lseek (fd, DEVOFFSET(curdev), SEEK_SET) == -1) { +			fprintf (stderr, +					 "seek error on %s: %s\n",  +					 DEVNAME(curdev), strerror(errno)); +			return (-1); +		}  		if (read (fd, &environment, len) != len) {  			fprintf (stderr,  			 "CRC read error on %s: %s\n",  @@ -515,56 +578,52 @@ static int env_init(void)  {  	int crc1, crc1_ok;  	uchar *addr1; -#ifdef HAVE_REDUND +  	int crc2, crc2_ok;  	uchar flag1, flag2, *addr2; -#endif +	if (parse_config()) /* should fill envdevices */ +		return 1; -	if (!valid) { - -		if (parse_config()) /* should fill envdevices */ -			return 1; - -		if ((addr1 = calloc (1, ENV_SIZE)) == NULL) { -			fprintf (stderr,  -			 "Not enough memory for environment (%ld bytes)\n", -			 ENV_SIZE); -			return (errno); -		} - -		/* read environment from FLASH to local buffer */ -		environment.data = addr1; -		curdev = 0; -		if (flash_io (O_RDONLY)) { -			return (errno); -		} - -		crc1_ok = ((crc1 = crc32(0, environment.data, ENV_SIZE))  -			 == environment.crc); -#ifndef HAVE_REDUND +	if ((addr1 = calloc (1, ENV_SIZE)) == NULL) { +		fprintf (stderr,  +				 "Not enough memory for environment (%ld bytes)\n", +				 ENV_SIZE); +		return (errno); +	} +	 +	/* read environment from FLASH to local buffer */ +	environment.data = addr1; +	curdev = 0; +	if (flash_io (O_RDONLY)) { +		return (errno); +	} +	 +	crc1_ok = ((crc1 = crc32(0, environment.data, ENV_SIZE))  +			   == environment.crc); +	if (!HaveRedundEnv) {  		if (!crc1_ok) {  			fprintf (stderr,  -			 "Warning: Bad CRC, using default environment\n"); +					 "Warning: Bad CRC, using default environment\n");  			environment.data = default_environment;  			free(addr1);  		} -#else +	} else {  		flag1 = environment.flags;  		curdev = 1;  		if ((addr2 = calloc (1, ENV_SIZE)) == NULL) {  			fprintf (stderr,  -			 "Not enough memory for environment (%ld bytes)\n", -			 ENV_SIZE); +					 "Not enough memory for environment (%ld bytes)\n", +					 ENV_SIZE);  			return (errno);  		}		  		environment.data = addr2; - +		  		if (flash_io (O_RDONLY)) {  			return (errno);  		} - +		  		crc2_ok = ((crc2 = crc32(0, environment.data, ENV_SIZE))   				   == environment.crc);  		flag2 = environment.flags; @@ -585,7 +644,7 @@ static int env_init(void)  		}  		else if (! crc1_ok && ! crc2_ok) {  			fprintf (stderr,  -			 "Warning: Bad CRC, using default environment\n"); +					 "Warning: Bad CRC, using default environment\n");  			environment.data = default_environment;  			curdev = 0;  			free(addr2); @@ -626,8 +685,6 @@ static int env_init(void)  			curdev = 1;  			free(addr1);  		} -#endif		 -		valid = 1;  	}  	return (0);  } @@ -637,26 +694,75 @@ static int parse_config()  {  	struct stat st; -	if (stat (DEVICE1_NAME, &st)) { -		fprintf (stderr,  -		 "Cannot access MTD device %s: %s\n",  -		 DEVICE1_NAME, strerror(errno)); +#if defined(CONFIG_FILE) +	/* Fills in DEVNAME(), ENVSIZE(), DEVESIZE(). Or don't. */ +	if (get_config(CONFIG_FILE)) { +		fprintf (stderr, +				 "Cannot parse config file: %s\n", +				 strerror(errno));  		return 1;  	} +#else  	strcpy(DEVNAME(0), DEVICE1_NAME); +	DEVOFFSET(0) = DEVICE1_OFFSET;  	ENVSIZE(0) = ENV1_SIZE;  	DEVESIZE(0) = DEVICE1_ESIZE;  #ifdef HAVE_REDUND -	if (stat (DEVICE2_NAME, &st)) { -		fprintf (stderr,  -		 "Cannot access MTD device %s: %s\n",  -		 DEVICE2_NAME, strerror(errno)); -		return 1; -	}  	strcpy(DEVNAME(1), DEVICE2_NAME); +	DEVOFFSET(1) = DEVICE2_OFFSET;  	ENVSIZE(1) = ENV2_SIZE;  	DEVESIZE(1) = DEVICE2_ESIZE; +	HaveRedundEnv = 1;  #endif +#endif +	if (stat (DEVNAME(0), &st)) { +		fprintf (stderr,  +		 "Cannot access MTD device %s: %s\n",  +		 DEVNAME(0), strerror(errno)); +		return 1; +	} +	 +	if (HaveRedundEnv && stat (DEVNAME(1), &st)) { +		fprintf (stderr,  +		 "Cannot access MTD device %s: %s\n",  +		 DEVNAME(2), strerror(errno)); +		return 1; +	}  	return 0;  } + +#if defined(CONFIG_FILE) +static int get_config (char *fname) +{ +	FILE *fp; +	int i = 0; +	int rc; +	char dump[128]; + +	if ((fp = fopen(fname, "r")) == NULL) { +		return 1; +	} + +	while ((i < 2) &&  +		   ((rc = fscanf (fp, "%s %lx %lx %lx", +						  DEVNAME(i), &DEVOFFSET(i), &ENVSIZE(i), &DEVESIZE(i))) != EOF)) { + +		/* Skip incomplete conversions and comment strings */ +		if ((rc < 3) || (*DEVNAME(i) == '#')) {  +			fgets (dump, sizeof(dump), fp); /* Consume till end */ +			continue; +		} + +		i++; +	} +	fclose(fp); +	 +	HaveRedundEnv = i - 1; +	if (!i) { /* No valid entries found */ +		errno = EINVAL; +		return 1; +	} else +		return 0; +} +#endif diff --git a/tools/env/fw_env.config b/tools/env/fw_env.config new file mode 100644 index 000000000..2432bd866 --- /dev/null +++ b/tools/env/fw_env.config @@ -0,0 +1,7 @@ +# Configuration file for fw_(printenv/saveenv) utility. +# Up to two entries are valid, in this case the redundand +# environment sector is assumed present. + +# MTD device name	Device offset	Env. size	Flash sector size +/dev/mtd1		0x0000		0x4000		0x4000 +/dev/mtd2		0x0000		0x4000		0x4000 diff --git a/tools/env/fw_env.h b/tools/env/fw_env.h index d98edc997..7d7be0415 100644 --- a/tools/env/fw_env.h +++ b/tools/env/fw_env.h @@ -21,11 +21,21 @@   * MA 02111-1307 USA   */ +/*  + * To build the utility with the run-time configuration  + * uncomment the next line. + * See included "fw_env.config" sample file (TRAB board) + * for notes on configuration. + */ +/*#define CONFIG_FILE     "/etc/fw_env.config" */ +  #define HAVE_REDUND /* For systems with 2 env sectors */  #define DEVICE1_NAME      "/dev/mtd1"  #define DEVICE2_NAME      "/dev/mtd2" +#define DEVICE1_OFFSET    0x0000  #define ENV1_SIZE         0x4000  #define DEVICE1_ESIZE     0x4000 +#define DEVICE2_OFFSET    0x0000  #define ENV2_SIZE         0x4000  #define DEVICE2_ESIZE     0x4000 |