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

Reply via email to