[PATCH 1/3] Add barebox update infrastructure
Jan Weitzel
J.Weitzel at phytec.de
Fri Sep 14 08:15:46 EDT 2012
Am Freitag, den 14.09.2012, 09:45 +0200 schrieb Sascha Hauer:
> Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
> ---
> commands/Kconfig | 5 +++
> commands/Makefile | 1 +
> commands/barebox-update.c | 80 +++++++++++++++++++++++++++++++++
> common/Kconfig | 3 ++
> common/Makefile | 1 +
> common/bbu.c | 110 +++++++++++++++++++++++++++++++++++++++++++++
> include/bbu.h | 37 +++++++++++++++
> 7 files changed, 237 insertions(+)
> create mode 100644 commands/barebox-update.c
> create mode 100644 common/bbu.c
> create mode 100644 include/bbu.h
>
> diff --git a/commands/Kconfig b/commands/Kconfig
> index f2756cc..0ed0d69 100644
> --- a/commands/Kconfig
> +++ b/commands/Kconfig
> @@ -470,6 +470,11 @@ config CMD_OFTREE
> prompt "oftree"
> select FDT
>
> +config CMD_BAREBOX_UPDATE
> + tristate
> + select BAREBOX_UPDATE
> + prompt "barebox-update"
> +
> endmenu
>
> config CMD_TIMEOUT
> diff --git a/commands/Makefile b/commands/Makefile
> index ccebd7f..62762de 100644
> --- a/commands/Makefile
> +++ b/commands/Makefile
> @@ -74,3 +74,4 @@ obj-$(CONFIG_CMD_BASENAME) += basename.o
> obj-$(CONFIG_CMD_DIRNAME) += dirname.o
> obj-$(CONFIG_CMD_READLINK) += readlink.o
> obj-$(CONFIG_CMD_LN) += ln.o
> +obj-$(CONFIG_CMD_BAREBOX_UPDATE)+= barebox-update.o
> diff --git a/commands/barebox-update.c b/commands/barebox-update.c
> new file mode 100644
> index 0000000..db8ae7d
> --- /dev/null
> +++ b/commands/barebox-update.c
> @@ -0,0 +1,80 @@
> +/*
> + * barebox-update.c - update barebox
> + *
> + * Copyright (c) 2012 Sascha Hauer <s.hauer at pengutronix.de>, Pengutronix
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2
> + * as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + */
> +#include <common.h>
> +#include <command.h>
> +#include <getopt.h>
> +#include <malloc.h>
> +#include <errno.h>
> +#include <bbu.h>
> +#include <fs.h>
> +
> +static int do_barebox_update(int argc, char *argv[])
> +{
> + int opt, ret;
> + struct bbu_data data = {};
> +
> + while ((opt = getopt(argc, argv, "t:yf:l")) > 0) {
> + switch (opt) {
> + case 'f':
> + data.force = simple_strtoul(optarg, NULL, 0);
> + data.flags |= BBU_FLAG_FORCE;
> + break;
> + case 't':
> + data.handler_name = optarg;
> + break;
> + case 'y':
> + data.flags |= BBU_FLAG_YES;
> + break;
> + case 'l':
> + printf("registered handlers:\n");
> + bbu_handlers_list();
> + return 0;
> + default:
> + return COMMAND_ERROR_USAGE;
> + }
> + }
> +
> + if (!(argc - optind))
> + return COMMAND_ERROR_USAGE;
> +
> + data.imagefile = argv[optind];
> +
> + data.image = read_file(data.imagefile, &data.len);
> + if (!data.image)
> + return -errno;
> +
> + ret = barebox_update(&data);
> +
> + free(data.image);
> +
> + return ret;
> +}
> +
> +BAREBOX_CMD_HELP_START(barebox_update)
> +BAREBOX_CMD_HELP_USAGE("barebox_update [OPTIONS <image>]\n")
image is mandatory
> +BAREBOX_CMD_HELP_OPT("-t <target>", "\n")
> +BAREBOX_CMD_HELP_OPT("-y\t", "yes. Do not ask for confirmation\n")
> +BAREBOX_CMD_HELP_OPT("-f <level>", "Set force level\n")
> +BAREBOX_CMD_HELP_OPT("-l\t", "list registered targets\n")
> +BAREBOX_CMD_HELP_END
> +
> +BAREBOX_CMD_START(barebox_update)
> + .cmd = do_barebox_update,
> + .usage = "update barebox",
> + BAREBOX_CMD_HELP(cmd_barebox_update_help)
> +BAREBOX_CMD_END
> diff --git a/common/Kconfig b/common/Kconfig
> index b97392c..a6f6c0f 100644
> --- a/common/Kconfig
> +++ b/common/Kconfig
> @@ -58,6 +58,9 @@ config GLOBALVAR
> config STDDEV
> bool
>
> +config BAREBOX_UPDATE
> + bool
> +
> menu "General Settings "
>
> config LOCALVERSION
> diff --git a/common/Makefile b/common/Makefile
> index df9f301..07c422a 100644
> --- a/common/Makefile
> +++ b/common/Makefile
> @@ -37,6 +37,7 @@ obj-$(CONFIG_MENU) += menu.o
> obj-$(CONFIG_PASSWORD) += password.o
> obj-$(CONFIG_MODULES) += module.o
> obj-$(CONFIG_FLEXIBLE_BOOTARGS) += bootargs.o
> +obj-$(CONFIG_BAREBOX_UPDATE) += bbu.o
> extra-$(CONFIG_MODULES) += module.lds
>
> ifdef CONFIG_DEFAULT_ENVIRONMENT
> diff --git a/common/bbu.c b/common/bbu.c
> new file mode 100644
> index 0000000..928c34b
> --- /dev/null
> +++ b/common/bbu.c
> @@ -0,0 +1,110 @@
> +/*
> + * bbu.c - barebox update functions
> + *
> + * Copyright (c) 2012 Sascha Hauer <s.hauer at pengutronix.de>, Pengutronix
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2
> + * as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + */
> +#include <common.h>
> +#include <bbu.h>
> +#include <linux/list.h>
> +#include <errno.h>
> +#include <readkey.h>
> +
> +static LIST_HEAD(bbu_image_handlers);
> +
> +int bbu_force(struct bbu_data *data, const char *fmt, ...)
> +{
> + va_list args;
> +
> + printf("UPDATE: ");
> +
> + va_start(args, fmt);
> +
> + vprintf(fmt, args);
> +
> + va_end(args);
> +
> + if (!(data->flags & BBU_FLAG_FORCE))
> + goto out;
> +
> + if (!data->force)
> + goto out;
> +
> + data->force--;
> +
> + printf(" (forced)\n");
> +
> + return 1;
> +out:
> + printf("\n");
> +
> + return 0;
> +}
> +
> +int bbu_confirm(struct bbu_data *data)
> +{
> + int key;
> +
> + if (data->flags & BBU_FLAG_YES)
> + return 1;
> +
> + printf("update barebox from %s to %s (y/n)?\n",
> + data->imagefile, data->handler_name);
> +
> + key = read_key();
> + if (key == 'y')
> + return 1;
> + return 0;
> +}
> +
> +int barebox_update(struct bbu_data *data)
> +{
> + struct bbu_handler *handler;
> + int ret;
> +
> + list_for_each_entry(handler, &bbu_image_handlers, list) {
> + if (!data->handler_name) {
> + if (handler->flags & BBU_HANDLER_FLAG_DEFAULT) {
> + data->handler_name = handler->name;
> + goto found;
> + }
> + continue;
> + }
> + if (!strcmp(handler->name, data->handler_name))
> + goto found;
> + }
> +
> + return -ENODEV;
> +
> +found:
> +
> + ret = handler->handler(handler, data);
> + return ret;
> +}
> +
> +void bbu_handlers_list(void)
> +{
> + struct bbu_handler *handler;
> +
> + list_for_each_entry(handler, &bbu_image_handlers, list)
> + printf("%s%s\n", handler->name,
> + handler->flags & BBU_HANDLER_FLAG_DEFAULT ?
> + " (default)" : "");
> +}
> +
> +int bbu_register_handler(struct bbu_handler *handler)
> +{
> + list_add_tail(&handler->list, &bbu_image_handlers);
> + return 0;
> +}
> diff --git a/include/bbu.h b/include/bbu.h
> new file mode 100644
> index 0000000..ce1a608
> --- /dev/null
> +++ b/include/bbu.h
> @@ -0,0 +1,37 @@
> +#ifndef __INCLUDE_BBU_H
> +#define __INCLUDE_BBU_H
> +
> +struct bbu_data {
> +#define BBU_FLAG_FORCE (1 << 0)
> +#define BBU_FLAG_YES (1 << 1)
> + unsigned long flags;
> + int force;
> + void *image;
> + const char *imagefile;
> + size_t len;
> + const char *handler_name;
> +};
> +
> +struct bbu_handler {
> + int (*handler)(struct bbu_handler *, struct bbu_data *);
> + void *handler_data;
> + const char *name;
> + struct list_head list;
> +#define BBU_HANDLER_FLAG_DEFAULT (1 << 0)
> + unsigned long flags;
> +};
> +
> +int bbu_force(struct bbu_data *, const char *fmt, ...)
> + __attribute__ ((format(__printf__, 2, 3)));
> +
> +int bbu_confirm(struct bbu_data *);
> +
> +int bbu_register_handler(struct bbu_handler *);
> +
> +int barebox_update(struct bbu_data *);
> +
> +int barebox_arm_update(struct bbu_handler *, struct bbu_data *data);
> +
> +void bbu_handlers_list(void);
> +
> +#endif /* __INCLUDE_BBU_H */
More information about the barebox
mailing list