cmd: adding malloc, math, and strcmp u-boot commands. - malloc supports allocation of heap memory and free allocated memory via u-boot command line. - math provides math commands such as "add", "sub", "mul", "div", "shift", ability to convert dec->hex. - strcmp provides string compare command feature for a script.
All these commands are introduced to be used in u-boot scripts. Signed-off-by: Suji Velupiallai <suji.velupil...@broadcom.com> Signed-off-by: Vladimir Olovyannikov <vladimir.olovyanni...@broadcom.com> --- cmd/Kconfig | 21 ++++++++++++++ cmd/Makefile | 4 +++ cmd/malloc.c | 54 ++++++++++++++++++++++++++++++++++++ cmd/math.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++ cmd/strcmp.c | 28 +++++++++++++++++++ 5 files changed, 185 insertions(+) create mode 100644 cmd/malloc.c create mode 100644 cmd/math.c create mode 100644 cmd/strcmp.c diff --git a/cmd/Kconfig b/cmd/Kconfig index cf982ff65e..f11903fe3d 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1286,6 +1286,20 @@ config CMD_ITEST help Return true/false on integer compare. +config CMD_MALLOC + bool "malloc" + default y + help + Supports allocation of heap memory and free allocated memory commands. + These commands are used by u-boot scripts. + +config CMD_MATH + bool "math" + default y + help + Provides math commands such as add, sub, mul, div, shift, + convert decimal to hex functionalities to be available in the script. + config CMD_SOURCE bool "source" default y @@ -1301,6 +1315,13 @@ config CMD_SETEXPR Also supports loading the value at a memory location into a variable. If CONFIG_REGEX is enabled, setexpr also supports a gsub function. +config CMD_STRCMP + bool "strcmp" + default y + help + Provides string compare command feature to u-boot scripts. + + endmenu menu "Android support commands" diff --git a/cmd/Makefile b/cmd/Makefile index 2d723ea0f0..942d60a0a2 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -164,6 +164,10 @@ obj-$(CONFIG_CMD_GPT) += gpt.o obj-$(CONFIG_CMD_ETHSW) += ethsw.o obj-$(CONFIG_CMD_AXI) += axi.o +obj-$(CONFIG_CMD_MALLOC) += malloc.o +obj-$(CONFIG_CMD_MATH) += math.o +obj-$(CONFIG_CMD_STRCMP) += strcmp.o + # Power obj-$(CONFIG_CMD_PMIC) += pmic.o obj-$(CONFIG_CMD_REGULATOR) += regulator.o diff --git a/cmd/malloc.c b/cmd/malloc.c new file mode 100644 index 0000000000..e11e030a59 --- /dev/null +++ b/cmd/malloc.c @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2019 Broadcom + */ + +#include <common.h> +#include <command.h> +#include <environment.h> +#include <errno.h> +#include <malloc.h> + +static unsigned long get_value(const char *val) +{ + char *env = env_get((char *)val); + + if (env) + return simple_strtoul(env, NULL, 16); + else + return simple_strtoul(val, NULL, 16); +} + +static int do_malloc(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) +{ + char numberbuf[32]; + void *mem; + + if (argc < 3) + return cmd_usage(cmdtp); + + mem = memalign(ARCH_DMA_MINALIGN, get_value(argv[2])); + if (mem) { + sprintf(numberbuf, "%08x", (unsigned int)mem); + env_set(argv[1], numberbuf); + return 0; + } + return -EINVAL; +} + +static int do_free(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) +{ + if (argc < 2) + return cmd_usage(cmdtp); + + free((void *)get_value(argv[1])); + env_set(argv[1], ""); + return 0; +} + +U_BOOT_CMD(malloc, 3, 0, do_malloc, + "Allocate memory from u-boot heap and store pointer in environment variable.", + "target size\n"); + +U_BOOT_CMD(free, 2, 0, do_free, + "Release memory from u-boot heap at target.", "target\n"); diff --git a/cmd/math.c b/cmd/math.c new file mode 100644 index 0000000000..17de5ef70b --- /dev/null +++ b/cmd/math.c @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2010-2017 Broadcom + */ + +#include <common.h> +#include <command.h> +#include <environment.h> + +unsigned long long simple_strtoull(const char *cp, char **endp, + unsigned int base); + +static unsigned long long get_value(const char *val) +{ + char *env = env_get((char *)val); + + if (env) + return simple_strtoull(env, NULL, 16); + else + return simple_strtoull(val, NULL, 16); +} + +static unsigned long long get_value_base10(const char *val) +{ + char *env = env_get((char *)val); + + if (env) + return simple_strtoull(env, NULL, 10); + else + return simple_strtoull(val, NULL, 10); +} + +/* + * Top level addenv command + */ +#define IS_MATH_CMD(cmd, args) ((strcmp(argv[1], cmd) == 0) && \ + (argc == (args))) + +static int do_math(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + char numberbuf[32]; + unsigned long long i = 0; + + if (IS_MATH_CMD("add", 5)) + i = get_value(argv[3]) + get_value(argv[4]); + else if (IS_MATH_CMD("sub", 5)) + i = get_value(argv[3]) - get_value(argv[4]); + else if (IS_MATH_CMD("mul", 5)) + i = get_value(argv[3]) * get_value(argv[4]); + else if (IS_MATH_CMD("div", 5)) + i = get_value(argv[3]) / get_value(argv[4]); + else if (IS_MATH_CMD("shl", 5)) + i = get_value(argv[3]) << get_value(argv[4]); + else if (IS_MATH_CMD("d2h", 4)) + i = get_value_base10(argv[3]); + else + return cmd_usage(cmdtp); + + sprintf(numberbuf, "%llx", i); + env_set(argv[2], numberbuf); + return 0; +} + +U_BOOT_CMD(math, 5, 0, do_math, + "Environment variable math.", + "add a b c\n" + " - add b to c and store in a.\n" + "math sub a b c\n" + " - subtract b from c and store in a.\n" + "math mul a b c\n" + " - multiply b by c and store in a.\n" + "math div a b c\n" + " - divide b by c and store in a.\n" + "math shl a b c\n" + " - shift left b by c and store in a.\n" + "math d2h a b\n" + " - Convert b from decimal to hex and store in a.\n" +); diff --git a/cmd/strcmp.c b/cmd/strcmp.c new file mode 100644 index 0000000000..3abd270d40 --- /dev/null +++ b/cmd/strcmp.c @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2010-2017 Broadcom + */ + +#include <common.h> +#include <command.h> + +static int do_strcmp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + if (argc != 3) + return cmd_usage(cmdtp); + + if (strlen(argv[1]) != strlen(argv[2])) + return CMD_RET_FAILURE; + + /* Compare the temporary string to the given parameter */ + if (!strncmp(argv[1], argv[2], strlen(argv[2]))) + return CMD_RET_SUCCESS; + + return CMD_RET_FAILURE; +} + +U_BOOT_CMD(strcmp, 3, 0, do_strcmp, + "String to string comparison.", + "[str] [str]\n" + " - Returns true if str are same, else returns false.\n" +); -- 2.17.1 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot