[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