From d0fb80c3021e15853895e9ae45ab9368d0fb52fa Mon Sep 17 00:00:00 2001 From: wdenk Date: Sat, 11 Jan 2003 09:48:40 +0000 Subject: [PATCH] * Restrict baudrate settings on LWMON to higher speeds 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) --- CHANGELOG | 8 ++ board/lwmon/lwmon.c | 2 +- common/cmd_nvedit.c | 4 + common/cmd_pcmcia.c | 2 +- common/environment.c | 2 +- common/hush.c | 52 +++++--- cpu/mpc8xx/serial.c | 33 +++-- cpu/mpc8xx/start.S | 2 +- include/configs/lwmon.h | 9 +- tools/env/README | 43 ++++-- tools/env/fw_env.c | 338 +++++++++++++++++++++++++++++++----------------- tools/env/fw_env.config | 7 + tools/env/fw_env.h | 10 ++ 13 files changed, 341 insertions(+), 171 deletions(-) create mode 100644 tools/env/fw_env.config diff --git a/CHANGELOG b/CHANGELOG index e165654..309bbf9 100644 --- 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; diff --git a/board/lwmon/lwmon.c b/board/lwmon/lwmon.c index e797b36..f255599 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 9b6d14f..c404157 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 8a3491e..f9bd0ba 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 74bfd62..1df3872 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 92547433..fcc3559 100644 --- a/common/hush.c +++ b/common/hush.c @@ -117,14 +117,15 @@ /* #include */ /* #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 0690300..2871084 100644 --- a/cpu/mpc8xx/serial.c +++ b/cpu/mpc8xx/serial.c @@ -24,6 +24,7 @@ #include #include #include +#include #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 a1b7eff..213c9a9 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 dc0099d..66c7935 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 2b54adf..d8386f7 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 5bf75ac..87b41ea 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 0000000..2432bd8 --- /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 d98edc9..7d7be04 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 -- 2.7.4