CycloneBOOT 2.6.6
Secure Bootloader for ARM Cortex-M MCU
Loading...
Searching...
No Matches
image_format.h
Go to the documentation of this file.
1
19#ifndef _IMAGE_FORMAT_H
20#define _IMAGE_FORMAT_H
21
22#include <stdint.h>
23#include <stddef.h>
24
25// Packed structure attributes
26#if defined(_MSC_VER)
27 #define IMAGE_PACK_BEGIN __pragma(pack(push, 1))
28 #define IMAGE_PACK_END __pragma(pack(pop))
29 #define IMAGE_PACK_ATTR
30#elif defined(__GNUC__) || defined(__clang__) || defined(__ARMCC_VERSION) || \
31 defined(__CC_ARM) || defined(__IAR_SYSTEMS_ICC__) || defined(__TASKING__)
32 #define IMAGE_PACK_BEGIN
33 #define IMAGE_PACK_END
34 #define IMAGE_PACK_ATTR __attribute__((packed))
35#else
36 #define IMAGE_PACK_BEGIN
37 #define IMAGE_PACK_END
38 #define IMAGE_PACK_ATTR
39#endif
40
41// Compile-time assertion
42#if defined(__cplusplus) && (__cplusplus >= 201103L)
43 #define IMAGE_FORMAT_STATIC_ASSERT(cond, msg) static_assert(cond, msg)
44#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
45 #define IMAGE_FORMAT_STATIC_ASSERT(cond, msg) _Static_assert(cond, msg)
46#else
47 #define IMAGE_FORMAT_STATIC_ASSERT_CAT_(a, b) a ## b
48 #define IMAGE_FORMAT_STATIC_ASSERT_CAT(a, b) IMAGE_FORMAT_STATIC_ASSERT_CAT_(a, b)
49 #define IMAGE_FORMAT_STATIC_ASSERT(cond, msg) \
50 typedef char IMAGE_FORMAT_STATIC_ASSERT_CAT(image_format_static_assert_, __LINE__)[(cond) ? 1 : -1]
51#endif
52
57typedef enum
58{
59 IMAGE_TYPE_APP = 0,
60 IMAGE_TYPE_BOOT,
61 IMAGE_TYPE_NONE
62} ImageType;
63
68IMAGE_PACK_BEGIN
69typedef struct
70{
71 uint8_t major;
72 uint8_t minor;
73 uint16_t revision;
74 uint32_t buildNum;
75} IMAGE_PACK_ATTR ImageVersion;
76IMAGE_PACK_END
77
82 IMAGE_PACK_BEGIN
83typedef struct
84{
85 uint32_t headVers;
86 uint32_t imgIndex;
87 uint8_t imgType;
88 uint32_t dataPadding;
89 uint32_t dataSize;
90 uint32_t binarySize;
91 ImageVersion dataVers;
92 uint64_t imgTime;
93 uint8_t reserved[23];
94 uint8_t headCrc[4];
95} IMAGE_PACK_ATTR ImageHeader;
96IMAGE_PACK_END
97
98 IMAGE_FORMAT_STATIC_ASSERT(sizeof(ImageVersion) == 8, "ImageVersion on-flash layout changed");
99IMAGE_FORMAT_STATIC_ASSERT(offsetof(ImageVersion, major) == 0, "ImageVersion.major offset changed");
100IMAGE_FORMAT_STATIC_ASSERT(offsetof(ImageVersion, minor) == 1, "ImageVersion.minor offset changed");
101IMAGE_FORMAT_STATIC_ASSERT(offsetof(ImageVersion, revision) == 2, "ImageVersion.revision offset changed");
102IMAGE_FORMAT_STATIC_ASSERT(offsetof(ImageVersion, buildNum) == 4, "ImageVersion.buildNum offset changed");
103
104IMAGE_FORMAT_STATIC_ASSERT(sizeof(ImageHeader) == 64, "ImageHeader on-flash layout changed (must stay 64 bytes)");
105IMAGE_FORMAT_STATIC_ASSERT(offsetof(ImageHeader, headVers) == 0, "ImageHeader.headVers offset changed");
106IMAGE_FORMAT_STATIC_ASSERT(offsetof(ImageHeader, imgIndex) == 4, "ImageHeader.imgIndex offset changed");
107IMAGE_FORMAT_STATIC_ASSERT(offsetof(ImageHeader, imgType) == 8, "ImageHeader.imgType offset changed");
108IMAGE_FORMAT_STATIC_ASSERT(offsetof(ImageHeader, dataPadding) == 9, "ImageHeader.dataPadding offset changed");
109IMAGE_FORMAT_STATIC_ASSERT(offsetof(ImageHeader, dataSize) == 13, "ImageHeader.dataSize offset changed");
110IMAGE_FORMAT_STATIC_ASSERT(offsetof(ImageHeader, binarySize) == 17, "ImageHeader.binarySize offset changed");
111IMAGE_FORMAT_STATIC_ASSERT(offsetof(ImageHeader, dataVers) == 21, "ImageHeader.dataVers offset changed");
112IMAGE_FORMAT_STATIC_ASSERT(offsetof(ImageHeader, imgTime) == 29, "ImageHeader.imgTime offset changed");
113IMAGE_FORMAT_STATIC_ASSERT(offsetof(ImageHeader, reserved) == 37, "ImageHeader.reserved offset changed");
114IMAGE_FORMAT_STATIC_ASSERT(offsetof(ImageHeader, headCrc) == 60, "ImageHeader.headCrc offset changed");
115
116#endif // _IMAGE_FORMAT_H
ImageType
Image type.
Definition image_format.h:58
Image version (8 bytes)
Definition image_format.h:70
uint8_t imgType
Image type.
Definition image_format.h:87
uint32_t imgIndex
Image index.
Definition image_format.h:86
uint32_t headVers
Image header version.
Definition image_format.h:85
uint32_t dataSize
Data size (padding + firmware + optional runtime field)
Definition image_format.h:89
uint64_t imgTime
Image build time.
Definition image_format.h:92
uint32_t dataPadding
VTOR alignment padding between header and firmware.
Definition image_format.h:88
ImageVersion dataVers
Firmware version.
Definition image_format.h:91
uint32_t binarySize
Firmware size.
Definition image_format.h:90