barebox/commands/barebox-update.c
Sascha Hauer bed8fb6de1 Add in-system barebox update infrastructure
Currently in-system update means to write an arbitrary file to
an arbitrary device. There is no sanity check if the flashed image
is of the right type or will fit onto the device. Furthermore some
SoCs need a special preparation step for their images before
flashing them.

This adds a barebox in-system update infrastructure. Boards can
register update handlers which know how to make the board bootable.
The available handlers can be listed to be able to select one,
different force levels give the user the chance to know it better.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
2012-10-17 20:23:41 +02:00

87 lines
2.3 KiB
C

/*
* barebox-update.c - update barebox
*
* Copyright (c) 2012 Sascha Hauer <s.hauer@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:ld:")) > 0) {
switch (opt) {
case 'd':
data.devicefile = optarg;
break;
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 update 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")
BAREBOX_CMD_HELP_SHORT("Update barebox to persistent media\n")
BAREBOX_CMD_HELP_OPT("-t <target>", "\n")
BAREBOX_CMD_HELP_OPT("-d <device>", "write image to <device> instead of handler default\n")
BAREBOX_CMD_HELP_OPT(" ", "Can be used for debugging purposes (-d /tmpfile)\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