* 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)
This commit is contained in:
parent
a25f862ba8
commit
d0fb80c302
@ -2,6 +2,14 @@
|
|||||||
Changes since U-Boot 0.2.0:
|
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
|
* Add single quote support for (old) command line parser
|
||||||
|
|
||||||
* Switch LWMON board default config from FRAM to EEPROM;
|
* Switch LWMON board default config from FRAM to EEPROM;
|
||||||
|
@ -833,7 +833,7 @@ int do_kbd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Read and set LSB switch */
|
/* 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,
|
F* Function: int do_lsb (cmd_tbl_t *cmdtp, int flag,
|
||||||
|
@ -232,6 +232,10 @@ int _do_setenv (int flag, int argc, char *argv[])
|
|||||||
baudrate);
|
baudrate);
|
||||||
udelay(50000);
|
udelay(50000);
|
||||||
gd->baudrate = baudrate;
|
gd->baudrate = baudrate;
|
||||||
|
#ifdef CONFIG_PPC
|
||||||
|
gd->bd->bi_baudrate = baudrate;
|
||||||
|
#endif
|
||||||
|
|
||||||
serial_setbrg ();
|
serial_setbrg ();
|
||||||
udelay(50000);
|
udelay(50000);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
@ -282,7 +282,7 @@ static int check_ide_device (int slot)
|
|||||||
|
|
||||||
addr = (volatile uchar *)(CFG_PCMCIA_MEM_ADDR +
|
addr = (volatile uchar *)(CFG_PCMCIA_MEM_ADDR +
|
||||||
CFG_PCMCIA_MEM_SIZE * (slot * 4));
|
CFG_PCMCIA_MEM_SIZE * (slot * 4));
|
||||||
debug ("PCMCIA MEM: %08X\n", addr);
|
debug ("PCMCIA MEM: %08lX\n", (ulong)addr);
|
||||||
|
|
||||||
start = p = (volatile uchar *) addr;
|
start = p = (volatile uchar *) addr;
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ env_t environment __PPCENV__ = {
|
|||||||
#ifdef CONFIG_EXTRA_ENV_SETTINGS
|
#ifdef CONFIG_EXTRA_ENV_SETTINGS
|
||||||
CONFIG_EXTRA_ENV_SETTINGS
|
CONFIG_EXTRA_ENV_SETTINGS
|
||||||
#endif
|
#endif
|
||||||
"\0" /* Term. env_t.data with 2 NULLs */
|
"\0" /* Term. env_t.data with 2 NULs */
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#ifdef CFG_ENV_ADDR_REDUND
|
#ifdef CFG_ENV_ADDR_REDUND
|
||||||
|
@ -117,14 +117,15 @@
|
|||||||
/* #include <dmalloc.h> */
|
/* #include <dmalloc.h> */
|
||||||
/* #define DEBUG_SHELL */
|
/* #define DEBUG_SHELL */
|
||||||
|
|
||||||
#ifdef BB_VER
|
#if 1
|
||||||
#include "busybox.h"
|
#include "busybox.h"
|
||||||
#include "cmdedit.h"
|
#include "cmdedit.h"
|
||||||
#else
|
#else
|
||||||
#define applet_name "hush"
|
#define applet_name "hush"
|
||||||
#include "standalone.h"
|
#include "standalone.h"
|
||||||
#define hush_main main
|
#define hush_main main
|
||||||
#undef BB_FEATURE_SH_FANCY_PROMPT
|
#undef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||||
|
#define BB_BANNER
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#define SPECIAL_VAR_SYMBOL 03
|
#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: */
|
/* close_me manipulations: */
|
||||||
static void mark_open(int fd);
|
static void mark_open(int fd);
|
||||||
static void mark_closed(int fd);
|
static void mark_closed(int fd);
|
||||||
static void close_all();
|
static void close_all(void);
|
||||||
#endif
|
#endif
|
||||||
/* "run" the final data structures: */
|
/* "run" the final data structures: */
|
||||||
static char *indenter(int i);
|
static char *indenter(int i);
|
||||||
@ -902,7 +903,7 @@ static void b_reset(o_string *o)
|
|||||||
static void b_free(o_string *o)
|
static void b_free(o_string *o)
|
||||||
{
|
{
|
||||||
b_reset(o);
|
b_reset(o);
|
||||||
if (o->data != NULL) free(o->data);
|
free(o->data);
|
||||||
o->data = NULL;
|
o->data = NULL;
|
||||||
o->maxlen = 0;
|
o->maxlen = 0;
|
||||||
}
|
}
|
||||||
@ -958,7 +959,7 @@ static int static_peek(struct in_str *i)
|
|||||||
#ifndef __U_BOOT__
|
#ifndef __U_BOOT__
|
||||||
static inline void cmdedit_set_initial_prompt(void)
|
static inline void cmdedit_set_initial_prompt(void)
|
||||||
{
|
{
|
||||||
#ifndef BB_FEATURE_SH_FANCY_PROMPT
|
#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||||
PS1 = NULL;
|
PS1 = NULL;
|
||||||
#else
|
#else
|
||||||
PS1 = getenv("PS1");
|
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)
|
static inline void setup_prompt_string(int promptmode, char **prompt_str)
|
||||||
{
|
{
|
||||||
debug_printf("setup_prompt_string %d ",promptmode);
|
debug_printf("setup_prompt_string %d ",promptmode);
|
||||||
#ifndef BB_FEATURE_SH_FANCY_PROMPT
|
#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||||
/* Set up the prompt */
|
/* Set up the prompt */
|
||||||
if (promptmode == 1) {
|
if (promptmode == 1) {
|
||||||
if (PS1)
|
free(PS1);
|
||||||
free(PS1);
|
|
||||||
PS1=xmalloc(strlen(cwd)+4);
|
PS1=xmalloc(strlen(cwd)+4);
|
||||||
sprintf(PS1, "%s %s", cwd, ( geteuid() != 0 ) ? "$ ":"# ");
|
sprintf(PS1, "%s %s", cwd, ( geteuid() != 0 ) ? "$ ":"# ");
|
||||||
*prompt_str = PS1;
|
*prompt_str = PS1;
|
||||||
@ -995,7 +995,7 @@ static void get_user_input(struct in_str *i)
|
|||||||
static char the_command[BUFSIZ];
|
static char the_command[BUFSIZ];
|
||||||
|
|
||||||
setup_prompt_string(i->promptmode, &prompt_str);
|
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
|
** enable command line editing only while a command line
|
||||||
** is actually being read; otherwise, we'll end up bequeathing
|
** is actually being read; otherwise, we'll end up bequeathing
|
||||||
@ -1176,7 +1176,7 @@ static void mark_closed(int fd)
|
|||||||
free(tmp);
|
free(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void close_all()
|
static void close_all(void)
|
||||||
{
|
{
|
||||||
struct close_me *c;
|
struct close_me *c;
|
||||||
for (c=close_me_head; c; c=c->next) {
|
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
|
* 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
|
* from global_argv[0], but if we are in a chroot, we may not be able
|
||||||
* to find ourself... */
|
* to find ourself... */
|
||||||
#ifdef BB_FEATURE_SH_STANDALONE_SHELL
|
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
|
||||||
{
|
{
|
||||||
int argc_l;
|
int argc_l;
|
||||||
char** argv_l=child->argv;
|
char** argv_l=child->argv;
|
||||||
char *name = child->argv[0];
|
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
|
/* Following discussions from November 2000 on the busybox mailing
|
||||||
* list, the default configuration, (without
|
* list, the default configuration, (without
|
||||||
* get_last_path_component()) lets the user force use of an
|
* get_last_path_component()) lets the user force use of an
|
||||||
* external command by specifying the full (with slashes) filename.
|
* 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
|
* _aways_ override external commands, so if you want to run
|
||||||
* /bin/cat, it will use BusyBox cat even if /bin/cat exists on the
|
* /bin/cat, it will use BusyBox cat even if /bin/cat exists on the
|
||||||
* filesystem and is _not_ busybox. Some systems may want this,
|
* 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 child_prog *child;
|
||||||
struct built_in_command *x;
|
struct built_in_command *x;
|
||||||
char *p;
|
char *p;
|
||||||
|
# if __GNUC__
|
||||||
|
/* Avoid longjmp clobbering */
|
||||||
|
(void) &i;
|
||||||
|
(void) &nextin;
|
||||||
|
(void) &nextout;
|
||||||
|
(void) &child;
|
||||||
|
# endif
|
||||||
#else
|
#else
|
||||||
int nextin;
|
int nextin;
|
||||||
int flag = do_repeat ? CMD_FLAG_REPEAT : 0;
|
int flag = do_repeat ? CMD_FLAG_REPEAT : 0;
|
||||||
struct child_prog *child;
|
struct child_prog *child;
|
||||||
cmd_tbl_t *cmdtp;
|
cmd_tbl_t *cmdtp;
|
||||||
char *p;
|
char *p;
|
||||||
#endif
|
# if __GNUC__
|
||||||
|
/* Avoid longjmp clobbering */
|
||||||
|
(void) &i;
|
||||||
|
(void) &nextin;
|
||||||
|
(void) &child;
|
||||||
|
# endif
|
||||||
|
#endif /* __U_BOOT__ */
|
||||||
|
|
||||||
nextin = 0;
|
nextin = 0;
|
||||||
#ifndef __U_BOOT__
|
#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
|
/* 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
|
* aware app (like bash for example), make sure we are now in charge so
|
||||||
* we don't fight over who gets the foreground */
|
* 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;
|
static pid_t shell_pgrp;
|
||||||
/* Loop until we are in the foreground. */
|
/* 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 */
|
/* Initialize some more globals to non-zero values */
|
||||||
set_cwd();
|
set_cwd();
|
||||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||||
cmdedit_set_initial_prompt();
|
cmdedit_set_initial_prompt();
|
||||||
#else
|
#else
|
||||||
PS1 = NULL;
|
PS1 = NULL;
|
||||||
@ -3312,7 +3325,10 @@ int hush_main(int argc, char **argv)
|
|||||||
debug_printf("\ninteractive=%d\n", interactive);
|
debug_printf("\ninteractive=%d\n", interactive);
|
||||||
if (interactive) {
|
if (interactive) {
|
||||||
/* Looks like they want an interactive shell */
|
/* 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();
|
setup_job_control();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3327,7 +3343,7 @@ int hush_main(int argc, char **argv)
|
|||||||
input = xfopen(argv[optind], "r");
|
input = xfopen(argv[optind], "r");
|
||||||
opt = parse_file_outer(input);
|
opt = parse_file_outer(input);
|
||||||
|
|
||||||
#ifdef BB_FEATURE_CLEAN_UP
|
#ifdef CONFIG_FEATURE_CLEAN_UP
|
||||||
fclose(input);
|
fclose(input);
|
||||||
if (cwd && cwd != unknown)
|
if (cwd && cwd != unknown)
|
||||||
free((char*)cwd);
|
free((char*)cwd);
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <commproc.h>
|
#include <commproc.h>
|
||||||
#include <command.h>
|
#include <command.h>
|
||||||
|
#include <watchdog.h>
|
||||||
|
|
||||||
#if !defined(CONFIG_8xx_CONS_NONE) /* No Console at all */
|
#if !defined(CONFIG_8xx_CONS_NONE) /* No Console at all */
|
||||||
|
|
||||||
@ -265,20 +266,16 @@ serial_putc(const char c)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
buf = (char *)tbdf->cbd_bufaddr;
|
buf = (char *)tbdf->cbd_bufaddr;
|
||||||
#if 0
|
|
||||||
__asm__("eieio");
|
|
||||||
while (tbdf->cbd_sc & BD_SC_READY)
|
|
||||||
__asm__("eieio");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
*buf = c;
|
*buf = c;
|
||||||
tbdf->cbd_datlen = 1;
|
tbdf->cbd_datlen = 1;
|
||||||
tbdf->cbd_sc |= BD_SC_READY;
|
tbdf->cbd_sc |= BD_SC_READY;
|
||||||
__asm__("eieio");
|
__asm__("eieio");
|
||||||
#if 1
|
|
||||||
while (tbdf->cbd_sc & BD_SC_READY)
|
while (tbdf->cbd_sc & BD_SC_READY) {
|
||||||
|
WATCHDOG_RESET ();
|
||||||
__asm__("eieio");
|
__asm__("eieio");
|
||||||
#endif
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -298,8 +295,10 @@ serial_getc(void)
|
|||||||
/* Wait for character to show up.
|
/* Wait for character to show up.
|
||||||
*/
|
*/
|
||||||
buf = (unsigned char *)rbdf->cbd_bufaddr;
|
buf = (unsigned char *)rbdf->cbd_bufaddr;
|
||||||
|
|
||||||
while (rbdf->cbd_sc & BD_SC_EMPTY)
|
while (rbdf->cbd_sc & BD_SC_EMPTY)
|
||||||
;
|
WATCHDOG_RESET ();
|
||||||
|
|
||||||
c = *buf;
|
c = *buf;
|
||||||
rbdf->cbd_sc |= BD_SC_EMPTY;
|
rbdf->cbd_sc |= BD_SC_EMPTY;
|
||||||
|
|
||||||
@ -524,20 +523,16 @@ serial_putc(const char c)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
buf = (char *)tbdf->cbd_bufaddr;
|
buf = (char *)tbdf->cbd_bufaddr;
|
||||||
#if 0
|
|
||||||
__asm__("eieio");
|
|
||||||
while (tbdf->cbd_sc & BD_SC_READY)
|
|
||||||
__asm__("eieio");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
*buf = c;
|
*buf = c;
|
||||||
tbdf->cbd_datlen = 1;
|
tbdf->cbd_datlen = 1;
|
||||||
tbdf->cbd_sc |= BD_SC_READY;
|
tbdf->cbd_sc |= BD_SC_READY;
|
||||||
__asm__("eieio");
|
__asm__("eieio");
|
||||||
#if 1
|
|
||||||
while (tbdf->cbd_sc & BD_SC_READY)
|
while (tbdf->cbd_sc & BD_SC_READY) {
|
||||||
__asm__("eieio");
|
__asm__("eieio");
|
||||||
#endif
|
WATCHDOG_RESET ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -557,8 +552,10 @@ serial_getc(void)
|
|||||||
/* Wait for character to show up.
|
/* Wait for character to show up.
|
||||||
*/
|
*/
|
||||||
buf = (unsigned char *)rbdf->cbd_bufaddr;
|
buf = (unsigned char *)rbdf->cbd_bufaddr;
|
||||||
|
|
||||||
while (rbdf->cbd_sc & BD_SC_EMPTY)
|
while (rbdf->cbd_sc & BD_SC_EMPTY)
|
||||||
;
|
WATCHDOG_RESET ();
|
||||||
|
|
||||||
c = *buf;
|
c = *buf;
|
||||||
rbdf->cbd_sc |= BD_SC_EMPTY;
|
rbdf->cbd_sc |= BD_SC_EMPTY;
|
||||||
|
|
||||||
|
@ -583,7 +583,7 @@ relocate_code:
|
|||||||
|
|
||||||
/* First our own GOT */
|
/* First our own GOT */
|
||||||
add r14, r14, r15
|
add r14, r14, r15
|
||||||
/* the the one used by the C code */
|
/* then the one used by the C code */
|
||||||
add r30, r30, r15
|
add r30, r30, r15
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -203,7 +203,14 @@
|
|||||||
|
|
||||||
#define CFG_HZ 1000 /* decrementer freq: 1 ms ticks */
|
#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
|
* Low Level Configuration Settings
|
||||||
|
43
tools/env/README
vendored
43
tools/env/README
vendored
@ -2,28 +2,43 @@
|
|||||||
This is a demo implementation of a Linux command line tool to access
|
This is a demo implementation of a Linux command line tool to access
|
||||||
the U-Boot's environment variables.
|
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:
|
following lines are relevant:
|
||||||
|
|
||||||
#define HAVE_REDUND /* For systems with 2 env sectors */
|
#define HAVE_REDUND /* For systems with 2 env sectors */
|
||||||
#define DEVICE1_NAME "/dev/mtd1"
|
#define DEVICE1_NAME "/dev/mtd1"
|
||||||
#define DEVICE2_NAME "/dev/mtd2"
|
#define DEVICE2_NAME "/dev/mtd2"
|
||||||
#define ENV1_SIZE 0x4000
|
#define DEVICE1_OFFSET 0x0000
|
||||||
#define DEVICE1_ESIZE 0x4000
|
#define ENV1_SIZE 0x4000
|
||||||
#define ENV2_SIZE 0x4000
|
#define DEVICE1_ESIZE 0x4000
|
||||||
#define DEVICE2_ESIZE 0x4000
|
#define DEVICE2_OFFSET 0x0000
|
||||||
|
#define ENV2_SIZE 0x4000
|
||||||
|
#define DEVICE2_ESIZE 0x4000
|
||||||
|
|
||||||
Current configuration matches the environment layout of the TRAB
|
Current configuration matches the environment layout of the TRAB
|
||||||
board.
|
board.
|
||||||
|
|
||||||
Un-define HAVE_REDUND, if you want to use the utlities on a system
|
Un-define HAVE_REDUND, if you want to use the utlities on a system
|
||||||
that does not have support for redundant environment enabled. The
|
that does not have support for redundant environment enabled.
|
||||||
DEVICEx_NAME constants define which MTD character device(s) is (are)
|
If HAVE_REDUND is undefined, DEVICE2_NAME is ignored,
|
||||||
to be used to access the environment. If HAVE_REDUND is undefined,
|
as is ENV2_SIZE and DEVICE2_ESIZE.
|
||||||
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
|
The DEVICEx_NAME constants define which MTD character devices are to
|
||||||
then flash sector size, if the environment takes less then 1 sector.
|
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
|
DEVICEx_ESIZE defines the size of the first sector in the flash
|
||||||
partition where the environment resides. It is assumed that the
|
partition where the environment resides.
|
||||||
environment is located in the first ENVx_SIZE bytes of the device
|
|
||||||
DEVICEx_NAME.
|
|
||||||
|
328
tools/env/fw_env.c
vendored
328
tools/env/fw_env.c
vendored
@ -41,6 +41,7 @@ typedef unsigned char uchar;
|
|||||||
|
|
||||||
typedef struct envdev_s {
|
typedef struct envdev_s {
|
||||||
uchar devname[16]; /* Device name */
|
uchar devname[16]; /* Device name */
|
||||||
|
ulong devoff; /* Device offset */
|
||||||
ulong env_size; /* environment size */
|
ulong env_size; /* environment size */
|
||||||
ulong erase_size; /* device erase size */
|
ulong erase_size; /* device erase size */
|
||||||
} envdev_t;
|
} envdev_t;
|
||||||
@ -49,16 +50,13 @@ static envdev_t envdevices[2];
|
|||||||
static int curdev;
|
static int curdev;
|
||||||
|
|
||||||
#define DEVNAME(i) envdevices[(i)].devname
|
#define DEVNAME(i) envdevices[(i)].devname
|
||||||
|
#define DEVOFFSET(i) envdevices[(i)].devoff
|
||||||
#define ENVSIZE(i) envdevices[(i)].env_size
|
#define ENVSIZE(i) envdevices[(i)].env_size
|
||||||
#define DEVESIZE(i) envdevices[(i)].erase_size
|
#define DEVESIZE(i) envdevices[(i)].erase_size
|
||||||
|
|
||||||
#define CFG_ENV_SIZE ENVSIZE(curdev)
|
#define CFG_ENV_SIZE ENVSIZE(curdev)
|
||||||
|
|
||||||
#ifdef HAVE_REDUND
|
#define ENV_SIZE getenvsize()
|
||||||
#define ENV_SIZE (CFG_ENV_SIZE - sizeof(long) - 1)
|
|
||||||
#else
|
|
||||||
#define ENV_SIZE (CFG_ENV_SIZE - sizeof(long))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct environment_s {
|
typedef struct environment_s {
|
||||||
ulong crc; /* CRC32 over data bytes */
|
ulong crc; /* CRC32 over data bytes */
|
||||||
@ -67,46 +65,103 @@ typedef struct environment_s {
|
|||||||
} env_t;
|
} env_t;
|
||||||
|
|
||||||
static env_t environment;
|
static env_t environment;
|
||||||
static int valid = 0;
|
|
||||||
|
|
||||||
#ifdef HAVE_REDUND
|
static int HaveRedundEnv = 0;
|
||||||
|
|
||||||
static uchar active_flag = 1;
|
static uchar active_flag = 1;
|
||||||
static uchar obsolete_flag = 0;
|
static uchar obsolete_flag = 0;
|
||||||
#endif
|
|
||||||
|
|
||||||
#define XMK_STR(x) #x
|
#define XMK_STR(x) #x
|
||||||
#define MK_STR(x) XMK_STR(x)
|
#define MK_STR(x) XMK_STR(x)
|
||||||
|
|
||||||
static uchar default_environment[] = {
|
static uchar default_environment[] = {
|
||||||
#ifdef CONFIG_BOOTARGS
|
#if defined(CONFIG_BOOTARGS)
|
||||||
"bootargs=" CONFIG_BOOTARGS "\0"
|
"bootargs=" CONFIG_BOOTARGS "\0"
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_BOOTCOMMAND
|
#if defined(CONFIG_BOOTCOMMAND)
|
||||||
"bootcmd=" CONFIG_BOOTCOMMAND "\0"
|
"bootcmd=" CONFIG_BOOTCOMMAND "\0"
|
||||||
#endif
|
#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"
|
"bootdelay=" MK_STR(CONFIG_BOOTDELAY) "\0"
|
||||||
#endif
|
#endif
|
||||||
#if (CONFIG_BAUDRATE >= 0)
|
#if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)
|
||||||
"baudrate=" MK_STR(CONFIG_BAUDRATE) "\0"
|
"baudrate=" MK_STR(CONFIG_BAUDRATE) "\0"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_LOADS_ECHO
|
||||||
|
"loads_echo=" MK_STR(CONFIG_LOADS_ECHO) "\0"
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_ETHADDR
|
#ifdef CONFIG_ETHADDR
|
||||||
"ethaddr=" MK_STR(CONFIG_ETHADDR) "\0"
|
"ethaddr=" MK_STR(CONFIG_ETHADDR) "\0"
|
||||||
#endif
|
#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
|
#ifdef CONFIG_IPADDR
|
||||||
"ipaddr=" MK_STR(CONFIG_IPADDR) "\0"
|
"ipaddr=" MK_STR(CONFIG_IPADDR) "\0"
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_SERVERIP
|
#ifdef CONFIG_SERVERIP
|
||||||
"serverip=" MK_STR(CONFIG_SERVERIP) "\0"
|
"serverip=" MK_STR(CONFIG_SERVERIP) "\0"
|
||||||
#endif
|
#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 int flash_io (int mode);
|
||||||
static uchar *envmatch(uchar *s1, uchar *s2);
|
static uchar *envmatch(uchar *s1, uchar *s2);
|
||||||
static int env_init(void);
|
static int env_init(void);
|
||||||
static int parse_config(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.
|
* Search the environment for a variable.
|
||||||
@ -338,34 +393,37 @@ static int flash_io (int mode)
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
len = sizeof(environment.crc) + sizeof(environment.flags);
|
len = sizeof(environment.crc);
|
||||||
|
if (HaveRedundEnv) {
|
||||||
|
len += sizeof(environment.flags);
|
||||||
|
}
|
||||||
|
|
||||||
if (mode == O_RDWR) {
|
if (mode == O_RDWR) {
|
||||||
#ifdef HAVE_REDUND
|
if (HaveRedundEnv) {
|
||||||
/* switch to next partition for writing */
|
/* switch to next partition for writing */
|
||||||
otherdev = !curdev;
|
otherdev = !curdev;
|
||||||
if ((fdr = open(DEVNAME(otherdev), mode)) < 0) {
|
if ((fdr = open(DEVNAME(otherdev), mode)) < 0) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"Can't open %s: %s\n",
|
"Can't open %s: %s\n",
|
||||||
DEVNAME(otherdev), strerror(errno));
|
DEVNAME(otherdev), strerror(errno));
|
||||||
return (-1);
|
return (-1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
otherdev = curdev;
|
||||||
|
fdr = fd;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
otherdev = curdev;
|
|
||||||
fdr = fd;
|
|
||||||
len = sizeof(environment.crc);
|
|
||||||
#endif
|
|
||||||
printf("Unlocking flash...\n");
|
printf("Unlocking flash...\n");
|
||||||
erase.length = DEVESIZE(otherdev);
|
erase.length = DEVESIZE(otherdev);
|
||||||
erase.start = 0;
|
erase.start = DEVOFFSET(otherdev);
|
||||||
ioctl (fdr, MEMUNLOCK, &erase);
|
ioctl (fdr, MEMUNLOCK, &erase);
|
||||||
|
|
||||||
#ifdef HAVE_REDUND
|
if (HaveRedundEnv) {
|
||||||
erase.length = DEVESIZE(curdev);
|
erase.length = DEVESIZE(curdev);
|
||||||
erase.start = 0;
|
erase.start = DEVOFFSET(curdev);
|
||||||
ioctl (fd, MEMUNLOCK, &erase);
|
ioctl (fd, MEMUNLOCK, &erase);
|
||||||
environment.flags = active_flag;
|
environment.flags = active_flag;
|
||||||
#endif
|
}
|
||||||
|
|
||||||
printf("Done\n");
|
printf("Done\n");
|
||||||
resid = DEVESIZE(otherdev) - CFG_ENV_SIZE;
|
resid = DEVESIZE(otherdev) - CFG_ENV_SIZE;
|
||||||
if (resid) {
|
if (resid) {
|
||||||
@ -375,22 +433,16 @@ static int flash_io (int mode)
|
|||||||
resid, strerror(errno));
|
resid, strerror(errno));
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
if (lseek (fdr, CFG_ENV_SIZE, SEEK_SET) == -1) {
|
if (lseek (fdr, DEVOFFSET(otherdev) + CFG_ENV_SIZE, SEEK_SET) == -1) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"seek error on %s: %s\n",
|
"seek error on %s: %s\n",
|
||||||
DEVNAME(curdev), strerror(errno));
|
DEVNAME(otherdev), strerror(errno));
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
if ((rc = read (fdr, data, resid)) != resid) {
|
if ((rc = read (fdr, data, resid)) != resid) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"read error on %s: %s\n",
|
"read error on %s: %s\n",
|
||||||
DEVNAME(curdev), strerror(errno));
|
DEVNAME(otherdev), strerror(errno));
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
if (lseek (fdr, 0, SEEK_SET) == -1) {
|
|
||||||
fprintf (stderr,
|
|
||||||
"seek error on %s: %s\n",
|
|
||||||
DEVNAME(curdev), strerror(errno));
|
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -398,6 +450,7 @@ static int flash_io (int mode)
|
|||||||
printf("Erasing old environment...\n");
|
printf("Erasing old environment...\n");
|
||||||
|
|
||||||
erase.length = DEVESIZE(otherdev);
|
erase.length = DEVESIZE(otherdev);
|
||||||
|
erase.start = DEVOFFSET(otherdev);
|
||||||
if (ioctl (fdr, MEMERASE, &erase) != 0) {
|
if (ioctl (fdr, MEMERASE, &erase) != 0) {
|
||||||
fprintf (stderr, "MTD erase error on %s: %s\n",
|
fprintf (stderr, "MTD erase error on %s: %s\n",
|
||||||
DEVNAME(otherdev), strerror(errno));
|
DEVNAME(otherdev), strerror(errno));
|
||||||
@ -407,6 +460,12 @@ static int flash_io (int mode)
|
|||||||
printf("Done\n");
|
printf("Done\n");
|
||||||
|
|
||||||
printf("Writing environment to %s...\n",DEVNAME(otherdev));
|
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) {
|
if (write(fdr, &environment, len) != len) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"CRC write error on %s: %s\n",
|
"CRC write error on %s: %s\n",
|
||||||
@ -428,43 +487,47 @@ static int flash_io (int mode)
|
|||||||
}
|
}
|
||||||
free(data);
|
free(data);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_REDUND
|
if (HaveRedundEnv) {
|
||||||
/* change flag on current active env partition */
|
/* change flag on current active env partition */
|
||||||
if (lseek (fd, sizeof(ulong), SEEK_SET) == -1) {
|
if (lseek (fd, DEVOFFSET(curdev) + sizeof(ulong), SEEK_SET) == -1) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"seek error on %s: %s\n",
|
"seek error on %s: %s\n",
|
||||||
DEVNAME(curdev), strerror(errno));
|
DEVNAME(curdev), strerror(errno));
|
||||||
return (-1);
|
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 (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("Done\n");
|
||||||
printf("Locking ...\n");
|
printf("Locking ...\n");
|
||||||
erase.length = DEVESIZE(otherdev);
|
erase.length = DEVESIZE(otherdev);
|
||||||
erase.start = 0;
|
erase.start = DEVOFFSET(otherdev);
|
||||||
ioctl (fdr, MEMLOCK, &erase);
|
ioctl (fdr, MEMLOCK, &erase);
|
||||||
#ifdef HAVE_REDUND
|
if (HaveRedundEnv) {
|
||||||
erase.length = DEVESIZE(curdev);
|
erase.length = DEVESIZE(curdev);
|
||||||
erase.start = 0;
|
erase.start = DEVOFFSET(curdev);
|
||||||
ioctl (fd, MEMLOCK, &erase);
|
ioctl (fd, MEMLOCK, &erase);
|
||||||
if (close(fdr)) {
|
if (close(fdr)) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"I/O error on %s: %s\n",
|
"I/O error on %s: %s\n",
|
||||||
DEVNAME(otherdev), strerror(errno));
|
DEVNAME(otherdev), strerror(errno));
|
||||||
return (-1);
|
return (-1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
printf("Done\n");
|
printf("Done\n");
|
||||||
} else {
|
} else {
|
||||||
#ifndef HAVE_REDUND
|
|
||||||
len = sizeof(environment.crc);
|
if (lseek (fd, DEVOFFSET(curdev), SEEK_SET) == -1) {
|
||||||
#endif
|
fprintf (stderr,
|
||||||
|
"seek error on %s: %s\n",
|
||||||
|
DEVNAME(curdev), strerror(errno));
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
if (read (fd, &environment, len) != len) {
|
if (read (fd, &environment, len) != len) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"CRC read error on %s: %s\n",
|
"CRC read error on %s: %s\n",
|
||||||
@ -515,48 +578,44 @@ static int env_init(void)
|
|||||||
{
|
{
|
||||||
int crc1, crc1_ok;
|
int crc1, crc1_ok;
|
||||||
uchar *addr1;
|
uchar *addr1;
|
||||||
#ifdef HAVE_REDUND
|
|
||||||
int crc2, crc2_ok;
|
int crc2, crc2_ok;
|
||||||
uchar flag1, flag2, *addr2;
|
uchar flag1, flag2, *addr2;
|
||||||
#endif
|
|
||||||
|
|
||||||
|
if (parse_config()) /* should fill envdevices */
|
||||||
|
return 1;
|
||||||
|
|
||||||
if (!valid) {
|
if ((addr1 = calloc (1, ENV_SIZE)) == NULL) {
|
||||||
|
fprintf (stderr,
|
||||||
|
"Not enough memory for environment (%ld bytes)\n",
|
||||||
|
ENV_SIZE);
|
||||||
|
return (errno);
|
||||||
|
}
|
||||||
|
|
||||||
if (parse_config()) /* should fill envdevices */
|
/* read environment from FLASH to local buffer */
|
||||||
return 1;
|
environment.data = addr1;
|
||||||
|
curdev = 0;
|
||||||
|
if (flash_io (O_RDONLY)) {
|
||||||
|
return (errno);
|
||||||
|
}
|
||||||
|
|
||||||
if ((addr1 = calloc (1, ENV_SIZE)) == NULL) {
|
crc1_ok = ((crc1 = crc32(0, environment.data, ENV_SIZE))
|
||||||
fprintf (stderr,
|
== environment.crc);
|
||||||
"Not enough memory for environment (%ld bytes)\n",
|
if (!HaveRedundEnv) {
|
||||||
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 (!crc1_ok) {
|
if (!crc1_ok) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"Warning: Bad CRC, using default environment\n");
|
"Warning: Bad CRC, using default environment\n");
|
||||||
environment.data = default_environment;
|
environment.data = default_environment;
|
||||||
free(addr1);
|
free(addr1);
|
||||||
}
|
}
|
||||||
#else
|
} else {
|
||||||
flag1 = environment.flags;
|
flag1 = environment.flags;
|
||||||
|
|
||||||
curdev = 1;
|
curdev = 1;
|
||||||
if ((addr2 = calloc (1, ENV_SIZE)) == NULL) {
|
if ((addr2 = calloc (1, ENV_SIZE)) == NULL) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"Not enough memory for environment (%ld bytes)\n",
|
"Not enough memory for environment (%ld bytes)\n",
|
||||||
ENV_SIZE);
|
ENV_SIZE);
|
||||||
return (errno);
|
return (errno);
|
||||||
}
|
}
|
||||||
environment.data = addr2;
|
environment.data = addr2;
|
||||||
@ -585,7 +644,7 @@ static int env_init(void)
|
|||||||
}
|
}
|
||||||
else if (! crc1_ok && ! crc2_ok) {
|
else if (! crc1_ok && ! crc2_ok) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"Warning: Bad CRC, using default environment\n");
|
"Warning: Bad CRC, using default environment\n");
|
||||||
environment.data = default_environment;
|
environment.data = default_environment;
|
||||||
curdev = 0;
|
curdev = 0;
|
||||||
free(addr2);
|
free(addr2);
|
||||||
@ -626,8 +685,6 @@ static int env_init(void)
|
|||||||
curdev = 1;
|
curdev = 1;
|
||||||
free(addr1);
|
free(addr1);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
valid = 1;
|
|
||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@ -637,26 +694,75 @@ static int parse_config()
|
|||||||
{
|
{
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
if (stat (DEVICE1_NAME, &st)) {
|
#if defined(CONFIG_FILE)
|
||||||
|
/* Fills in DEVNAME(), ENVSIZE(), DEVESIZE(). Or don't. */
|
||||||
|
if (get_config(CONFIG_FILE)) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"Cannot access MTD device %s: %s\n",
|
"Cannot parse config file: %s\n",
|
||||||
DEVICE1_NAME, strerror(errno));
|
strerror(errno));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
strcpy(DEVNAME(0), DEVICE1_NAME);
|
strcpy(DEVNAME(0), DEVICE1_NAME);
|
||||||
|
DEVOFFSET(0) = DEVICE1_OFFSET;
|
||||||
ENVSIZE(0) = ENV1_SIZE;
|
ENVSIZE(0) = ENV1_SIZE;
|
||||||
DEVESIZE(0) = DEVICE1_ESIZE;
|
DEVESIZE(0) = DEVICE1_ESIZE;
|
||||||
#ifdef HAVE_REDUND
|
#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);
|
strcpy(DEVNAME(1), DEVICE2_NAME);
|
||||||
|
DEVOFFSET(1) = DEVICE2_OFFSET;
|
||||||
ENVSIZE(1) = ENV2_SIZE;
|
ENVSIZE(1) = ENV2_SIZE;
|
||||||
DEVESIZE(1) = DEVICE2_ESIZE;
|
DEVESIZE(1) = DEVICE2_ESIZE;
|
||||||
|
HaveRedundEnv = 1;
|
||||||
#endif
|
#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;
|
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
|
||||||
|
7
tools/env/fw_env.config
vendored
Normal file
7
tools/env/fw_env.config
vendored
Normal file
@ -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
|
10
tools/env/fw_env.h
vendored
10
tools/env/fw_env.h
vendored
@ -21,11 +21,21 @@
|
|||||||
* MA 02111-1307 USA
|
* 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 HAVE_REDUND /* For systems with 2 env sectors */
|
||||||
#define DEVICE1_NAME "/dev/mtd1"
|
#define DEVICE1_NAME "/dev/mtd1"
|
||||||
#define DEVICE2_NAME "/dev/mtd2"
|
#define DEVICE2_NAME "/dev/mtd2"
|
||||||
|
#define DEVICE1_OFFSET 0x0000
|
||||||
#define ENV1_SIZE 0x4000
|
#define ENV1_SIZE 0x4000
|
||||||
#define DEVICE1_ESIZE 0x4000
|
#define DEVICE1_ESIZE 0x4000
|
||||||
|
#define DEVICE2_OFFSET 0x0000
|
||||||
#define ENV2_SIZE 0x4000
|
#define ENV2_SIZE 0x4000
|
||||||
#define DEVICE2_ESIZE 0x4000
|
#define DEVICE2_ESIZE 0x4000
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user