* 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:
|
||||
======================================================================
|
||||
|
||||
* 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;
|
||||
|
@ -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,
|
||||
|
@ -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 (;;) {
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -117,14 +117,15 @@
|
||||
/* #include <dmalloc.h> */
|
||||
/* #define DEBUG_SHELL */
|
||||
|
||||
#ifdef BB_VER
|
||||
#if 1
|
||||
#include "busybox.h"
|
||||
#include "cmdedit.h"
|
||||
#else
|
||||
#define applet_name "hush"
|
||||
#include "standalone.h"
|
||||
#define hush_main main
|
||||
#undef BB_FEATURE_SH_FANCY_PROMPT
|
||||
#undef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
#define BB_BANNER
|
||||
#endif
|
||||
#endif
|
||||
#define SPECIAL_VAR_SYMBOL 03
|
||||
@ -430,7 +431,7 @@ static void setup_string_in_str(struct in_str *i, const char *s);
|
||||
/* close_me manipulations: */
|
||||
static void mark_open(int fd);
|
||||
static void mark_closed(int fd);
|
||||
static void close_all();
|
||||
static void close_all(void);
|
||||
#endif
|
||||
/* "run" the final data structures: */
|
||||
static char *indenter(int i);
|
||||
@ -902,7 +903,7 @@ static void b_reset(o_string *o)
|
||||
static void b_free(o_string *o)
|
||||
{
|
||||
b_reset(o);
|
||||
if (o->data != NULL) free(o->data);
|
||||
free(o->data);
|
||||
o->data = NULL;
|
||||
o->maxlen = 0;
|
||||
}
|
||||
@ -958,7 +959,7 @@ static int static_peek(struct in_str *i)
|
||||
#ifndef __U_BOOT__
|
||||
static inline void cmdedit_set_initial_prompt(void)
|
||||
{
|
||||
#ifndef BB_FEATURE_SH_FANCY_PROMPT
|
||||
#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
PS1 = NULL;
|
||||
#else
|
||||
PS1 = getenv("PS1");
|
||||
@ -970,11 +971,10 @@ static inline void cmdedit_set_initial_prompt(void)
|
||||
static inline void setup_prompt_string(int promptmode, char **prompt_str)
|
||||
{
|
||||
debug_printf("setup_prompt_string %d ",promptmode);
|
||||
#ifndef BB_FEATURE_SH_FANCY_PROMPT
|
||||
#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT
|
||||
/* Set up the prompt */
|
||||
if (promptmode == 1) {
|
||||
if (PS1)
|
||||
free(PS1);
|
||||
free(PS1);
|
||||
PS1=xmalloc(strlen(cwd)+4);
|
||||
sprintf(PS1, "%s %s", cwd, ( geteuid() != 0 ) ? "$ ":"# ");
|
||||
*prompt_str = PS1;
|
||||
@ -995,7 +995,7 @@ static void get_user_input(struct in_str *i)
|
||||
static char the_command[BUFSIZ];
|
||||
|
||||
setup_prompt_string(i->promptmode, &prompt_str);
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
/*
|
||||
** enable command line editing only while a command line
|
||||
** is actually being read; otherwise, we'll end up bequeathing
|
||||
@ -1176,7 +1176,7 @@ static void mark_closed(int fd)
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
static void close_all()
|
||||
static void close_all(void)
|
||||
{
|
||||
struct close_me *c;
|
||||
for (c=close_me_head; c; c=c->next) {
|
||||
@ -1290,18 +1290,18 @@ static void pseudo_exec(struct child_prog *child)
|
||||
* really dislike relying on /proc for things. We could exec ourself
|
||||
* from global_argv[0], but if we are in a chroot, we may not be able
|
||||
* to find ourself... */
|
||||
#ifdef BB_FEATURE_SH_STANDALONE_SHELL
|
||||
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
|
||||
{
|
||||
int argc_l;
|
||||
char** argv_l=child->argv;
|
||||
char *name = child->argv[0];
|
||||
|
||||
#ifdef BB_FEATURE_SH_APPLETS_ALWAYS_WIN
|
||||
#ifdef CONFIG_FEATURE_SH_APPLETS_ALWAYS_WIN
|
||||
/* Following discussions from November 2000 on the busybox mailing
|
||||
* list, the default configuration, (without
|
||||
* get_last_path_component()) lets the user force use of an
|
||||
* external command by specifying the full (with slashes) filename.
|
||||
* If you enable BB_FEATURE_SH_APPLETS_ALWAYS_WIN, then applets
|
||||
* If you enable CONFIG_FEATURE_SH_APPLETS_ALWAYS_WIN then applets
|
||||
* _aways_ override external commands, so if you want to run
|
||||
* /bin/cat, it will use BusyBox cat even if /bin/cat exists on the
|
||||
* filesystem and is _not_ busybox. Some systems may want this,
|
||||
@ -1524,13 +1524,26 @@ static int run_pipe_real(struct pipe *pi)
|
||||
struct child_prog *child;
|
||||
struct built_in_command *x;
|
||||
char *p;
|
||||
# if __GNUC__
|
||||
/* Avoid longjmp clobbering */
|
||||
(void) &i;
|
||||
(void) &nextin;
|
||||
(void) &nextout;
|
||||
(void) &child;
|
||||
# endif
|
||||
#else
|
||||
int nextin;
|
||||
int flag = do_repeat ? CMD_FLAG_REPEAT : 0;
|
||||
struct child_prog *child;
|
||||
cmd_tbl_t *cmdtp;
|
||||
char *p;
|
||||
#endif
|
||||
# if __GNUC__
|
||||
/* Avoid longjmp clobbering */
|
||||
(void) &i;
|
||||
(void) &nextin;
|
||||
(void) &child;
|
||||
# endif
|
||||
#endif /* __U_BOOT__ */
|
||||
|
||||
nextin = 0;
|
||||
#ifndef __U_BOOT__
|
||||
@ -3194,7 +3207,7 @@ static void *xrealloc(void *ptr, size_t size)
|
||||
/* Make sure we have a controlling tty. If we get started under a job
|
||||
* aware app (like bash for example), make sure we are now in charge so
|
||||
* we don't fight over who gets the foreground */
|
||||
static void setup_job_control()
|
||||
static void setup_job_control(void)
|
||||
{
|
||||
static pid_t shell_pgrp;
|
||||
/* Loop until we are in the foreground. */
|
||||
@ -3243,7 +3256,7 @@ int hush_main(int argc, char **argv)
|
||||
|
||||
/* Initialize some more globals to non-zero values */
|
||||
set_cwd();
|
||||
#ifdef BB_FEATURE_COMMAND_EDITING
|
||||
#ifdef CONFIG_FEATURE_COMMAND_EDITING
|
||||
cmdedit_set_initial_prompt();
|
||||
#else
|
||||
PS1 = NULL;
|
||||
@ -3312,7 +3325,10 @@ int hush_main(int argc, char **argv)
|
||||
debug_printf("\ninteractive=%d\n", interactive);
|
||||
if (interactive) {
|
||||
/* Looks like they want an interactive shell */
|
||||
fprintf(stdout, "\nhush -- the humble shell v0.01 (testing)\n\n");
|
||||
#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET
|
||||
printf( "\n\n" BB_BANNER " hush - the humble shell v0.01 (testing)\n");
|
||||
printf( "Enter 'help' for a list of built-in commands.\n\n");
|
||||
#endif
|
||||
setup_job_control();
|
||||
}
|
||||
|
||||
@ -3327,7 +3343,7 @@ int hush_main(int argc, char **argv)
|
||||
input = xfopen(argv[optind], "r");
|
||||
opt = parse_file_outer(input);
|
||||
|
||||
#ifdef BB_FEATURE_CLEAN_UP
|
||||
#ifdef CONFIG_FEATURE_CLEAN_UP
|
||||
fclose(input);
|
||||
if (cwd && cwd != unknown)
|
||||
free((char*)cwd);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
||||
/*
|
||||
|
@ -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
|
||||
|
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
|
||||
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.
|
||||
|
338
tools/env/fw_env.c
vendored
338
tools/env/fw_env.c
vendored
@ -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 (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);
|
||||
}
|
||||
}
|
||||
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
|
||||
|
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
|
||||
*/
|
||||
|
||||
/*
|
||||
* 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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user