Skip to content

Commit a5d1f2f

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

File tree

6 files changed

+111
-120
lines changed

6 files changed

+111
-120
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/i2s.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::pac;
1212
use crate::rcc::{self, Clocks, Reset};
1313
use fugit::HertzU32 as Hertz;
1414

15-
#[cfg(feature = "stm32_i2s_v12x")]
15+
#[cfg(feature = "i2s")]
1616
pub extern crate stm32_i2s_v12x;
1717

1818
// I2S pins are mostly the same as the corresponding SPI pins:
@@ -202,7 +202,7 @@ macro_rules! i2s {
202202
}
203203
}
204204

205-
#[cfg(feature = "stm32_i2s_v12x")]
205+
#[cfg(feature = "i2s")]
206206
impl stm32_i2s_v12x::WsPin for gpio::alt::$i2s::Ws {
207207
fn is_high(&self) -> bool {
208208
use crate::gpio::ReadPin;
@@ -214,7 +214,7 @@ macro_rules! i2s {
214214
}
215215
}
216216

217-
#[cfg(feature = "stm32_i2s_v12x")]
217+
#[cfg(feature = "i2s")]
218218
unsafe impl stm32_i2s_v12x::I2sPeripheral for I2s<$SPI>
219219
where
220220
$SPI: rcc::Reset,
@@ -388,7 +388,7 @@ macro_rules! dual_i2s {
388388
type I2sExtPeripheral = $I2SEXT;
389389
}
390390

391-
#[cfg(feature = "stm32_i2s_v12x")]
391+
#[cfg(feature = "i2s")]
392392
unsafe impl stm32_i2s_v12x::DualI2sPeripheral for DualI2s<$SPI>
393393
where
394394
$SPI: rcc::Reset,
@@ -445,7 +445,7 @@ dual_i2s!(pac::SPI3, pac::I2S3EXT, DualI2s3, i2s3, i2s_clk);
445445
dual_i2s!(pac::SPI3, pac::I2S3EXT, DualI2s3, i2s3, i2s_apb1_clk);
446446

447447
// DMA support: reuse existing mappings for SPI
448-
#[cfg(feature = "stm32_i2s_v12x")]
448+
#[cfg(feature = "i2s")]
449449
mod dma {
450450
use super::*;
451451
use crate::dma::traits::{DMASet, PeriAddress};

0 commit comments

Comments
 (0)