From 2899cd689c1174f3a8804228f4dfd3ef3d2c2b49 Mon Sep 17 00:00:00 2001 From: Andrey Zgarbul Date: Sat, 23 Dec 2023 17:49:34 +0300 Subject: [PATCH] device-selected to build-rs --- CHANGELOG.md | 1 + Cargo.toml | 95 +++++++++++++++++++++++++++++--------------------- build.rs | 36 +++++++++++++++++++ src/i2s.rs | 10 +++--- src/lib.rs | 84 ++++++++------------------------------------ src/prelude.rs | 10 ++---- 6 files changed, 114 insertions(+), 122 deletions(-) create mode 100644 build.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 20e35ac9..99bbfcf3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed + - Check features enabled in `build-rs` - bump embedded-hal to `1.0-rc2` - Use `as_ptr` for register address casting - Updated `synopsys-usb-otg` to `0.4.0` diff --git a/Cargo.toml b/Cargo.toml index dde7c76d..5225fea1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,6 +47,7 @@ systick-monotonic = { version = "1.0", optional = true } enumflags2 = "0.7.8" embedded-storage = "0.3" vcell = "0.1.3" +document-features = "0.2" [dependencies.time] version = "0.3.14" @@ -99,27 +100,30 @@ default-features = false features = ["macros"] [features] -device-selected = [] -rt = [] # deprecated +#! Use one of the supported STM32-serie related features: +#! `stm32f401`, `stm32f405`, `stm32f407`, `stm32f415`, `stm32f417`, `stm32f410`, +#! `stm32f411`, `stm32f412`, `stm32f413`, `stm32f423`, `stm32f427`, `stm32f429`, +#! `stm32f437`, `stm32f439`, `stm32f446`, `stm32f469`, `stm32f479`. + # Note: stm32f4 has only one feature for some very similar device families, # so it's intended for e.g. stm32f405/415 to both enable stm32f4/stm32f405. -stm32f401 = ["stm32f4/stm32f401", "device-selected", "gpio-f401",] -stm32f405 = ["stm32f4/stm32f405", "device-selected", "gpio-f417"] -stm32f407 = ["stm32f4/stm32f407", "device-selected", "gpio-f417"] -stm32f415 = ["stm32f4/stm32f405", "device-selected", "gpio-f417", "cryp"] -stm32f417 = ["stm32f4/stm32f407", "device-selected", "gpio-f417", "cryp"] -stm32f410 = ["stm32f4/stm32f410", "device-selected", "gpio-f410"] -stm32f411 = ["stm32f4/stm32f411", "device-selected", "gpio-f411"] -stm32f412 = ["stm32f4/stm32f412", "device-selected", "gpio-f412"] -stm32f413 = ["stm32f4/stm32f413", "device-selected", "gpio-f413"] -stm32f423 = ["stm32f4/stm32f413", "device-selected", "gpio-f413", "aes"] -stm32f427 = ["stm32f4/stm32f427", "device-selected", "gpio-f427", "fsmc"] -stm32f429 = ["stm32f4/stm32f429", "device-selected", "gpio-f427", "fmc"] -stm32f437 = ["stm32f4/stm32f427", "device-selected", "gpio-f427", "fsmc", "cryp"] -stm32f439 = ["stm32f4/stm32f429", "device-selected", "gpio-f427", "fmc", "cryp"] -stm32f446 = ["stm32f4/stm32f446", "device-selected", "gpio-f446"] -stm32f469 = ["stm32f4/stm32f469", "device-selected", "gpio-f469"] -stm32f479 = ["stm32f4/stm32f469", "device-selected", "gpio-f469", "cryp"] +stm32f401 = ["stm32f4/stm32f401", "gpio-f401",] +stm32f405 = ["stm32f4/stm32f405", "gpio-f417"] +stm32f407 = ["stm32f4/stm32f407", "gpio-f417"] +stm32f415 = ["stm32f4/stm32f405", "gpio-f417", "cryp"] +stm32f417 = ["stm32f4/stm32f407", "gpio-f417", "cryp"] +stm32f410 = ["stm32f4/stm32f410", "gpio-f410"] +stm32f411 = ["stm32f4/stm32f411", "gpio-f411"] +stm32f412 = ["stm32f4/stm32f412", "gpio-f412"] +stm32f413 = ["stm32f4/stm32f413", "gpio-f413"] +stm32f423 = ["stm32f4/stm32f413", "gpio-f413", "aes"] +stm32f427 = ["stm32f4/stm32f427", "gpio-f427", "fsmc"] +stm32f429 = ["stm32f4/stm32f429", "gpio-f427", "fmc"] +stm32f437 = ["stm32f4/stm32f427", "gpio-f427", "fsmc", "cryp"] +stm32f439 = ["stm32f4/stm32f429", "gpio-f427", "fmc", "cryp"] +stm32f446 = ["stm32f4/stm32f446", "gpio-f446"] +stm32f469 = ["stm32f4/stm32f469", "gpio-f469"] +stm32f479 = ["stm32f4/stm32f469", "gpio-f469", "cryp"] gpio-f401 = [ "gpiod", "gpioe", @@ -255,16 +259,29 @@ gpio-f469 = [ "usart3", "uart4", "uart5", "uart7", "uart8", ] -usb_fs = ["synopsys-usb-otg", "synopsys-usb-otg/fs"] -usb_hs = ["synopsys-usb-otg", "synopsys-usb-otg/hs"] +## Support monotonic timers that can be used by [RTIC framework](https://crates.io/crates/cortex-m-rtic) +rtic = ["dep:rtic-monotonic", "dep:systick-monotonic"] + +## Implementation of `defmt::Format` for public enums and structures. See [defmt](https://crates.io/crates/defmt) +defmt = ["dep:defmt", "fugit/defmt", "nb/defmt-0-3"] -can = ["bxcan"] +## bxCAN peripheral support. See [bxcan](https://crates.io/crates/bxcan) +can = ["dep:bxcan"] -i2s = ["stm32_i2s_v12x"] +## I2S peripheral support. See [stm32_i2s_v12x](https://crates.io/crates/stm32_i2s_v12x) +i2s = ["dep:stm32_i2s_v12x"] -fsmc_lcd = ["display-interface"] +## USB OTG-FS peripheral support. See [synopsys-usb-otg](https://crates.io/crates/synopsys-usb-otg) +usb_fs = ["dep:synopsys-usb-otg", "synopsys-usb-otg/fs"] +## USB OTG-HS peripheral support. See [synopsys-usb-otg](https://crates.io/crates/synopsys-usb-otg) +usb_hs = ["dep:synopsys-usb-otg", "synopsys-usb-otg/hs"] + +## LCD support via FMC/FSMC peripheral. See [display-interface](https://crates.io/crates/display-interface) +fsmc_lcd = ["dep:display-interface"] + +## SDIO peripheral support. See [sdio-host](https://crates.io/crates/sdio-host) +sdio-host = ["dep:sdio-host"] -defmt = ["dep:defmt", "fugit/defmt", "nb/defmt-0-3"] dfsdm = [] sai = [] @@ -328,8 +345,6 @@ uart8 = [] uart9 = [] uart10 = [] -rtic = ["rtic-monotonic", "systick-monotonic"] - [profile.dev] debug = true lto = true @@ -355,11 +370,11 @@ required-features = ["can", "stm32f405"] [[example]] name = "delay-syst-blinky" -required-features = ["device-selected"] # stm32f411 +required-features = [] # stm32f411 [[example]] name = "delay-timer-blinky" -required-features = ["device-selected"] # stm32f411 +required-features = [] # stm32f411 [[example]] name = "display-touch" @@ -371,7 +386,7 @@ required-features = ["gpiog"] # "stm32f429" [[example]] name = "dynamic-gpio" -required-features = ["device-selected"] +required-features = [] [[example]] name = "f413disco-lcd-ferris" @@ -379,7 +394,7 @@ required-features = ["gpiod", "gpioe", "gpiof", "gpiog", "fsmc", "fsmc_lcd"] # s [[example]] name = "hd44780" -required-features = ["device-selected"] +required-features = [] [[example]] name = "i2s-audio-out" @@ -387,11 +402,11 @@ required-features = ["stm32f411", "i2s"] [[example]] name = "ist7920-bidi-normal-spi" -required-features = ["device-selected"] +required-features = [] [[example]] name = "pwm" -required-features = ["device-selected"] +required-features = [] [[example]] name = "pwm-input" @@ -415,7 +430,7 @@ required-features = ["rng"] # stm32f407 [[example]] name = "rtc" -required-features = ["device-selected"] +required-features = [] [[example]] name = "rtc_alarm" @@ -423,7 +438,7 @@ required-features = ["stm32f411"] [[example]] name = "rtic-adc-dma" -required-features = ["device-selected", "rtic"] # stm32f401 +required-features = ["rtic"] # stm32f401 [[example]] name = "rtic-button" @@ -467,7 +482,7 @@ required-features = ["gpiod", "sdio", "sdio-host"] # stm32f405 [[example]] name = "serial" -required-features = ["device-selected"] +required-features = [] [[example]] name = "serial-9bit" @@ -483,7 +498,7 @@ required-features = ["stm32f405"] [[example]] name = "ssd1306-image" -required-features = ["device-selected"] # stm32f411 +required-features = [] # stm32f411 [[example]] name = "st7789-lcd" @@ -499,11 +514,11 @@ required-features = ["tim2", "stm32f411"] # stm32f411 [[example]] name = "timer-periph" -required-features = ["device-selected"] +required-features = [] [[example]] name = "timer-syst" -required-features = ["device-selected"] +required-features = [] [[example]] name = "usb-serial-irq" @@ -515,4 +530,4 @@ required-features = ["otg-fs", "usb_fs"] # stm32f401 [[example]] name = "ws2812-spi" -required-features = ["device-selected"] +required-features = [] diff --git a/build.rs b/build.rs new file mode 100644 index 00000000..8e25570e --- /dev/null +++ b/build.rs @@ -0,0 +1,36 @@ +use std::env; + +#[derive(Clone, Copy, Debug)] +enum GetOneError { + None, + Multiple, +} + +trait IteratorExt: Iterator { + fn get_one(self) -> Result; +} + +impl IteratorExt for T { + fn get_one(mut self) -> Result { + match (self.next(), self.next()) { + (Some(res), None) => Ok(res), + (None, _) => Err(GetOneError::None), + _ => Err(GetOneError::Multiple), + } + } +} + +fn main() { + let _chip_name = match env::vars() + .map(|(a, _)| a) + .filter(|x| x.starts_with("CARGO_FEATURE_STM32F4")) + .get_one() + { + Ok(x) => x, + Err(GetOneError::None) => panic!("No stm32xx Cargo feature enabled"), + Err(GetOneError::Multiple) => panic!("Multiple stm32xx Cargo features enabled"), + } + .strip_prefix("CARGO_FEATURE_") + .unwrap() + .to_ascii_lowercase(); +} diff --git a/src/i2s.rs b/src/i2s.rs index ea4007f0..35fc38a7 100644 --- a/src/i2s.rs +++ b/src/i2s.rs @@ -12,7 +12,7 @@ use crate::pac; use crate::rcc::{self, Clocks, Reset}; use fugit::HertzU32 as Hertz; -#[cfg(feature = "stm32_i2s_v12x")] +#[cfg(feature = "i2s")] pub extern crate stm32_i2s_v12x; // I2S pins are mostly the same as the corresponding SPI pins: @@ -202,7 +202,7 @@ macro_rules! i2s { } } - #[cfg(feature = "stm32_i2s_v12x")] + #[cfg(feature = "i2s")] impl stm32_i2s_v12x::WsPin for gpio::alt::$i2s::Ws { fn is_high(&self) -> bool { use crate::gpio::ReadPin; @@ -214,7 +214,7 @@ macro_rules! i2s { } } - #[cfg(feature = "stm32_i2s_v12x")] + #[cfg(feature = "i2s")] unsafe impl stm32_i2s_v12x::I2sPeripheral for I2s<$SPI> where $SPI: rcc::Reset, @@ -388,7 +388,7 @@ macro_rules! dual_i2s { type I2sExtPeripheral = $I2SEXT; } - #[cfg(feature = "stm32_i2s_v12x")] + #[cfg(feature = "i2s")] unsafe impl stm32_i2s_v12x::DualI2sPeripheral for DualI2s<$SPI> where $SPI: rcc::Reset, @@ -445,7 +445,7 @@ dual_i2s!(pac::SPI3, pac::I2S3EXT, DualI2s3, i2s3, i2s_clk); dual_i2s!(pac::SPI3, pac::I2S3EXT, DualI2s3, i2s3, i2s_apb1_clk); // DMA support: reuse existing mappings for SPI -#[cfg(feature = "stm32_i2s_v12x")] +#[cfg(feature = "i2s")] mod dma { use super::*; use crate::dma::traits::{DMASet, PeriAddress}; diff --git a/src/lib.rs b/src/lib.rs index 16c31cf7..b786bd6b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,36 +1,16 @@ +//! Multi device hardware abstraction on top of the peripheral access API for the STMicro STM32F4 series microcontrollers. +//! +//! ## Feature flags +#![doc = document_features::document_features!()] #![no_std] #![allow(non_camel_case_types)] use enumflags2::{BitFlag, BitFlags}; -#[cfg(not(feature = "device-selected"))] -compile_error!( - "This crate requires one of the following device features enabled: - stm32f401 - stm32f405 - stm32f407 - stm32f410 - stm32f411 - stm32f412 - stm32f413 - stm32f415 - stm32f417 - stm32f423 - stm32f427 - stm32f429 - stm32f437 - stm32f439 - stm32f446 - stm32f469 - stm32f479" -); - -#[cfg(feature = "device-selected")] -pub use embedded_hal_02 as hal; - -#[cfg(feature = "device-selected")] +pub use embedded_hal as hal; +pub use embedded_hal_02 as hal_02; + pub use nb; -#[cfg(feature = "device-selected")] pub use nb::block; #[cfg(feature = "stm32f401")] @@ -104,88 +84,52 @@ pub use stm32f4::stm32f469 as pac; // Enable use of interrupt macro pub use crate::pac::interrupt; -#[cfg(feature = "device-selected")] pub mod adc; -#[cfg(feature = "device-selected")] pub mod bb; -#[cfg(all( - feature = "device-selected", - feature = "can", - any(feature = "can1", feature = "can2",) -))] +#[cfg(all(feature = "can", any(feature = "can1", feature = "can2",)))] pub mod can; -#[cfg(feature = "device-selected")] pub mod crc32; -#[cfg(all(feature = "device-selected", feature = "dac"))] +#[cfg(feature = "dac")] pub mod dac; -#[cfg(feature = "device-selected")] #[cfg(feature = "fmpi2c1")] pub mod fmpi2c; -#[cfg(feature = "device-selected")] pub mod gpio; -#[cfg(feature = "device-selected")] pub mod i2c; -#[cfg(feature = "device-selected")] pub mod i2s; -#[cfg(all(feature = "device-selected", feature = "usb_fs", feature = "otg-fs"))] +#[cfg(all(feature = "usb_fs", feature = "otg-fs"))] pub mod otg_fs; -#[cfg(all( - feature = "device-selected", - any(feature = "usb_hs", docsrs), - feature = "otg-hs", -))] +#[cfg(all(any(feature = "usb_hs", docsrs), feature = "otg-hs",))] pub mod otg_hs; -#[cfg(all(feature = "device-selected", feature = "rng"))] +#[cfg(feature = "rng")] pub mod rng; -#[cfg(feature = "device-selected")] pub mod dma; -#[cfg(feature = "device-selected")] pub mod dwt; -#[cfg(feature = "device-selected")] pub mod flash; -#[cfg(all( - feature = "device-selected", - feature = "fsmc_lcd", - any(feature = "fmc", feature = "fsmc") -))] +#[cfg(all(feature = "fsmc_lcd", any(feature = "fmc", feature = "fsmc")))] pub mod fsmc_lcd; -#[cfg(feature = "device-selected")] pub mod prelude; -#[cfg(feature = "device-selected")] pub mod qei; #[cfg(feature = "quadspi")] pub mod qspi; -#[cfg(feature = "device-selected")] pub mod rcc; -#[cfg(feature = "device-selected")] pub mod rtc; -#[cfg(all(feature = "device-selected", feature = "sdio-host", feature = "sdio"))] +#[cfg(all(feature = "sdio-host", feature = "sdio"))] pub mod sdio; -#[cfg(feature = "device-selected")] pub mod serial; -#[cfg(feature = "device-selected")] pub mod signature; -#[cfg(feature = "device-selected")] pub mod spi; -#[cfg(feature = "device-selected")] pub mod syscfg; -#[cfg(feature = "device-selected")] pub mod time; -#[cfg(feature = "device-selected")] pub mod timer; -#[cfg(feature = "device-selected")] #[cfg(feature = "uart4")] pub mod uart; -#[cfg(feature = "device-selected")] pub mod watchdog; -#[cfg(feature = "device-selected")] mod sealed { pub trait Sealed {} } -#[cfg(feature = "device-selected")] pub(crate) use sealed::Sealed; fn stripped_type_name() -> &'static str { diff --git a/src/prelude.rs b/src/prelude.rs index 54422dc2..427158f4 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -47,13 +47,9 @@ pub use embedded_hal_02::Qei as _embedded_hal_Qei; pub use fugit::ExtU32 as _fugit_ExtU32; pub use fugit::RateExtU32 as _fugit_RateExtU32; -#[cfg(all( - feature = "device-selected", - feature = "can", - any(feature = "can1", feature = "can2",) -))] +#[cfg(all(feature = "can", any(feature = "can1", feature = "can2",)))] pub use crate::can::CanExt as _stm32f4xx_hal_can_CanExt; -#[cfg(all(feature = "device-selected", feature = "dac"))] +#[cfg(feature = "dac")] pub use crate::dac::DacExt as _stm32f4xx_hal_dac_DacExt; pub use crate::dma::traits::DmaEventExt as _; pub use crate::dma::traits::DmaFlagExt as _; @@ -70,7 +66,7 @@ pub use crate::i2c::I2cExt as _stm32f4xx_hal_i2c_I2cExt; pub use crate::i2s::I2sExt as _stm32f4xx_hal_i2s_I2sExt; pub use crate::qei::QeiExt as _stm32f4xx_hal_QeiExt; pub use crate::rcc::RccExt as _stm32f4xx_hal_rcc_RccExt; -#[cfg(all(feature = "device-selected", feature = "rng"))] +#[cfg(feature = "rng")] pub use crate::rng::RngExt as _stm32f4xx_hal_rng_RngExt; pub use crate::serial::RxISR as _stm32f4xx_hal_serial_RxISR; pub use crate::serial::RxListen as _stm32f4xx_hal_serial_RxListen;