[PATCH] Smart autoboot
Johannes Thoma
johannes.thoma at gmx.at
Thu Apr 28 14:25:39 CEST 2011
We check if the image is a kernel image and use bootm command
to boot the OS, else we do a go.
To use this feature, #define CONFIG_SMART_AUTOBOOT in your config
and set the environment variable autostart to "yes". Then your
DHCP driver can be used to either boot a kernel image or a
u-boot application without changing anything on the target.
---
README | 5 +++++
common/cmd_net.c | 25 +++++++++++++++++++++++--
2 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/README b/README
index 4917e26..e33caf2 100644
--- a/README
+++ b/README
@@ -576,6 +576,11 @@ The following options need to be configured:
as a convenience, when switching between booting from
RAM and NFS.
+ CONFIG_SMART_AUTOBOOT
+ Check if the image is a kernel image. Then a bootm
+ command is executed, else the go command (for standalone
+ applications) is executed.
+
- Pre-Boot Commands:
CONFIG_PREBOOT
diff --git a/common/cmd_net.c b/common/cmd_net.c
index 8c6f5c8..6fa32e3 100644
--- a/common/cmd_net.c
+++ b/common/cmd_net.c
@@ -28,6 +28,12 @@
#include <command.h>
#include <net.h>
+extern int do_bootm (cmd_tbl_t *, int, int, char * const []);
+#ifdef CONFIG_SMART_AUTOBOOT
+extern int do_go (cmd_tbl_t *, int, int, char * const []);
+#endif
+
+
static int netboot_common (proto_t, cmd_tbl_t *, int , char * const []);
int do_bootp (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
@@ -212,14 +218,29 @@ netboot_common (proto_t proto, cmd_tbl_t *cmdtp, int argc, char * const argv[])
/* Loading ok, check if we should attempt an auto-start */
if (((s = getenv("autostart")) != NULL) && (strcmp(s,"yes") == 0)) {
- char *local_args[2];
+ char *local_args[3];
local_args[0] = argv[0];
local_args[1] = NULL;
printf ("Automatic boot of image at addr 0x%08lX ...\n",
load_addr);
show_boot_progress (82);
- rcode = do_bootm (cmdtp, 0, 1, local_args);
+#ifdef CONFIG_SMART_AUTOBOOT
+ if (image_get_type((void*) load_addr) == IH_TYPE_KERNEL)
+#endif
+ rcode = do_bootm (cmdtp, 0, 1, local_args);
+#ifdef CONFIG_SMART_AUTOBOOT
+ else { /* its probably a binary image, use go to start it */
+ char load_addr_as_string[17]; /* be 64-bit ready */
+
+ printf("Not a kernel image, trying standalone binary ...\n");
+ sprintf(load_addr_as_string, "%lx", load_addr);
+ local_args[0] = "go";
+ local_args[1] = load_addr_as_string;
+ local_args[2] = NULL;
+ rcode = do_go (cmdtp, 0, 2, local_args);
+ }
+#endif
}
if (rcode < 0)
--
1.6.0.4
--
NEU: FreePhone - kostenlos mobil telefonieren und surfen!
Jetzt informieren: http://www.gmx.net/de/go/freephone
More information about the U-Boot
mailing list