Skip to content

Commit 3faa011

Browse files
committed
device-selected to build-rs
1 parent fd2855a commit 3faa011

File tree

5 files changed

+106
-115
lines changed

5 files changed

+106
-115
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1919

2020
### Changed
2121

22+
- Check features enabled in `build-rs`
2223
- bump embedded-hal to `1.0-rc2`
2324
- Use `as_ptr` for register address casting
2425
- Updated `synopsys-usb-otg` to `0.4.0`

Cargo.toml

Lines changed: 55 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ systick-monotonic = { version = "1.0", optional = true }
4949
enumflags2 = "0.7.8"
5050
embedded-storage = "0.3"
5151
vcell = "0.1.3"
52+
document-features = "0.2"
5253

5354
[dependencies.time]
5455
version = "0.3.14"
@@ -94,27 +95,30 @@ default-features = false
9495
features = ["macros"]
9596

9697
[features]
97-
device-selected = []
98-
rt = [] # deprecated
98+
#! Use one of the supported STM32-serie related features:
99+
#! `stm32f401`, `stm32f405`, `stm32f407`, `stm32f415`, `stm32f417`, `stm32f410`,
100+
#! `stm32f411`, `stm32f412`, `stm32f413`, `stm32f423`, `stm32f427`, `stm32f429`,
101+
#! `stm32f437`, `stm32f439`, `stm32f446`, `stm32f469`, `stm32f479`.
102+
99103
# Note: stm32f4 has only one feature for some very similar device families,
100104
# so it's intended for e.g. stm32f405/415 to both enable stm32f4/stm32f405.
101-
stm32f401 = ["stm32f4/stm32f401", "device-selected", "gpio-f401",]
102-
stm32f405 = ["stm32f4/stm32f405", "device-selected", "gpio-f417"]
103-
stm32f407 = ["stm32f4/stm32f407", "device-selected", "gpio-f417"]
104-
stm32f415 = ["stm32f4/stm32f405", "device-selected", "gpio-f417", "cryp"]
105-
stm32f417 = ["stm32f4/stm32f407", "device-selected", "gpio-f417", "cryp"]
106-
stm32f410 = ["stm32f4/stm32f410", "device-selected", "gpio-f410"]
107-
stm32f411 = ["stm32f4/stm32f411", "device-selected", "gpio-f411"]
108-
stm32f412 = ["stm32f4/stm32f412", "device-selected", "gpio-f412"]
109-
stm32f413 = ["stm32f4/stm32f413", "device-selected", "gpio-f413"]
110-
stm32f423 = ["stm32f4/stm32f413", "device-selected", "gpio-f413", "aes"]
111-
stm32f427 = ["stm32f4/stm32f427", "device-selected", "gpio-f427", "fsmc"]
112-
stm32f429 = ["stm32f4/stm32f429", "device-selected", "gpio-f427", "fmc"]
113-
stm32f437 = ["stm32f4/stm32f427", "device-selected", "gpio-f427", "fsmc", "cryp"]
114-
stm32f439 = ["stm32f4/stm32f429", "device-selected", "gpio-f427", "fmc", "cryp"]
115-
stm32f446 = ["stm32f4/stm32f446", "device-selected", "gpio-f446"]
116-
stm32f469 = ["stm32f4/stm32f469", "device-selected", "gpio-f469"]
117-
stm32f479 = ["stm32f4/stm32f469", "device-selected", "gpio-f469", "cryp"]
105+
stm32f401 = ["stm32f4/stm32f401", "gpio-f401",]
106+
stm32f405 = ["stm32f4/stm32f405", "gpio-f417"]
107+
stm32f407 = ["stm32f4/stm32f407", "gpio-f417"]
108+
stm32f415 = ["stm32f4/stm32f405", "gpio-f417", "cryp"]
109+
stm32f417 = ["stm32f4/stm32f407", "gpio-f417", "cryp"]
110+
stm32f410 = ["stm32f4/stm32f410", "gpio-f410"]
111+
stm32f411 = ["stm32f4/stm32f411", "gpio-f411"]
112+
stm32f412 = ["stm32f4/stm32f412", "gpio-f412"]
113+
stm32f413 = ["stm32f4/stm32f413", "gpio-f413"]
114+
stm32f423 = ["stm32f4/stm32f413", "gpio-f413", "aes"]
115+
stm32f427 = ["stm32f4/stm32f427", "gpio-f427", "fsmc"]
116+
stm32f429 = ["stm32f4/stm32f429", "gpio-f427", "fmc"]
117+
stm32f437 = ["stm32f4/stm32f427", "gpio-f427", "fsmc", "cryp"]
118+
stm32f439 = ["stm32f4/stm32f429", "gpio-f427", "fmc", "cryp"]
119+
stm32f446 = ["stm32f4/stm32f446", "gpio-f446"]
120+
stm32f469 = ["stm32f4/stm32f469", "gpio-f469"]
121+
stm32f479 = ["stm32f4/stm32f469", "gpio-f469", "cryp"]
118122

