loadstone_config/
memory.rs1use serde::{Deserialize, Serialize};
2
3use crate::port::Port;
4
5#[macro_export(local_inner_macros)]
7macro_rules! KB {
8 ($val:expr) => {
9 $val * 1024
10 };
11}
12
13#[derive(Default, Debug, Clone, Serialize, Deserialize)]
16pub struct Bank {
17 pub start_address: u32,
19 pub size_kb: u32,
21}
22
23impl Bank {
24 pub fn end_address(&self) -> u32 { self.start_address + self.size_kb * 1024 }
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize)]
31pub struct InternalMemoryMap {
32 pub bootloader_location: u32,
33 pub bootloader_length_kb: u32,
34 pub banks: Vec<Bank>,
35 pub bootable_index: Option<usize>,
36}
37
38#[derive(Debug, Clone, Default, Serialize, Deserialize)]
41pub struct ExternalMemoryMap {
42 pub banks: Vec<Bank>,
43}
44
45impl Default for InternalMemoryMap {
46 fn default() -> Self {
47 Self {
48 bootloader_location: 0,
49 bootloader_length_kb: 64,
50 banks: Vec::new(),
51 bootable_index: None,
52 }
53 }
54}
55
56#[derive(Default, Clone, Serialize, Deserialize, Debug)]
60pub struct MemoryConfiguration {
61 pub internal_memory_map: InternalMemoryMap,
62 pub external_memory_map: ExternalMemoryMap,
63 pub external_flash: Option<FlashChip>,
64 pub golden_index: Option<usize>,
65}
66
67impl MemoryConfiguration {
68 pub fn bootable_address(&self) -> Option<u32> {
71 Some(
72 self.internal_memory_map
73 .banks
74 .get(self.internal_memory_map.bootable_index?)?
75 .start_address,
76 )
77 }
78}
79
80#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
82pub struct FlashChip {
83 pub name: String,
85 pub internal: bool,
87 pub start: u32,
89 pub end: u32,
91 pub region_size: u32,
93}
94
95pub fn internal_flash(port: &Port) -> FlashChip {
98 match port {
99 Port::Stm32F412 => FlashChip {
100 name: "STM32F412 MCU Flash".to_owned(),
101 internal: true,
102 start: 0x0800_0000,
103 end: 0x0810_0000,
104 region_size: KB!(16),
105 },
106 Port::Wgm160P => FlashChip {
107 name: "EFM32GG11 MCU Flash".to_owned(),
108 internal: true,
109 start: 0x0000_0000,
110 end: 512 * KB!(4),
111 region_size: KB!(4),
112 },
113 }
114}
115
116pub fn external_flash(port: &Port) -> impl Iterator<Item = FlashChip> {
119 match port {
120 Port::Stm32F412 => Some(FlashChip {
121 name: "Micron n25q128a".to_owned(),
122 internal: false,
123 start: 0x0000_0000,
124 end: 0x00FF_FFFF,
125 region_size: KB!(4),
126 })
127 .into_iter(),
128 Port::Wgm160P => None.into_iter(),
129 }
130}