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());
43 template<std::
size_t N, std::
size_t M>
44 constexpr auto append_N(
const blocks<N> &arr,
const blocks<M> &to_append) {
46 copy(arr.begin(), arr.end(), res.begin());
47 copy(to_append.begin(), to_append.end(), res.at(N));
54 template<std::
size_t N>
55 constexpr auto HEADER(
const blocks<N> &arr) {
56 return append(arr, 0xffffded3);
59 template<std::
size_t N>
60 constexpr auto FOOTER(
const blocks<N> &arr) {
61 return append(arr, 0xab123579);
64 template<std::
size_t N>
65 constexpr auto LAST_ITEM(
const blocks<N> &arr, uint16_t other_items_size) {
66 return append(arr, 0x000000ff + (other_items_size << 8));
69 template<std::
size_t N>
70 constexpr auto LINK(
const blocks<N> &arr,
int offset) {
71 return append(arr, offset);
75 template<std::
size_t N>
76 constexpr auto VERSION(
const blocks<N> &arr, uint16_t major, uint16_t minor) {
77 auto tmp = append(arr, 0x00000248);
78 return append(tmp, ((major << 16) | minor));
82 enum class image_type : uint32_t {
88 enum class exe_security : uint32_t {
89 UNSPECIFIED = 0u << 20,
94 enum class exe_cpu : uint32_t {
99 enum class exe_chip : uint32_t {
100 CHIP_RP2040 = 0u << 28,
101 CHIP_RP2350 = 1u << 28
104 enum class exe_tbyb : uint32_t {
109 template<std::
size_t N>
110 constexpr auto IMAGE_DEF(
const blocks<N> &arr,
const image_type type,
111 const exe_security sec,
114 const exe_tbyb tbyb = exe_tbyb::FALSE) {
115 return append(arr, 0x00000142 +
116 (uint32_t) type + (uint32_t) sec + (uint32_t) cpu +
117 (uint32_t) chip + (uint32_t) tbyb);
120 template<std::
size_t N>
121 constexpr auto LOAD_MAP_ABS(
const blocks<N> &arr,
122 const uint32_t storage_start,
123 const uint32_t runtime_start,
124 const uint32_t storage_end) {
125 auto a1 = append(arr, 0x81000406);
126 auto a2 = append(a1, storage_start);
127 auto a3 = append(a2, runtime_start);
128 auto a4 = append(a3, storage_end );