119123
gpio-f401 = [
120124
"gpiod", "gpioe",
@@ -250,16 +254,29 @@ gpio-f469 = [
250254
"usart3", "uart4", "uart5", "uart7", "uart8",
251255
]
252256

253-
usb_fs = ["synopsys-usb-otg", "synopsys-usb-otg/fs"]
254-
usb_hs = ["synopsys-usb-otg", "synopsys-usb-otg/hs"]
257+
## Support monotonic timers that can be used by [RTIC framework](https://crates.io/crates/cortex-m-rtic)
258+
rtic = ["dep:rtic-monotonic", "dep:systick-monotonic"]
259+
260+
## Implementation of `defmt::Format` for public enums and structures. See [defmt](https://crates.io/crates/defmt)
261+
defmt = ["dep:defmt", "fugit/defmt", "nb/defmt-0-3"]
255262

256-
can = ["bxcan"]
263+
## bxCAN peripheral support. See [bxcan](https://crates.io/crates/bxcan)
264+
can = ["dep:bxcan"]
257265

258-
i2s = ["stm32_i2s_v12x"]
266+
## I2S peripheral support. See [stm32_i2s_v12x](https://crates.io/crates/stm32_i2s_v12x)
267+
i2s = ["dep:stm32_i2s_v12x"]
259268

260-
fsmc_lcd = ["display-interface"]
269+
## USB OTG-FS peripheral support. See [synopsys-usb-otg](https://crates.io/crates/synopsys-usb-otg)
270+
usb_fs = ["dep:synopsys-usb-otg", "synopsys-usb-otg/fs"]
271+
## USB OTG-HS peripheral support. See [synopsys-usb-otg](https://crates.io/crates/synopsys-usb-otg)
272+
usb_hs = ["dep:synopsys-usb-otg", "synopsys-usb-otg/hs"]
273+
274+
## LCD support via FMC/FSMC peripheral. See [display-interface](https://crates.io/crates/display-interface)
275+
fsmc_lcd = ["dep:display-interface"]
276+
277+
## SDIO peripheral support. See [sdio-host](https://crates.io/crates/sdio-host)
278+
sdio-host = ["dep:sdio-host"]
261279

262-
defmt = ["dep:defmt", "fugit/defmt", "nb/defmt-0-3"]
263280
dfsdm = []
264281
sai = []
265282

@@ -323,8 +340,6 @@ uart8 = []
323340
uart9 = []
324341
uart10 = []
325342

326-
rtic = ["rtic-monotonic", "systick-monotonic"]
327-
328343
[profile.dev]
329344
debug = true
330345
lto = true
@@ -350,11 +365,11 @@ required-features = ["can", "stm32f405"]
350365

351366
[[example]]
352367
name = "delay-syst-blinky"
353-
required-features = ["device-selected"] # stm32f411
368+
required-features = [] # stm32f411
354369

355370
[[example]]
356371
name = "delay-timer-blinky"
357-
required-features = ["device-selected"] # stm32f411
372+
required-features = [] # stm32f411
358373

359374
[[example]]
360375
name = "display-touch"
@@ -366,27 +381,27 @@ required-features = ["gpiog"] # "stm32f429"
366381

367382
[[example]]
368383
name = "dynamic-gpio"
369-
required-features = ["device-selected"]
384+
required-features = []
370385

371386
[[example]]
372387
name = "f413disco-lcd-ferris"
373388
required-features = ["gpiod", "gpioe", "gpiof", "gpiog", "fsmc", "fsmc_lcd"] # stm32f413
374389

375390
[[example]]
376391
name = "hd44780"
377-
required-features = ["device-selected"]
392+
required-features = []
378393

379394
[[example]]
380395
name = "i2s-audio-out"
381396
required-features = ["stm32f411", "i2s"]
382397

383398
[[example]]
384399
name = "ist7920-bidi-normal-spi"
385-
required-features = ["device-selected"]
400+
required-features = []
386401

387402
[[example]]
388403
name = "pwm"
389-
required-features = ["device-selected"]
404+
required-features = []
390405

391406
[[example]]
392407
name = "pwm-input"
@@ -410,15 +425,15 @@ required-features = ["rng"] # stm32f407
410425

411426
[[example]]
412427
name = "rtc"
413-
required-features = ["device-selected"]
428+
required-features = []
414429

415430
[[example]]
416431
name = "rtc_alarm"
417432
required-features = ["stm32f411"]
418433

419434
[[example]]
420435
name = "rtic-adc-dma"
421-
required-features = ["device-selected", "rtic"] # stm32f401
436+
required-features = ["rtic"] # stm32f401
422437

423438
[[example]]
424439
name = "rtic-button"
@@ -462,7 +477,7 @@ required-features = ["gpiod", "sdio", "sdio-host"] # stm32f405
462477

463478
[[example]]
464479
name = "serial"
465-
required-features = ["device-selected"]
480+
required-features = []
466481

467482
[[example]]
468483
name = "serial-9bit"
@@ -478,7 +493,7 @@ required-features = ["stm32f405"]
478493

479494
[[example]]
480495
name = "ssd1306-image"
481-
required-features = ["device-selected"] # stm32f411
496+
required-features = [] # stm32f411
482497

483498
[[example]]
484499
name = "st7789-lcd"
@@ -494,11 +509,11 @@ required-features = ["tim2", "stm32f411"] # stm32f411
494509

495510
[[example]]
496511
name = "timer-periph"
497-
required-features = ["device-selected"]
512+
required-features = []
498513

499514
[[example]]
500515
name = "timer-syst"
501-
required-features = ["device-selected"]
516+
required-features = []
502517

503518
[[example]]
504519
name = "usb-serial-irq"
@@ -510,4 +525,4 @@ required-features = ["otg-fs", "usb_fs"] # stm32f401
510525

511526
[[example]]
512527
name = "ws2812-spi"
513-
required-features = ["device-selected"]
528+
required-features = []

build.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
use std::env;
2+
3+
#[derive(Clone, Copy, Debug)]
4+
enum GetOneError {
5+
None,
6+
Multiple,
7+
}
8+
9+
trait IteratorExt: Iterator {
10+
fn get_one(self) -> Result<Self::Item, GetOneError>;
11+
}
12+
13+
impl<T: Iterator> IteratorExt for T {
14+
fn get_one(mut self) -> Result<Self::Item, GetOneError> {
15+
match (self.next(), self.next()) {
16+
(Some(res), None) => Ok(res),
17+
(None, _) => Err(GetOneError::None),
18+
_ => Err(GetOneError::Multiple),
19+
}
20+
}
21+
}
22+
23+
fn main() {
24+
let _chip_name = match env::vars()
25+
.map(|(a, _)| a)
26+
.filter(|x| x.starts_with("CARGO_FEATURE_STM32F4"))
27+
.get_one()
28+
{
29+
Ok(x) => x,
30+
Err(GetOneError::None) => panic!("No stm32xx Cargo feature enabled"),
31+
Err(GetOneError::Multiple) => panic!("Multiple stm32xx Cargo features enabled"),
32+
}
33+
.strip_prefix("CARGO_FEATURE_")
34+
.unwrap()
35+
.to_ascii_lowercase();
36+
}

src/lib.rs

Lines changed: 11 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,15 @@
1+
//! Multi device hardware abstraction on top of the peripheral access API for the STMicro STM32F4 series microcontrollers.
2+
//!
3+
//! ## Feature flags
4+
#![doc = document_features::document_features!()]
15
#![no_std]
26
#![allow(non_camel_case_types)]
37

48
use enumflags2::{BitFlag, BitFlags};
59

6-
#[cfg(not(feature = "device-selected"))]
7-
compile_error!(
8-
"This crate requires one of the following device features enabled:
9-
stm32f401
10-
stm32f405
11-
stm32f407
12-
stm32f410
13-
stm32f411
14-
stm32f412
15-
stm32f413
16-
stm32f415
17-
stm32f417
18-
stm32f423
19-
stm32f427
20-
stm32f429
21-
stm32f437
22-
stm32f439
23-
stm32f446
24-
stm32f469
25-
stm32f479"
26-
);
27-
28-
#[cfg(feature = "device-selected")]
2910
pub use embedded_hal as hal;
3011

31-
#[cfg(feature = "device-selected")]
3212
pub use nb;
33-
#[cfg(feature = "device-selected")]
3413
pub use nb::block;
3514

3615
#[cfg(feature = "stm32f401")]
@@ -104,88 +83,52 @@ pub use stm32f4::stm32f469 as pac;
10483
// Enable use of interrupt macro
10584
pub use crate::pac::interrupt;
10685

107-
#[cfg(feature = "device-selected")]
10886
pub mod adc;
109-
#[cfg(feature = "device-selected")]
11087
pub mod bb;
111-
#[cfg(all(
112-
feature = "device-selected",
113-
feature = "can",
114-
any(feature = "can1", feature = "can2",)
115-
))]
88+
#[cfg(all(feature = "can", any(feature = "can1", feature = "can2",)))]
11689
pub mod can;
117-
#[cfg(feature = "device-selected")]
11890
pub mod crc32;
119-
#[cfg(all(feature = "device-selected", feature = "dac"))]
91+
#[cfg(feature = "dac")]
12092
pub mod dac;
121-
#[cfg(feature = "device-selected")]
12293
#[cfg(feature = "fmpi2c1")]
12394
pub mod fmpi2c;
124-
#[cfg(feature = "device-selected")]
12595
pub mod gpio;
126-
#[cfg(feature = "device-selected")]
12796
pub mod i2c;
128-
#[cfg(feature = "device-selected")]
12997
pub mod i2s;
130-
#[cfg(all(feature = "device-selected", feature = "usb_fs", feature = "otg-fs"))]
98+
#[cfg(all(feature = "usb_fs", feature = "otg-fs"))]
13199
pub mod otg_fs;
132-
#[cfg(all(
133-
feature = "device-selected",
134-
any(feature = "usb_hs", docsrs),
135-
feature = "otg-hs",
136-
))]
100+
#[cfg(all(any(feature = "usb_hs", docsrs), feature = "otg-hs",))]
137101
pub mod otg_hs;
138102

