summaryrefslogtreecommitdiff
path: root/fw
diff options
context:
space:
mode:
authorxengineering <me@xengineering.eu>2025-03-30 18:41:02 +0200
committerxengineering <me@xengineering.eu>2025-03-30 18:51:33 +0200
commitf0668801d961157a61f20c9698164fb451a5d680 (patch)
treed8f541db60466a1f37ac884ead94216a570d44bb /fw
parenteb52105fd05ffc2ff98e59e76b48ae0968dfdced (diff)
downloadiot-contact-f0668801d961157a61f20c9698164fb451a5d680.tar
iot-contact-f0668801d961157a61f20c9698164fb451a5d680.tar.zst
iot-contact-f0668801d961157a61f20c9698164fb451a5d680.zip
fw: app: update: Finish first HTTP PUT /update
This adds marking the application firmware image in the secondary slot for a permanent update and rebooting the device. It is a known bug that the corresponding HTTP request is never properly closed since the device reboots while handling the request. Nevertheless the current state works and enables remote updates.
Diffstat (limited to 'fw')
-rw-r--r--fw/app/src/update.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/fw/app/src/update.c b/fw/app/src/update.c
index ff4ce6a..5e119eb 100644
--- a/fw/app/src/update.c
+++ b/fw/app/src/update.c
@@ -8,11 +8,14 @@
#include <stdint.h>
#include <zephyr/dfu/flash_img.h>
+#include <zephyr/dfu/mcuboot.h>
#include <zephyr/logging/log.h>
+#include <zephyr/logging/log_ctrl.h>
#include <zephyr/net/http/server.h>
#include <zephyr/net/http/service.h>
#include <zephyr/net/http/status.h>
#include <zephyr/storage/flash_map.h>
+#include <zephyr/sys/reboot.h>
LOG_MODULE_REGISTER(update);
@@ -74,8 +77,21 @@ static int update_handler(
LOG_ERR("Processed %zd octets but wrote %zd", processed, written);
return ret;
}
- LOG_INF("Handled update request receiving %zd octets.", processed);
+ LOG_DBG("Received %zd octets.", processed);
processed = 0;
+
+ const bool permanent = true;
+ ret = boot_request_upgrade((int)permanent);
+ if (ret < 0) {
+ LOG_ERR("Failed to mark uploaded image for update (%d)", ret);
+ return ret;
+ }
+
+ LOG_INF("New application firmware uploaded and marked for update");
+
+ LOG_INF("Rebooting to complete remote update");
+ log_flush();
+ sys_reboot(SYS_REBOOT_COLD);
}
return 0;