14#ifndef _BOOT_BLOCKS_H_
15#define _BOOT_BLOCKS_H_
26 template<std::
size_t Size>
27 using blocks = std::array<uint32_t, Size>;
29 constexpr auto copy(
const uint32_t *start,
const uint32_t *end, uint32_t *dst) {
35 template<std::
size_t N>
36 constexpr auto append(
const blocks<N> &arr,
const uint32_t val) {
38 copy(arr.begin(), arr.end(), res.begin());
45 template<std::
size_t N>
46 constexpr auto HEADER(
const blocks<N> &arr) {
47 return append(arr, 0xffffded3);
50 template<std::
size_t N>
51 constexpr auto FOOTER(
const blocks<N> &arr) {
52 return append(arr, 0xab123579);
55 template<std::
size_t N>
56 constexpr auto LAST_ITEM(
const blocks<N> &arr, uint16_t other_items_size) {
57 return append(arr, 0x000000ff + (other_items_size << 8));
60 template<std::
size_t N>
61 constexpr auto LINK(
const blocks<N> &arr,
int offset) {
62 return append(arr, offset);
66 template<std::
size_t N>
67 constexpr auto VERSION(
const blocks<N> &arr, uint16_t major, uint16_t minor) {
68 auto tmp = append(arr, 0x00000248);
69 return append(tmp, ((major << 16) | minor));
73 enum class image_type : uint32_t {
79 enum class exe_security : uint32_t {
80 UNSPECIFIED = 0u << 20,
85 enum class exe_cpu : uint32_t {
90 enum class exe_chip : uint32_t {
91 CHIP_RP2040 = 0u << 28,
92 CHIP_RP2350 = 1u << 28
95 enum class exe_tbyb : uint32_t {
100 template<std::
size_t N>
101 constexpr auto IMAGE_DEF(
const blocks<N> &arr,
const image_type type,
102 const exe_security sec,
105 const exe_tbyb tbyb = exe_tbyb::FALSE) {
106 return append(arr, 0x00000142 + (uint32_t) type + (uint32_t) sec +
107 (uint32_t) cpu + (uint32_t) chip +