* Restrict baudrate settings on LWMON to higher speeds
authorwdenk <wdenk>
Sat, 11 Jan 2003 09:48:40 +0000 (09:48 +0000)
committerwdenk <wdenk>
Sat, 11 Jan 2003 09:48:40 +0000 (09:48 +0000)
  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)

13 files changed:
CHANGELOG
board/lwmon/lwmon.c
common/cmd_nvedit.c
common/cmd_pcmcia.c
common/environment.c
common/hush.c
cpu/mpc8xx/serial.c
cpu/mpc8xx/start.S
include/configs/lwmon.h
tools/env/README
tools/env/fw_env.c
tools/env/fw_env.config [new file with mode: 0644]
tools/env/fw_env.h

index e16565423e131ba644823f50c286e0467b482ae0..309bbf9ea7c5d62631b4247924fb05d430b32655 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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;
index e797b362814bd3a8729a3704aa300767111f016a..f255599cf4fe05a3e47a92ee3ee4534722f9b0ab 100644 (file)
@@ -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,
index 9b6d14fe2351dc7a65f062093b6ab7484823e361..c404157acc621ab61419001d9249bdc72c021aaf 100644 (file)
@@ -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 (;;) {
index 8a3491ede7940523249d733cc88ffc341e26056c..f9bd0ba89b647b2f59172409a71b78631bddbaef 100644 (file)
@@ -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;
 
index 74bfd6269d340a678924dc18a845e76d67663295..1df3872903168de7eba52bd4d95a0a759dac1e4d 100644 (file)
@@ -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
index 925474332be99bf901efbf8c148e69a3fa6fc2e3..fcc3559235c472876ffa267cea6c002a2e79708e 100644 (file)
 /* #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);
index 0690300b24ebd31ba288a399e41ea54c3eafa88b..2871084fcdd4be978e75316bc989c13c8ae43299 100644 (file)
@@ -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;
 
index a1b7effe8f6620ab1165c9a50c457ab604287c11..213c9a9bedd4cc77fad623b9e36b8dc780cb84be 100644 (file)
@@ -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
 
        /*
index dc0099de4cc2a989190d9c13a437e4a30fd46e62..66c79356f4a2e62e24ec6d5db91da5603367d837 100644 (file)
 
 #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
index 2b54adf76bd265d36fa23e12bb4aae90ffcc20c8..d8386f7f2d6bd4df4829b8771e3259bb7a827982 100644 (file)
@@ -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.
index 5bf75ac2c20bb716e498a4297d8909df28c75f89..87b41ea59404aee053e2c57cd319ddcd9bd443fd 100644 (file)
@@ -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 (file)
index 0000000..2432bd8
--- /dev/null
@@ -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
index d98edc9975db19c83d831217001ddd8056d9d00a..7d7be04157351df6af58c777f06569150b692eca 100644 (file)
  * 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