From 45056aa95ec4dee6cce2a4aeb04a4c01c351b438 Mon Sep 17 00:00:00 2001 From: Daniele Lacamera Date: Tue, 27 Nov 2018 16:07:30 +0100 Subject: [PATCH] Integrated more documentation --- docs/API.md | 10 +++++++--- docs/firmware_update.md | 6 ++++-- docs/png/wolfboot_update_rollback.png | Bin 0 -> 33942 bytes 3 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 docs/png/wolfboot_update_rollback.png diff --git a/docs/API.md b/docs/API.md index aedfe3d3..a0c3630c 100644 --- a/docs/API.md +++ b/docs/API.md @@ -32,21 +32,25 @@ and - `wolfBoot_update()` is used to trigger an update upon the next reboot, and it is normally used by an update application that has retrieved a new version of the running firmware, and has stored it in the UPDATE partition on the flash. This function will set the state of the UPDATE partition -to `ST_UPDATE`, instructing the bootloader to perform the update upon the next execution (after reboot). +to `STATE_UPDATING`, instructing the bootloader to perform the update upon the next execution (after reboot). wolfBoot update process consist in swapping the content of the UPDATE and the BOOT partitions, using a temporary single-block SWAP space. +### Confirm current image + - `wolfBoot_success()` indicates a successful boot of a new firmware. This can be called by the application at any time, but it will only be effective to mark the current firmware (in the BOOT partition) with the state -`ST_SUCCESS`, indicating that no roll-back is required. An application should typically call `wolfBoot_success()` +`STATE_SUCCESS`, indicating that no roll-back is required. An application should typically call `wolfBoot_success()` only after verifying that the basic system features are up and running, including the possibility to retrieve a new firmware for the next upgrade. -If after an upgrade wolfBoot detects that the active firmware is still in `ST_TESTING` state, it means that +If after an upgrade wolfBoot detects that the active firmware is still in `STATE_TESTING` state, it means that a successful boot has not been confirmed for the application, and will attempt to revert the update by swapping the two images again. For more information about the update process, see [Firmware Update](firmware_update.md) +For the image format, see [Firmware Image](firmware_image.md) + diff --git a/docs/firmware_update.md b/docs/firmware_update.md index 79d89b03..f5e09028 100644 --- a/docs/firmware_update.md +++ b/docs/firmware_update.md @@ -13,6 +13,8 @@ The steps to follow to complete a firmware update with wolfBoot are: At any given time, an application or OS running on a wolfBoot system can receive an updated version of itself, and store the updated image in the second partition in the FLASH memory. +![Update and Rollback](png/wolfboot_update_rollback.png) + Applications or OS threads can be linked to the [libwolfboot library](API.md), which exports the API to trigger the update at the next reboot, and some helper functions to access the flash partition for erase/write through the target specific [HAL](HAL.md). @@ -27,7 +29,7 @@ After storing the new firmware image in the UPDATE partition, the application sh - Validate the new firmware image stored in the UPDATE partition - Verify the signature attached against a known public key stored in the bootloader image - Swap the content of the BOOT and the UPDATE partitions - - Mark the new firmware in the BOOT partition as in state `ST_TESTING` + - Mark the new firmware in the BOOT partition as in state `STATE_TESTING` - Boot into the newly received firmware ### Successful boot @@ -35,7 +37,7 @@ After storing the new firmware image in the UPDATE partition, the application sh Upon a successful boot, the application should inform the bootloader by calling `wolfBoot_success()`, after verifying that the system is up and running again. This operation confirms the update to a new firmware. -Failing to set the BOOT partition to `ST_SUCCESS` before the next reboot triggers a roll-back operation. +Failing to set the BOOT partition to `STATE_SUCCESS` before the next reboot triggers a roll-back operation. Roll-back is initiated by the bootloader by triggering a new update, this time starting from the backup copy of the original (pre-update) firmware, which is now stored in the UPDATE partition due to the swap occurring earlier. diff --git a/docs/png/wolfboot_update_rollback.png b/docs/png/wolfboot_update_rollback.png new file mode 100644 index 0000000000000000000000000000000000000000..fbf26137af554f3396482c8aeee1288bc612f96c GIT binary patch literal 33942 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 WziTJ7D*ZQ7eJHJj%$0oc?*9Q05cK8% literal 0 HcmV?d00001