139-
#[cfg(all(feature = "device-selected", feature = "rng"))]
103+
#[cfg(feature = "rng")]
140104
pub mod rng;
141105

142-
#[cfg(feature = "device-selected")]
143106
pub mod dma;
144-
#[cfg(feature = "device-selected")]
145107
pub mod dwt;
146-
#[cfg(feature = "device-selected")]
147108
pub mod flash;
148-
#[cfg(all(
149-
feature = "device-selected",
150-
feature = "fsmc_lcd",
151-
any(feature = "fmc", feature = "fsmc")
152-
))]
109+
#[cfg(all(feature = "fsmc_lcd", any(feature = "fmc", feature = "fsmc")))]
153110
pub mod fsmc_lcd;
154-
#[cfg(feature = "device-selected")]
155111
pub mod prelude;
156-
#[cfg(feature = "device-selected")]
157112
pub mod qei;
158113
#[cfg(feature = "quadspi")]
159114
pub mod qspi;
160-
#[cfg(feature = "device-selected")]
161115
pub mod rcc;
162-
#[cfg(feature = "device-selected")]
163116
pub mod rtc;
164-
#[cfg(all(feature = "device-selected", feature = "sdio-host", feature = "sdio"))]
117+
#[cfg(all(feature = "sdio-host", feature = "sdio"))]
165118
pub mod sdio;
166-
#[cfg(feature = "device-selected")]
167119
pub mod serial;
168-
#[cfg(feature = "device-selected")]
169120
pub mod signature;
170-
#[cfg(feature = "device-selected")]
171121
pub mod spi;
172-
#[cfg(feature = "device-selected")]
173122
pub mod syscfg;
174-
#[cfg(feature = "device-selected")]
175123
pub mod time;
176-
#[cfg(feature = "device-selected")]
177124
pub mod timer;
178-
#[cfg(feature = "device-selected")]
179125
#[cfg(feature = "uart4")]
180126
pub mod uart;
181-
#[cfg(feature = "device-selected")]
182127
pub mod watchdog;
183128

184-
#[cfg(feature = "device-selected")]
185129
mod sealed {
186130
pub trait Sealed {}
187131
}
188-
#[cfg(feature = "device-selected")]
189132
pub(crate) use sealed::Sealed;
190133

191134
fn stripped_type_name<T>() -> &'static str {

0 commit comments

Comments
 (0)