summaryrefslogtreecommitdiffstats
path: root/commands
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2011-12-11 13:48:52 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2011-12-15 11:07:15 +0100
commit1d1618a11b33f3c88b5e9f52b3b4c38199eedec0 (patch)
tree0a360b17c1af66716e3e9b70624e14b2fdce6fde /commands
parentd4e5c6b8a03d31c00084d38e40d9811267f00289 (diff)
downloadbarebox-1d1618a11b33f3c88b5e9f52b3b4c38199eedec0.tar.gz
barebox-1d1618a11b33f3c88b5e9f52b3b4c38199eedec0.tar.xz
add uimage command
The uimage command superseeds the iminfo command. Unlike the iminfo command the uimage command can also be used to verify the data crc on demand and to extract uImages to files. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'commands')
-rw-r--r--commands/Kconfig6
-rw-r--r--commands/Makefile1
-rw-r--r--commands/uimage.c108
3 files changed, 115 insertions, 0 deletions
diff --git a/commands/Kconfig b/commands/Kconfig
index 3cf2d085f3..fc37971288 100644
--- a/commands/Kconfig
+++ b/commands/Kconfig
@@ -338,6 +338,12 @@ config CMD_IMINFO
help
Show information about uImages
+config CMD_UIMAGE
+ tristate
+ prompt "uimage"
+ help
+ Show information about uImage and also extract and verify uImages.
+
config CMD_BOOTZ
tristate
default y
diff --git a/commands/Makefile b/commands/Makefile
index aa013de107..01cd1a2e74 100644
--- a/commands/Makefile
+++ b/commands/Makefile
@@ -1,5 +1,6 @@
obj-$(CONFIG_CMD_BOOTM) += bootm.o
obj-$(CONFIG_CMD_IMINFO) += iminfo.o
+obj-$(CONFIG_CMD_UIMAGE) += uimage.o
obj-$(CONFIG_CMD_LINUX16) += linux16.o
obj-$(CONFIG_CMD_LOADB) += loadb.o xyzModem.o
obj-$(CONFIG_CMD_LOADY) += loadb.o xyzModem.o
diff --git a/commands/uimage.c b/commands/uimage.c
new file mode 100644
index 0000000000..82efd78349
--- /dev/null
+++ b/commands/uimage.c
@@ -0,0 +1,108 @@
+#include <common.h>
+#include <command.h>
+#include <image.h>
+#include <libbb.h>
+#include <fcntl.h>
+#include <fs.h>
+#include <malloc.h>
+#include <errno.h>
+#include <getopt.h>
+
+static int uimage_fd;
+
+static int uimage_flush(void *buf, unsigned int len)
+{
+ int ret;
+
+ ret = write_full(uimage_fd, buf, len);
+
+ return ret;
+}
+
+static int do_uimage(struct command *cmdtp, int argc, char *argv[])
+{
+ struct uimage_handle *handle;
+ int ret;
+ int verify = 0;
+ int fd;
+ int opt;
+ char *extract = NULL;
+ int info = 0;
+ int image_no = 0;
+
+ while ((opt = getopt(argc, argv, "ve:in:")) > 0) {
+ switch (opt) {
+ case 'v':
+ verify = 1;
+ break;
+ case 'i':
+ info = 1;
+ break;
+ case 'e':
+ extract = optarg;
+ break;
+ case 'n':
+ image_no = simple_strtoul(optarg, NULL, 0);
+ break;
+ }
+ }
+
+ if (optind == argc)
+ return COMMAND_ERROR_USAGE;
+
+ handle = uimage_open(argv[optind]);
+ if (!handle)
+ return 1;
+
+ if (info) {
+ printf("Image at %s:\n", argv[optind]);
+ uimage_print_contents(handle);
+ }
+
+ if (verify) {
+ printf("verifying data crc... ");
+ ret = uimage_verify(handle);
+ if (ret) {
+ goto err;
+ printf("Bad Data CRC\n");
+ } else {
+ printf("ok\n");
+ }
+ }
+
+ if (extract) {
+ fd = open(extract, O_WRONLY | O_CREAT | O_TRUNC);
+ if (fd < 0) {
+ perror("open");
+ ret = fd;
+ goto err;
+ }
+ uimage_fd = fd;
+ ret = uimage_load(handle, image_no, uimage_flush);
+ if (ret) {
+ printf("loading uImage failed with %d\n", ret);
+ close(fd);
+ goto err;
+ }
+
+ close(fd);
+ }
+err:
+ uimage_close(handle);
+
+ return ret ? 1 : 0;
+}
+
+BAREBOX_CMD_HELP_START(uimage)
+BAREBOX_CMD_HELP_USAGE("uimage [OPTIONS] <file>\n")
+BAREBOX_CMD_HELP_OPT ("-i", "show information about image\n")
+BAREBOX_CMD_HELP_OPT ("-v", "verify image\n")
+BAREBOX_CMD_HELP_OPT ("-e <outfile>", "extract image to <outfile>\n")
+BAREBOX_CMD_HELP_OPT ("-n <no>", "use image number <no> in multifile images\n")
+BAREBOX_CMD_HELP_END
+
+BAREBOX_CMD_START(uimage)
+ .cmd = do_uimage,
+ .usage = "extract/verify uImage",
+ BAREBOX_CMD_HELP(cmd_uimage_help)
+BAREBOX_CMD_END