
Dear U-Boot community,
I wrote a small patch that checks on autoboot if the image is a kernel image and if not assumes that it is a standalone image. If the image is kernel do_bootm is used else (unconditionally) do_go is used. This is handy if you are working with test applications and kernels, since you only need to reconfigure your DHCP server and don't need to re-flash u-boot.
Since I am new to u-boot I'd like to ask if the following patch is formatted correctly (I have used git format-patch) and if there is the possiblity to add this feature to mainline UBoot.
Kind regards,
- Johannes
From c631d05e225fa3f87b0a5cad0bb033063e61018c Mon Sep 17 00:00:00 2001
From: Johannes Thoma johannes.thoma@gmx.at Date: Thu, 28 Apr 2011 14:25:39 +0200 Subject: [PATCH] Smart autoboot
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)