Skip to content

Commit e50b74c

Browse files
committed
Auto generate memory.x
1 parent 864d433 commit e50b74c

File tree

4 files changed

+114
-49
lines changed

4 files changed

+114
-49
lines changed

.github/workflows/ci.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ jobs:
5151
- uses: actions-rs/cargo@v1
5252
with:
5353
command: check
54-
args: --features=${{ matrix.mcu }},${{ matrix.features }} --lib --examples
54+
args: --features=${{ matrix.mcu }},ld,${{ matrix.features }} --lib --examples
5555

5656
# This is our MSRV. However this is only for documentation
5757
# purposes and should be increased if newer features are used.
@@ -70,7 +70,7 @@ jobs:
7070
- uses: actions-rs/cargo@v1
7171
with:
7272
command: check
73-
args: --features=stm32f303xc,stm32-usbd,rt,can --lib --examples
73+
args: --features=stm32f303xc,stm32-usbd,rt,can,ld --lib --examples
7474

7575
check-tests:
7676
name: Check Tests
@@ -93,7 +93,7 @@ jobs:
9393
- uses: actions-rs/cargo@v1
9494
with:
9595
command: check
96-
args: --features=rt,defmt,${{ matrix.mcu }} --test ${{ matrix.test }}
96+
args: --features=ld,defmt,${{ matrix.mcu }} --test ${{ matrix.test }}
9797

9898
clippy:
9999
name: Clippy
@@ -111,7 +111,7 @@ jobs:
111111
with:
112112
token: ${{ secrets.GITHUB_TOKEN }}
113113
args: >
114-
--features=stm32f303xc,rt,stm32-usbd,can --lib --examples
114+
--features=stm32f303xc,ld,rt,stm32-usbd,can --lib --examples
115115
-- -D warnings
116116
117117
rustfmt:

Cargo.toml

Lines changed: 45 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ default = ["unproven"]
6666
unproven = ["embedded-hal/unproven"]
6767
device-selected = []
6868
direct-call-deprecated = []
69+
ld = []
6970
rt = ["stm32f3/rt"]
7071
can = ["embedded-hal-can"]
7172

@@ -75,6 +76,14 @@ svd-f303 = ["stm32f3/stm32f303"]
7576
svd-f373 = ["stm32f3/stm32f373"]
7677
svd-f3x4 = ["stm32f3/stm32f3x4"]
7778

