9
0
Fork 0

* 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:
wdenk 2003-01-11 09:48:40 +00:00
parent a25f862ba8
commit d0fb80c302
13 changed files with 341 additions and 171 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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 (;;) {

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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
/* /*

View File

@ -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
View File

@ -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.

338
tools/env/fw_env.c vendored
View File

@ -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,56 +578,52 @@ 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,
if (parse_config()) /* should fill envdevices */ "Not enough memory for environment (%ld bytes)\n",
return 1; ENV_SIZE);
return (errno);
if ((addr1 = calloc (1, ENV_SIZE)) == NULL) { }
fprintf (stderr,
"Not enough memory for environment (%ld bytes)\n", /* read environment from FLASH to local buffer */
ENV_SIZE); environment.data = addr1;
return (errno); curdev = 0;
} if (flash_io (O_RDONLY)) {
return (errno);
/* read environment from FLASH to local buffer */ }
environment.data = addr1;
curdev = 0; crc1_ok = ((crc1 = crc32(0, environment.data, ENV_SIZE))
if (flash_io (O_RDONLY)) { == environment.crc);
return (errno); if (!HaveRedundEnv) {
}
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;
if (flash_io (O_RDONLY)) { if (flash_io (O_RDONLY)) {
return (errno); return (errno);
} }
crc2_ok = ((crc2 = crc32(0, environment.data, ENV_SIZE)) crc2_ok = ((crc2 = crc32(0, environment.data, ENV_SIZE))
== environment.crc); == environment.crc);
flag2 = environment.flags; flag2 = environment.flags;
@ -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)
fprintf (stderr, /* Fills in DEVNAME(), ENVSIZE(), DEVESIZE(). Or don't. */
"Cannot access MTD device %s: %s\n", if (get_config(CONFIG_FILE)) {
DEVICE1_NAME, strerror(errno)); fprintf (stderr,
"Cannot parse config file: %s\n",
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
View 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
View File

@ -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