@@ -237,7 +237,48 @@ Where:
237
237
` image-slot-size ` is the size of the image slot.
238
238
` image-trailer-size ` is the size of the image trailer.
239
239
240
- ### [ Swap without using scratch] ( #image-swap-no-scratch )
240
+ ### [ Swap using offset (without using scratch)] ( #image-swap-offset-no-scratch )
241
+
242
+ This algorithm is an alternative to the swap-using-scratch algorithm and an
243
+ enhancement of the swap using move algorithm.
244
+ It uses an additional sector in the secondary slot to make swap possible.
245
+ The algorithm works as follows:
246
+
247
+ 1. Update image must be placed starting at the second sector in the secondary slot
248
+ 2. Copies the N-th sector from the primary slot to the N-th sector of the
249
+ secondary slot.
250
+ 3. Copies the (N+1)-th sector from the secondary slot to the N-th sector of the
251
+ primary slot.
252
+ 4. Repeats steps 2. and 3. until all the slots' sectors are swapped.
253
+
254
+ This algorithm is designed so that the lower sector of the secondary slot is
255
+ used only for allowing sectors to move down during a swap. Therefore the most
256
+ memory-size-effective slot layout is when the secondary slot is larger than
257
+ the primary slot by exactly one sector, although same-sized slots are allowed
258
+ as well. The algorithm is limited to support sectors of the same sector layout.
259
+ All slot's sectors should be of the same size. This algorithm uses 2 flags per
260
+ sector update rather than the 3 flags used by swap using move, which requires
261
+ a smaller swap status area size.
262
+
263
+ When using this algorithm the maximum image size available for the application
264
+ will be:
265
+ ```
266
+ maximum-image-size1 = N * slot-sector-size - image-trailer-sectors-size
267
+ ```
268
+
269
+ Where:
270
+ ` N ` is the number of sectors in the primary slot.
271
+ ` image-trailer-sectors-size ` is the size of the image trailer rounded up to
272
+ the total size of sectors its occupied. For instance if the image-trailer-size
273
+ is equal to 1056 B and the sector size is equal to 1024 B, then
274
+ ` image-trailer-sectors-size ` will be equal to 2048 B.
275
+
276
+ The algorithm does one erase cycle on both the primary and secondary slots
277
+ during each swap.
278
+
279
+ The algorithm is enabled using the ` MCUBOOT_SWAP_USING_OFFSET ` option.
280
+
281
+ ### [ Swap using move (without using scratch)] ( #image-swap-no-scratch )
241
282
242
283
This algorithm is an alternative to the swap-using-scratch algorithm.
243
284
It uses an additional sector in the primary slot to make swap possible.
@@ -635,7 +676,17 @@ types described above via a set of tables. These tables are reproduced below.
635
676
---
636
677
637
678
```
638
- State I
679
+ State I (swap using offset only)
680
+ | primary slot | secondary slot |
681
+ -----------------+--------------+----------------|
682
+ magic | Any | Good |
683
+ image-ok | Any | Unset |
684
+ copy-done | Any | Set |
685
+ -----------------+--------------+----------------'
686
+ result: BOOT_SWAP_TYPE_REVERT |
687
+ -------------------------------------------------'
688
+
689
+ State II
639
690
| primary slot | secondary slot |
640
691
-----------------+--------------+----------------|
641
692
magic | Any | Good |
@@ -646,7 +697,7 @@ types described above via a set of tables. These tables are reproduced below.
646
697
-------------------------------------------------'
647
698
648
699
649
- State II
700
+ State III
650
701
| primary slot | secondary slot |
651
702
-----------------+--------------+----------------|
652
703
magic | Any | Good |
@@ -657,7 +708,7 @@ types described above via a set of tables. These tables are reproduced below.
657
708
-------------------------------------------------'
658
709
659
710
660
- State III
711
+ State IV
661
712
| primary slot | secondary slot |
662
713
-----------------+--------------+----------------|
663
714
magic | Good | Any |
@@ -674,7 +725,7 @@ Otherwise, MCUboot does not attempt to swap images, resulting in one of the
674
725
other three swap types, as illustrated by State IV.
675
726
676
727
```
677
- State IV
728
+ State V
678
729
| primary slot | secondary slot |
679
730
-----------------+--------------+----------------|
680
731
magic | Any | Any |
@@ -687,7 +738,7 @@ other three swap types, as illustrated by State IV.
687
738
-------------------------------------------------'
688
739
```
689
740
690
- In State IV , when no errors occur, MCUboot will attempt to boot the contents of
741
+ In State V , when no errors occur, MCUboot will attempt to boot the contents of
691
742
the primary slot directly, and the result is ` BOOT_SWAP_TYPE_NONE ` . If the image
692
743
in the primary slot is not valid, the result is ` BOOT_SWAP_TYPE_FAIL ` . If a
693
744
fatal error occurs during boot, the result is ` BOOT_SWAP_TYPE_PANIC ` . If the
@@ -979,7 +1030,10 @@ the middle of an image swap operation. The swap status region consists of a
979
1030
series of single-byte records. These records are written independently, and
980
1031
therefore must be padded according to the minimum write size imposed by the
981
1032
flash hardware. The structure of the swap status region is illustrated below.
982
- In this figure, a min-write-size of 1 is assumed for simplicity.
1033
+ In this figure, a min-write-size of 1 is assumed for simplicity, this diagram
1034
+ shows 3 states per sector which is applicable to swap using scratch and swap
1035
+ using move, however in swap using offset mode there are only 2 states per
1036
+ sector and the overall state size required is less.
983
1037
984
1038
```
985
1039
0 1 2 3
@@ -1040,14 +1094,15 @@ values map to the above four states as follows
1040
1094
1041
1095
The swap status region can accommodate ` BOOT_MAX_IMG_SECTORS ` sector indices.
1042
1096
Hence, the size of the region, in bytes, is
1043
- ` BOOT_MAX_IMG_SECTORS * min-write-size * 3 ` . The only requirement for the index
1044
- count is that it is great enough to account for a maximum-sized image
1045
- (i.e., at least as great as the total sector count in an image slot). If a
1046
- device's image slots have been configured with ` BOOT_MAX_IMG_SECTORS: 128 ` and
1047
- use less than 128 sectors, the first record that gets written will be somewhere
1048
- in the middle of the region. For example, if a slot uses 64 sectors, the first
1049
- sector index that gets swapped is 63, which corresponds to the exact halfway
1050
- point within the region.
1097
+ ` BOOT_MAX_IMG_SECTORS * min-write-size * s ` where ` s ` is 3 for swap using
1098
+ scratch and swap using move modes, and is 2 for swap using offset mode. The
1099
+ only requirement for the index count is that it is great enough to account
1100
+ for a maximum-sized image (i.e., at least as great as the total sector count in
1101
+ an image slot). If a device's image slots have been configured with
1102
+ ` BOOT_MAX_IMG_SECTORS: 128 ` and use less than 128 sectors, the first record
1103
+ that gets written will be somewhere in the middle of the region. For example,
1104
+ if a slot uses 64 sectors, the first sector index that gets swapped is 63,
1105
+ which corresponds to the exact halfway point within the region.
1051
1106
1052
1107
---
1053
1108
*** Note***
0 commit comments