79+
mem-4 = []
80+
mem-6 = []
81+
mem-8 = []
82+
mem-b = []
83+
mem-c = []
84+
mem-d = []
85+
mem-e = []
86+
7887
gpio-f302 = []
7988
gpio-f303 = []
8089
gpio-f303e = []
@@ -84,40 +93,40 @@ gpio-f373 = []
8493
# Any changes here should be mirrored in README.md, src/lib.rs, and
8594
# .github/workflows/ci.yml.
8695
stm32f301 = ["svd-f301", "direct-call-deprecated"]
87-
stm32f301x6 = ["stm32f301", "gpio-f302", "device-selected"]
88-
stm32f301x8 = ["stm32f301", "gpio-f302", "device-selected"]
96+
stm32f301x6 = ["stm32f301", "mem-6", "gpio-f302", "device-selected"]
97+
stm32f301x8 = ["stm32f301", "mem-8", "gpio-f302", "device-selected"]
8998
stm32f318 = ["svd-f301", "direct-call-deprecated"]
90-
stm32f318x8 = ["stm32f318", "gpio-f302", "device-selected"]
99+
stm32f318x8 = ["stm32f318", "mem-8", "gpio-f302", "device-selected"]
91100
stm32f302 = ["svd-f302", "direct-call-deprecated"]
92-
stm32f302x6 = ["stm32f302", "gpio-f302", "device-selected"]
93-
stm32f302x8 = ["stm32f302", "gpio-f302", "device-selected"]
94-
stm32f302xb = ["stm32f302", "gpio-f303", "device-selected"]
95-
stm32f302xc = ["stm32f302", "gpio-f303", "device-selected"]
96-
stm32f302xd = ["stm32f302", "gpio-f303e", "device-selected"]
97-
stm32f302xe = ["stm32f302", "gpio-f303e", "device-selected"]
101+
stm32f302x6 = ["stm32f302", "mem-6", "gpio-f302", "device-selected"]
102+
stm32f302x8 = ["stm32f302", "mem-8", "gpio-f302", "device-selected"]
103+
stm32f302xb = ["stm32f302", "mem-b", "gpio-f303", "device-selected"]
104+
stm32f302xc = ["stm32f302", "mem-c", "gpio-f303", "device-selected"]
105+
stm32f302xd = ["stm32f302", "mem-d", "gpio-f303e", "device-selected"]
106+
stm32f302xe = ["stm32f302", "mem-e", "gpio-f303e", "device-selected"]
98107
stm32f303 = ["svd-f303", "direct-call-deprecated"]
99-
stm32f303x6 = ["stm32f303", "gpio-f333", "device-selected"]
100-
stm32f303x8 = ["stm32f303", "gpio-f333", "device-selected"]
101-
stm32f303xb = ["stm32f303", "gpio-f303", "device-selected"]
102-
stm32f303xc = ["stm32f303", "gpio-f303", "device-selected"]
103-
stm32f303xd = ["stm32f303", "gpio-f303e", "device-selected"]
104-
stm32f303xe = ["stm32f303", "gpio-f303e", "device-selected"]
108+
stm32f303x6 = ["stm32f303", "mem-6", "gpio-f333", "device-selected"]
109+
stm32f303x8 = ["stm32f303", "mem-8", "gpio-f333", "device-selected"]
110+
stm32f303xb = ["stm32f303", "mem-b", "gpio-f303", "device-selected"]
111+
stm32f303xc = ["stm32f303", "mem-c", "gpio-f303", "device-selected"]
112+
stm32f303xd = ["stm32f303", "mem-d", "gpio-f303e", "device-selected"]
113+
stm32f303xe = ["stm32f303", "mem-e", "gpio-f303e", "device-selected"]
105114
stm32f328 = ["svd-f303", "direct-call-deprecated"]
106-
stm32f328x8 = ["stm32f328", "gpio-f333", "device-selected"]
115+
stm32f328x8 = ["stm32f328", "mem-8", "gpio-f333", "device-selected"]
107116
stm32f358 = ["svd-f303", "direct-call-deprecated"]
108-
stm32f358xc = ["stm32f358", "gpio-f303", "device-selected"]
117+
stm32f358xc = ["stm32f358", "mem-c", "gpio-f303", "device-selected"]
109118
stm32f398 = ["svd-f303", "direct-call-deprecated"]
110-
stm32f398xe = ["stm32f398", "gpio-f303e", "device-selected"]
119+
stm32f398xe = ["stm32f398", "mem-e", "gpio-f303e", "device-selected"]
111120
stm32f373 = ["svd-f373", "direct-call-deprecated"]
112-
stm32f373x8 = ["stm32f373", "gpio-f373", "device-selected"]
113-
stm32f373xb = ["stm32f373", "gpio-f373", "device-selected"]
114-
stm32f373xc = ["stm32f373", "gpio-f373", "device-selected"]
121+
stm32f373x8 = ["stm32f373", "mem-8", "gpio-f373", "device-selected"]
122+
stm32f373xb = ["stm32f373", "mem-b", "gpio-f373", "device-selected"]
123+
stm32f373xc = ["stm32f373", "mem-c", "gpio-f373", "device-selected"]
115124
stm32f378 = ["svd-f373", "direct-call-deprecated"]
116-
stm32f378xc = ["stm32f378", "gpio-f373", "device-selected"]
125+
stm32f378xc = ["stm32f378", "mem-c", "gpio-f373", "device-selected"]
117126
stm32f334 = ["svd-f3x4", "direct-call-deprecated"]
118-
stm32f334x4 = ["stm32f334", "gpio-f333", "device-selected"]
119-
stm32f334x6 = ["stm32f334", "gpio-f333", "device-selected"]
120-
stm32f334x8 = ["stm32f334", "gpio-f333", "device-selected"]
127+
stm32f334x4 = ["stm32f334", "mem-4", "gpio-f333", "device-selected"]
128+
stm32f334x6 = ["stm32f334", "mem-6", "gpio-f333", "device-selected"]
129+
stm32f334x8 = ["stm32f334", "mem-8", "gpio-f333", "device-selected"]
121130

122131
defmt-default = ["defmt"]
123132
defmt-trace = ["defmt"]
@@ -137,45 +146,45 @@ opt-level = "s"
137146

138147
[[example]]
139148
name = "pwm"
140-
required-features = ["stm32f303xc"]
149+
required-features = ["ld", "stm32f303xc"]
141150

142151
[[example]]
143152
name = "toggle"
144-
required-features = ["rt", "stm32f303xc"]
153+
required-features = ["ld", "stm32f303xc"]
145154

146155
[[example]]
147156
name = "usb_serial"
148-
required-features = ["rt", "stm32f303xc", "stm32-usbd"]
157+
required-features = ["ld", "stm32f303xc", "stm32-usbd"]
149158

