radio_tool 0.2.1
Loading...
Searching...
No Matches
flash.hpp
1
18#pragma once
19
20#include <vector>
21#include <optional>
22#include <iomanip>
23#include <functional>
24#include <algorithm>
25
26#include <stdint.h>
27
29{
31 {
32 public:
33 FlashSector(const uint16_t &idx, const uint32_t &sector_start, const uint32_t &sector_size)
34 : index(idx), start(sector_start), size(sector_size) {}
35
39 const uint16_t index;
40
44 const uint32_t start;
45
49 const uint32_t size;
50
54 constexpr auto End() const -> uint32_t
55 {
56 return start + size;
57 }
58
62 constexpr auto InSector(const uint32_t &addr) const -> bool
63 {
64 return addr >= start && addr < End();
65 }
66
70 auto ToString() const -> const std::string
71 {
72 std::stringstream out;
73 out << "FlashSector[Index=" << index
74 << ", Start=0x" << std::setw(8) << std::setfill('0') << std::hex << start
75 << ", End=0x" << std::setw(8) << std::setfill('0') << std::hex << End()
76 << "]";
77
78 return out.str();
79 }
80 };
81
82
83 typedef std::vector<FlashSector> FlashMap;
84
86 {
87 public:
91 static auto GetSector(const FlashMap &map, const uint32_t &addr) -> std::optional<const FlashSector>
92 {
93 for (const auto &sec : map)
94 {
95 if (sec.InSector(addr))
96 {
97 return sec;
98 }
99 }
100 return {};
101 }
102
106 static auto MakeSimpleLayout(const uint32_t& start_addr, const uint32_t& sector_size, const uint16_t& sectors) -> FlashMap
107 {
108 auto ret = FlashMap();
109 for(auto x = 0; x < sectors; x++)
110 {
111 ret.push_back(FlashSector(x, start_addr + (sector_size * x), sector_size));
112 }
113 return ret;
114 }
115
119 static auto AlignedContiguousMemoryOp(const FlashMap& map, const uint32_t& start, const uint32_t& end,
120 const std::function<void(const uint32_t&, const uint32_t&, const FlashSector&)>& fnOp) -> void
121 {
122 for (auto addr = start; addr < end;)
123 {
124 if(const auto& sec_info = flash::FlashUtil::GetSector(map, addr))
125 {
126 auto n_bytes = std::min(end, sec_info->End()) - addr;
127
128 fnOp(addr, n_bytes, sec_info.value());
129
130 addr += n_bytes;
131 }
132 else
133 {
134 break; //unmapped region
135 }
136 }
137 }
138 };
139
143 const FlashMap STM32F40X = {
144 {0, 0x08000000, 0x4000}, /* 16k */
145 {1, 0x08004000, 0x4000},
146 {2, 0x08008000, 0x4000},
147 {3, 0x0800c000, 0x4000},
148 {4, 0x08010000, 0x10000}, /* 64k */
149 {5, 0x08020000, 0x20000}, /* 128k */
150 {6, 0x08040000, 0x20000},
151 {7, 0x08060000, 0x20000},
152 {8, 0x08080000, 0x20000},
153 {9, 0x080a0000, 0x20000},
154 {10, 0x080c0000, 0x20000},
155 {11, 0x080e0000, 0x20000}
156 };
157
167 const FlashMap W25Q128JV = FlashUtil::MakeSimpleLayout(0x00, 0x10000, 0x100);
168
176 const FlashMap M25P16 = FlashUtil::MakeSimpleLayout(0x00, 0x10000, 0x20);
177
178} // namespace radio_tool::flash
constexpr auto InSector(const uint32_t &addr) const -> bool
Definition: flash.hpp:62
auto ToString() const -> const std::string
Definition: flash.hpp:70
constexpr auto End() const -> uint32_t
Definition: flash.hpp:54
static auto AlignedContiguousMemoryOp(const FlashMap &map, const uint32_t &start, const uint32_t &end, const std::function< void(const uint32_t &, const uint32_t &, const FlashSector &)> &fnOp) -> void
Definition: flash.hpp:119
static auto GetSector(const FlashMap &map, const uint32_t &addr) -> std::optional< const FlashSector >
Definition: flash.hpp:91
static auto MakeSimpleLayout(const uint32_t &start_addr, const uint32_t &sector_size, const uint16_t &sectors) -> FlashMap
Definition: flash.hpp:106
const FlashMap M25P16
Definition: flash.hpp:176
const FlashMap W25Q128JV
Definition: flash.hpp:167
const FlashMap STM32F40X
Definition: flash.hpp:143