summaryrefslogtreecommitdiff
path: root/recipes/u-boot/u-boot-git/0007-cmd_setexpr-allow-memory-addresses-and-env-vars-in-e.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/u-boot/u-boot-git/0007-cmd_setexpr-allow-memory-addresses-and-env-vars-in-e.patch')
-rw-r--r--recipes/u-boot/u-boot-git/0007-cmd_setexpr-allow-memory-addresses-and-env-vars-in-e.patch93
1 files changed, 93 insertions, 0 deletions
diff --git a/recipes/u-boot/u-boot-git/0007-cmd_setexpr-allow-memory-addresses-and-env-vars-in-e.patch b/recipes/u-boot/u-boot-git/0007-cmd_setexpr-allow-memory-addresses-and-env-vars-in-e.patch
new file mode 100644
index 0000000000..10fc4735a2
--- /dev/null
+++ b/recipes/u-boot/u-boot-git/0007-cmd_setexpr-allow-memory-addresses-and-env-vars-in-e.patch
@@ -0,0 +1,93 @@
+From 0d685fe90ab92ccb9f15b7d79b1063f5b79b2dd5 Mon Sep 17 00:00:00 2001
+From: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
+Date: Thu, 25 Feb 2010 11:05:31 +0100
+Subject: [PATCH 7/7] cmd_setexpr: allow memory addresses and env vars in expressions
+
+This patch add functionality to use memory addresses and environment variables in
+expressions. This increases the power of expressions substantially
+
+It adheres to the standard convemtions: memory addresses can be given in the format
+*address (e.g. *1000), environment variables as $this_var.
+environment variables are not processed recursively but can contain both constants
+and memory addresses.
+
+Rationale for this change is that it allows masking off bits from a byte that is
+obtained by reading data from e.g. i2c.
+
+Signed-off-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
+
+---
+
+If recursive environment vars is desired: this can be added easily by changing the
+if statement into a while statement.
+I figured that would be somewhat over the top though (and, unless you take
+special precautions you can run into an endless loop if an env var contains
+its own name.
+If it is desired, please let me know and I happily will add it.
+---
+ common/cmd_setexpr.c | 31 ++++++++++++++++++++++++++++---
+ 1 files changed, 28 insertions(+), 3 deletions(-)
+
+diff --git a/common/cmd_setexpr.c b/common/cmd_setexpr.c
+index f8b5d4d..a7c6f53 100644
+--- a/common/cmd_setexpr.c
++++ b/common/cmd_setexpr.c
+@@ -28,10 +28,32 @@
+ #include <config.h>
+ #include <command.h>
+
++static ulong get_arg(char *s, int w)
++{
++ ulong *p;
++
++ /* if the parameter starts with a $ replace it with the environment value */
++ if (s[0] == '$') {
++ s = getenv(&s[1]);
++ }
++ /* if the parameter starts with a * then assume is a pointer to the value we want */
++ if (s[0] == '*') {
++ p = (ulong *)simple_strtoul(&s[1], NULL, 16);
++ switch (w) {
++ case 1: return((ulong)(*(uchar *)p));
++ case 2: return((ulong)(*(ushort *)p));
++ case 4: return(*p);
++ }
++ } else {
++ return simple_strtoul(s, NULL, 16);
++ }
++}
++
+ int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+ {
+ ulong a, b;
+ char buf[16];
++ int w;
+
+ /* Validate arguments */
+ if ((argc != 5) || (strlen(argv[3]) != 1)) {
+@@ -39,8 +61,10 @@ int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+ return 1;
+ }
+
+- a = simple_strtoul(argv[2], NULL, 16);
+- b = simple_strtoul(argv[4], NULL, 16);
++ w = cmd_get_data_size(argv[0], 4);
++
++ a = get_arg(argv[2], w);
++ b = get_arg(argv[4], w);
+
+ switch (argv[3][0]) {
+ case '|': sprintf(buf, "%lx", (a | b)); break;
+@@ -64,7 +88,8 @@ int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+ U_BOOT_CMD(
+ setexpr, 5, 0, do_setexpr,
+ "set environment variable as the result of eval expression",
+- "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 &, |, ^, +, -, *, /, %"
++ " size argument is only meaningful if value1 and/or value2 are memory addresses"
+ );
+--
+1.7.0
+