150159
[[example]]
151160
name = "spi"
152-
required-features = ["stm32f303"]
161+
required-features = ["ld", "stm32f303"]
153162

154163
[[example]]
155164
name = "can"
156-
required-features = ["rt", "can", "stm32f303"]
165+
required-features = ["ld", "can", "stm32f303"]
157166

158167
[[example]]
159168
name = "serial_dma"
160-
required-features = ["stm32f303"]
169+
required-features = ["ld", "stm32f303"]
161170

162171
[[example]]
163172
name = "adc"
164-
required-features = ["stm32f303"]
173+
required-features = ["ld", "stm32f303"]
165174

166175
[[example]]
167176
name = "i2c_scanner"
168-
required-features = ["stm32f303xc"]
177+
required-features = ["ld", "stm32f303xc"]
169178

170179
[[example]]
171180
name = "gpio_erased"
172-
required-features = ["rt", "stm32f303xc"]
181+
required-features = ["ld", "stm32f303xc"]
173182

174183
[[example]]
175184
name = "gpio_interrupts"
176-
required-features = ["rt", "stm32f303xc"]
185+
required-features = ["ld", "rt", "stm32f303xc"]
177186

178187
[[test]]
179188
name = "rcc"
180-
required-features = ["rt", "defmt"]
189+
required-features = ["ld", "defmt"]
181190
harness = false

build.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
use std::{env, fs::File, io::prelude::*, path::PathBuf};
2+
3+
fn main() {
4+
if cfg!(feature = "ld") {
5+
gen_memory_x();
6+
}
7+
println!("cargo:rerun-if-changed=build.rs");
8+
}
9+
10+
fn gen_memory_x() {
11+
#![allow(clippy::unneeded_wildcard_pattern)]
12+
13+
let mem_cfg_set = (
14+
cfg!(feature = "mem-4"),
15+
cfg!(feature = "mem-6"),
16+
cfg!(feature = "mem-8"),
17+
cfg!(feature = "mem-b"),
18+
cfg!(feature = "mem-c"),
19+
cfg!(feature = "mem-d"),
20+
cfg!(feature = "mem-e"),
21+
);
22+
let flash = match mem_cfg_set {
23+
(true, ..) => 16,
24+
(_, true, ..) => 32,
25+
(_, _, true, ..) => 64,
26+
(.., true, _, _, _) => 128,
27+
(.., _, true, _, _) => 256,
28+
(.., _, _, true, _) => 384,
29+
(.., _, _, _, true) => 512,
30+
_ => unreachable!(),
31+
};
32+
let ccmram = if cfg!(feature = "svd-f303") || cfg!(feature = "svd-f3x4") {
33+
match mem_cfg_set {
34+
(true, ..) | (_, true, ..) | (_, _, true, ..) => 4,
35+
(.., true, _, _, _) | (.., _, true, _, _) => 8,
36+
(.., _, _, true, _) | (.., _, _, _, true) => 16,
37+
_ => unreachable!(),
38+
}
39+
} else {
40+
0
41+
};
42+
let ram = match mem_cfg_set {
43+
(true, ..) | (_, true, ..) | (_, _, true, ..) => 16,
44+
(.., true, _, _, _) if cfg!(feature = "svd-f373") => 24,
45+
(.., true, _, _, _) if cfg!(feature = "svd-f302") => 32,
46+
(.., _, true, _, _) if cfg!(feature = "svd-f373") => 32,
47+
(.., true, _, _, _) if cfg!(feature = "svd-f303") => 40,
48+
(.., _, true, _, _) if cfg!(feature = "svd-f302") => 40,
49+
(.., _, true, _, _) if cfg!(feature = "svd-f303") => 48,
50+
(.., _, _, true, _) | (.., _, _, _, true) if cfg!(feature = "svd-f302") => 64,
51+
(.., _, _, true, _) | (.., _, _, _, true) if cfg!(feature = "svd-f303") => 80,
52+
_ => unreachable!(),
53+
} - ccmram;
54+
55+
let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap());
56+
let mut file = File::create(out_dir.join("memory.x")).unwrap();
57+
writeln!(file, "MEMORY {{").unwrap();
58+
writeln!(file, " FLASH (rx) : o = 0x8000000, l = {}K", flash).unwrap();
59+
if ccmram > 0 {
60+
writeln!(file, " CCMRAM (rwx) : o = 0x10000000, l = {}K", ccmram).unwrap();
61+
}
62+
writeln!(file, " RAM (rwx) : o = 0x20000000, l = {}K", ram).unwrap();
63+
writeln!(file, "}}").unwrap();
64+
println!("cargo:rustc-link-search={}", out_dir.display());
65+
}

memory.x

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)