Add handler to write images using flashcp. Used to update barebox on at91 based board with dataflash.
Signed-off-by: Ladislav Michl <la...@linux-mips.org> --- src/update_handler.c | 72 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/src/update_handler.c b/src/update_handler.c index 0415c92..8385096 100644 --- a/src/update_handler.c +++ b/src/update_handler.c @@ -497,6 +497,42 @@ out: return res; } +static gboolean flash_write_slot(const gchar *image, const gchar *device, GError **error) +{ + g_autoptr(GSubprocess) sproc = NULL; + GError *ierror = NULL; + gboolean res = FALSE; + g_autoptr(GPtrArray) args = g_ptr_array_new_full(5, g_free); + + g_ptr_array_add(args, g_strdup("flashcp")); + g_ptr_array_add(args, g_strdup(image)); + g_ptr_array_add(args, g_strdup(device)); + g_ptr_array_add(args, NULL); + + r_debug_subprocess(args); + sproc = g_subprocess_newv((const gchar * const *)args->pdata, + G_SUBPROCESS_FLAGS_NONE, &ierror); + if (sproc == NULL) { + g_propagate_prefixed_error( + error, + ierror, + "failed to start flashcp: "); + goto out; + } + + res = g_subprocess_wait_check(sproc, NULL, &ierror); + if (!res) { + g_propagate_prefixed_error( + error, + ierror, + "failed to run flashcp: "); + goto out; + } + +out: + return res; +} + static gboolean nand_format_slot(const gchar *device, GError **error) { g_autoptr(GSubprocess) sproc = NULL; @@ -1046,6 +1082,41 @@ out: return res; } +static gboolean img_to_flash_handler(RaucImage *image, RaucSlot *dest_slot, const gchar *hook_name, GError **error) +{ + GError *ierror = NULL; + gboolean res = FALSE; + + /* run slot pre install hook if enabled */ + if (hook_name && image->hooks.pre_install) { + res = run_slot_hook(hook_name, R_SLOT_HOOK_PRE_INSTALL, NULL, dest_slot, &ierror); + if (!res) { + g_propagate_error(error, ierror); + goto out; + } + } + + /* write */ + g_message("writing slot device %s", dest_slot->device); + res = flash_write_slot(image->filename, dest_slot->device, &ierror); + if (!res) { + g_propagate_error(error, ierror); + goto out; + } + + /* run slot post install hook if enabled */ + if (hook_name && image->hooks.post_install) { + res = run_slot_hook(hook_name, R_SLOT_HOOK_POST_INSTALL, NULL, dest_slot, &ierror); + if (!res) { + g_propagate_error(error, ierror); + goto out; + } + } + +out: + return res; +} + static gboolean img_to_nand_handler(RaucImage *image, RaucSlot *dest_slot, const gchar *hook_name, GError **error) { GError *ierror = NULL; @@ -1496,6 +1567,7 @@ RaucUpdatePair updatepairs[] = { {"*.ubifs", "ubivol", img_to_ubivol_handler}, {"*.ubifs", "ubifs", img_to_ubifs_handler}, {"*.img", "ext4", img_to_fs_handler}, + {"*.img", "flash", img_to_flash_handler}, {"*.img", "nand", img_to_nand_handler}, {"*.img", "ubifs", img_to_ubifs_handler}, {"*.img", "ubivol", img_to_ubivol_handler}, -- 2.24.0 _______________________________________________ RAUC mailing list