On 06/20/2012 04:32 PM, Juergen Beisert wrote: > Many architectures support a way to detect why the bootloader is running. > This patch adds a global variable to be able to use the cause in some kind of > shell code to do special things on demand. For example to do an emergency boot, > when the last boot fails and the watchdog reactivate the hanging system. Good idea, See comments inline. Marc > Signed-off-by: Juergen Beisert > --- > common/Makefile | 2 +- > common/reset_source.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ > include/reset_source.h | 26 ++++++++++++++++++++ > 3 files changed, 89 insertions(+), 1 deletion(-) > create mode 100644 common/reset_source.c > create mode 100644 include/reset_source.h > > diff --git a/common/Makefile b/common/Makefile > index a1926d3..61eeb6b 100644 > --- a/common/Makefile > +++ b/common/Makefile > @@ -29,7 +29,7 @@ obj-$(CONFIG_CMD_BOOTM) += uimage.o > obj-y += startup.o > obj-y += misc.o > obj-y += memsize.o > -obj-$(CONFIG_GLOBALVAR) += globalvar.o > +obj-$(CONFIG_GLOBALVAR) += globalvar.o reset_source.o > obj-$(CONFIG_FILETYPE) += filetype.o > obj-y += resource.o > obj-$(CONFIG_MENU) += menu.o > diff --git a/common/reset_source.c b/common/reset_source.c > new file mode 100644 > index 0000000..19015b2 > --- /dev/null > +++ b/common/reset_source.c > @@ -0,0 +1,62 @@ > +/* > + * (C) Copyright 2012 Juergen Beisert - > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + */ > + > +#include > +#include > +#include > +#include > +#include > + > +static const char name[] = "global.system.reset"; > +static const char unknown_reset[] = "unknown"; > +static const char power_on_reset[] = "POR"; > +static const char manual_reset[] = "RST"; > +static const char watchdog[] = "WDG"; > +static const char wake[] = "WKE"; > +static const char jtag[] = "JTAG"; what about using an array static cost char *reset_reason_array[] = { [RESET_UKWN] = "unknown", ... }; > + > +void set_reset_source(unsigned source) ^^^^^^^^ enum (see below) > +{ > + switch (source) { > + case RESET_UKWN: > + setenv(name, unknown_reset); > + break; > + case RESET_POR: > + setenv(name, power_on_reset); > + break; > + case RESET_RST: > + setenv(name, manual_reset); > + break; > + case RESET_WDG: > + setenv(name, watchdog); > + break; > + case RESET_WKE: > + setenv(name, wake); > + break; > + case RESET_JTAG: > + setenv(name, jtag); > + break; if (source >= ARRAY_SIZE(reset_reason_array) return; setenv("global.system.reset", reset_reason_array[source]); > + } > +} > +EXPORT_SYMBOL(set_reset_source); > + > +/* ensure this runs after the 'global' device is already registerd */ > +static int init_reset_source(void) > +{ > + globalvar_add_simple(&name[7]); > + set_reset_source(RESET_UKWN); > + return 0; > +} > + > +coredevice_initcall(init_reset_source); > diff --git a/include/reset_source.h b/include/reset_source.h > new file mode 100644 > index 0000000..bc7e736 > --- /dev/null > +++ b/include/reset_source.h > @@ -0,0 +1,26 @@ > +/* > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + */ > + > +#ifndef __INCLUDE_RESET_SOURCE_H > +# define __INCLUDE_RESET_SOURCE_H > + > +/* possible parameters to set_reset_source() */ > +#define RESET_UKWN 0 > +#define RESET_POR 1 /* Power On Reset */ > +#define RESET_RST 2 /* generic ReST */ > +#define RESET_WDG 3 /* watchdog */ > +#define RESET_WKE 4 /* wake */ > +#define RESET_JTAG 5 use enum here > + > +extern void set_reset_source(unsigned); > + > +#endif /* __INCLUDE_RESET_SOURCE_H */ -- Pengutronix e.K. | Marc Kleine-Budde | Industrial Linux Solutions | Phone: +49-231-2826-924 | Vertretung West/Dortmund | Fax: +49-5121-206917-5555 | Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |