[U-Boot] [PATCH] Add a memory get command

This command allows you to read the value of a memory address and store it in an environment variable.
Signed-off-by: Joe Hershberger joe.hershberger@ni.com --- common/cmd_mem.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
diff --git a/common/cmd_mem.c b/common/cmd_mem.c index 18f0a3f..08c7d69 100644 --- a/common/cmd_mem.c +++ b/common/cmd_mem.c @@ -32,6 +32,7 @@ #ifdef CONFIG_HAS_DATAFLASH #include <dataflash.h> #endif +#include <asm/io.h> #include <watchdog.h>
static int mod_mem(cmd_tbl_t *, int, int, int, char * const []); @@ -147,6 +148,45 @@ int do_mem_md ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return (rc); }
+#ifdef CONFIG_CMD_MEM_GET +int do_mem_mg(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + ulong addr; + int size; + char *var; + char buf[11]; + + if (argc < 3) + return CMD_RET_USAGE; + + /* Check for a size specification. + * Defaults to long if no or incorrect specification. + */ + size = cmd_get_data_size(argv[0], 4); + if (size < 0) + return 1; + + var = argv[1]; + + addr = simple_strtoul(argv[2], NULL, 16); + addr += base_address; + + if (size == 4) { + uint32_t value = readl(addr); + sprintf(buf, "0x%08x", value); + } else if (size == 2) { + uint16_t value = readw(addr); + sprintf(buf, "0x%04x", value); + } else { + uint8_t value = readb(addr); + sprintf(buf, "0x%02x", value); + } + setenv(var, buf); + + return 0; +} +#endif + int do_mem_mm ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { return mod_mem (cmdtp, 1, flag, argc, argv); @@ -1145,6 +1185,13 @@ U_BOOT_CMD( "[.b, .w, .l] address [# of objects]" );
+#ifdef CONFIG_CMD_MEM_GET +U_BOOT_CMD( + mg, 3, 1, do_mem_mg, + "memory get", + "[.b, .w, .l] variable address" +); +#endif
U_BOOT_CMD( mm, 2, 1, do_mem_mm,

On Friday 17 August 2012 16:58:41 Joe Hershberger wrote:
--- a/common/cmd_mem.c +++ b/common/cmd_mem.c
+#ifdef CONFIG_CMD_MEM_GET
not the greatest name ...
+int do_mem_mg(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
static
- size = cmd_get_data_size(argv[0], 4);
- if (size < 0)
return 1;
- var = argv[1];
- addr = simple_strtoul(argv[2], NULL, 16);
- addr += base_address;
- if (size == 4) {
uint32_t value = readl(addr);
why use io.h commands ? we don't use it with any of the other mem commands. -mike

Dear Joe Hershberger,
In message 1345237121-20594-1-git-send-email-joe.hershberger@ni.com you wrote:
This command allows you to read the value of a memory address and store it in an environment variable.
Signed-off-by: Joe Hershberger joe.hershberger@ni.com
common/cmd_mem.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)
This seems redundant to me.
We already have similar functionality in the "setexpr" command.
Instead of your "mg var $addr" you can do "setexpr var $addr | 0" today. I do agree that this looks a bit circuitous and suggest to change the "setexpr" such that in addition to the regular
setexpr [.b, .w, .l] name value1 <op> value2
syntax it will also accept
setexpr [.b, .w, .l] name value1
in which case it would set the variable "name" to the value of "value1".
What do you think?
Best regards,
Wolfgang Denk

Make setexpr accept a 2 parameter variant that will simply load a value into a variable. This is useful for loading a value from memory.
Signed-off-by: Joe Hershberger joe.hershberger@ni.com --- Changes in v2: - Replaced memory get command with option to setexpr
common/cmd_setexpr.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/common/cmd_setexpr.c b/common/cmd_setexpr.c index 1b3edb7..70133b0 100644 --- a/common/cmd_setexpr.c +++ b/common/cmd_setexpr.c @@ -57,12 +57,22 @@ int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) int w;
/* Validate arguments */ - if ((argc != 5) || (strlen(argv[3]) != 1)) + if (argc != 5 && argc != 3) + return CMD_RET_USAGE; + if (argc == 5 && strlen(argv[3]) != 1) return CMD_RET_USAGE;
w = cmd_get_data_size(argv[0], 4);
a = get_arg(argv[2], w); + + if (argc == 3) { + sprintf(buf, "%lx", a); + setenv(argv[1], buf); + + return 0; + } + b = get_arg(argv[4], w);
switch (argv[3][0]) { @@ -87,8 +97,11 @@ int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) U_BOOT_CMD( setexpr, 5, 0, do_setexpr, "set environment variable as the result of eval expression", - "[.b, .w, .l] name value1 <op> value2\n" + "[.b, .w, .l] name [*]value1 <op> [*]value2\n" " - set environment variable 'name' to the result of the evaluated\n" " express specified by <op>. <op> can be &, |, ^, +, -, *, /, %\n" - " size argument is only meaningful if value1 and/or value2 are memory addresses" + " size argument is only meaningful if value1 and/or value2 are\n" + " memory addresses (*)\n" + "setexpr[.b, .w, .l] name *value\n" + " - load a memory address into a variable" );

On Thu, Nov 01, 2012 at 04:21:14PM -0000, Joe Hershberger wrote:
Make setexpr accept a 2 parameter variant that will simply load a value into a variable. This is useful for loading a value from memory.
Signed-off-by: Joe Hershberger joe.hershberger@ni.com
Applied to u-boot/master, thanks!
participants (4)
-
Joe Hershberger
-
Mike Frysinger
-
Tom Rini
-
Wolfgang Denk