diff options
| -rw-r--r-- | embassy-stm32-wpan/Cargo.toml | 24 | ||||
| -rw-r--r-- | embassy-stm32-wpan/build.rs | 34 | ||||
| -rw-r--r-- | embassy-stm32-wpan/src/lib.rs | 18 | ||||
| -rw-r--r-- | examples/stm32wb/Cargo.toml | 1 | ||||
| -rw-r--r-- | tests/stm32/src/bin/tl_mbox.rs | 11 |
5 files changed, 70 insertions, 18 deletions
diff --git a/embassy-stm32-wpan/Cargo.toml b/embassy-stm32-wpan/Cargo.toml index a6673d472..058d0e29f 100644 --- a/embassy-stm32-wpan/Cargo.toml +++ b/embassy-stm32-wpan/Cargo.toml | |||
| @@ -5,13 +5,12 @@ edition = "2021" | |||
| 5 | license = "MIT OR Apache-2.0" | 5 | license = "MIT OR Apache-2.0" |
| 6 | 6 | ||
| 7 | [dependencies] | 7 | [dependencies] |
| 8 | embassy-stm32 = { version = "0.1.0", path = "../embassy-stm32", features = ["stm32wb55rg"] } | 8 | embassy-stm32 = { version = "0.1.0", path = "../embassy-stm32" } |
| 9 | embassy-sync = { version = "0.2.0", path = "../embassy-sync" } | 9 | embassy-sync = { version = "0.2.0", path = "../embassy-sync" } |
| 10 | embassy-time = { version = "0.1.0", path = "../embassy-time", optional = true } | 10 | embassy-time = { version = "0.1.0", path = "../embassy-time", optional = true } |
| 11 | embassy-futures = { version = "0.1.0", path = "../embassy-futures" } | 11 | embassy-futures = { version = "0.1.0", path = "../embassy-futures" } |
| 12 | embassy-cortex-m = { version = "0.1.0", path = "../embassy-cortex-m", features = ["prio-bits-4"]} | 12 | embassy-hal-common = { version = "0.1.0", path = "../embassy-hal-common" } |
| 13 | embassy-hal-common = {version = "0.1.0", path = "../embassy-hal-common" } | 13 | embassy-embedded-hal = { version = "0.1.0", path = "../embassy-embedded-hal" } |
| 14 | embassy-embedded-hal = {version = "0.1.0", path = "../embassy-embedded-hal" } | ||
| 15 | 14 | ||
| 16 | defmt = { version = "0.3", optional = true } | 15 | defmt = { version = "0.3", optional = true } |
| 17 | cortex-m = "0.7.6" | 16 | cortex-m = "0.7.6" |
| @@ -21,3 +20,20 @@ bit_field = "0.10.2" | |||
| 21 | 20 | ||
| 22 | [features] | 21 | [features] |
| 23 | defmt = ["dep:defmt", "embassy-sync/defmt", "embassy-embedded-hal/defmt", "embassy-hal-common/defmt"] | 22 | defmt = ["dep:defmt", "embassy-sync/defmt", "embassy-embedded-hal/defmt", "embassy-hal-common/defmt"] |
| 23 | |||
| 24 | stm32wb10cc = [ "embassy-stm32/stm32wb10cc" ] | ||
| 25 | stm32wb15cc = [ "embassy-stm32/stm32wb15cc" ] | ||
| 26 | stm32wb30ce = [ "embassy-stm32/stm32wb30ce" ] | ||
| 27 | stm32wb35cc = [ "embassy-stm32/stm32wb35cc" ] | ||
| 28 | stm32wb35ce = [ "embassy-stm32/stm32wb35ce" ] | ||
| 29 | stm32wb50cg = [ "embassy-stm32/stm32wb50cg" ] | ||
| 30 | stm32wb55cc = [ "embassy-stm32/stm32wb55cc" ] | ||
| 31 | stm32wb55ce = [ "embassy-stm32/stm32wb55ce" ] | ||
| 32 | stm32wb55cg = [ "embassy-stm32/stm32wb55cg" ] | ||
| 33 | stm32wb55rc = [ "embassy-stm32/stm32wb55rc" ] | ||
| 34 | stm32wb55re = [ "embassy-stm32/stm32wb55re" ] | ||
| 35 | stm32wb55rg = [ "embassy-stm32/stm32wb55rg" ] | ||
| 36 | stm32wb55vc = [ "embassy-stm32/stm32wb55vc" ] | ||
| 37 | stm32wb55ve = [ "embassy-stm32/stm32wb55ve" ] | ||
| 38 | stm32wb55vg = [ "embassy-stm32/stm32wb55vg" ] | ||
| 39 | stm32wb55vy = [ "embassy-stm32/stm32wb55vy" ] \ No newline at end of file | ||
diff --git a/embassy-stm32-wpan/build.rs b/embassy-stm32-wpan/build.rs new file mode 100644 index 000000000..4edf73d59 --- /dev/null +++ b/embassy-stm32-wpan/build.rs | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | use std::env; | ||
| 2 | |||
| 3 | fn main() { | ||
| 4 | match env::vars() | ||
| 5 | .map(|(a, _)| a) | ||
| 6 | .filter(|x| x.starts_with("CARGO_FEATURE_STM32")) | ||
| 7 | .get_one() | ||
| 8 | { | ||
| 9 | Ok(_) => {} | ||
| 10 | Err(GetOneError::None) => panic!("No stm32xx Cargo feature enabled"), | ||
| 11 | Err(GetOneError::Multiple) => panic!("Multiple stm32xx Cargo features enabled"), | ||
| 12 | } | ||
| 13 | } | ||
| 14 | |||
| 15 | enum GetOneError { | ||
| 16 | None, | ||
| 17 | Multiple, | ||
| 18 | } | ||
| 19 | |||
| 20 | trait IteratorExt: Iterator { | ||
| 21 | fn get_one(self) -> Result<Self::Item, GetOneError>; | ||
| 22 | } | ||
| 23 | |||
| 24 | impl<T: Iterator> IteratorExt for T { | ||
| 25 | fn get_one(mut self) -> Result<Self::Item, GetOneError> { | ||
| 26 | match self.next() { | ||
| 27 | None => Err(GetOneError::None), | ||
| 28 | Some(res) => match self.next() { | ||
| 29 | Some(_) => Err(GetOneError::Multiple), | ||
| 30 | None => Ok(res), | ||
| 31 | }, | ||
| 32 | } | ||
| 33 | } | ||
| 34 | } | ||
diff --git a/embassy-stm32-wpan/src/lib.rs b/embassy-stm32-wpan/src/lib.rs index b3206428e..c37b67dc4 100644 --- a/embassy-stm32-wpan/src/lib.rs +++ b/embassy-stm32-wpan/src/lib.rs | |||
| @@ -6,10 +6,10 @@ pub mod fmt; | |||
| 6 | use core::mem::MaybeUninit; | 6 | use core::mem::MaybeUninit; |
| 7 | 7 | ||
| 8 | use cmd::CmdPacket; | 8 | use cmd::CmdPacket; |
| 9 | use embassy_cortex_m::interrupt::Interrupt; | ||
| 10 | use embassy_futures::block_on; | 9 | use embassy_futures::block_on; |
| 11 | use embassy_hal_common::{into_ref, Peripheral, PeripheralRef}; | 10 | use embassy_hal_common::{into_ref, Peripheral, PeripheralRef}; |
| 12 | use embassy_stm32::interrupt; | 11 | use embassy_stm32::interrupt; |
| 12 | use embassy_stm32::interrupt::typelevel::Interrupt; | ||
| 13 | use embassy_stm32::ipcc::{Config, Ipcc}; | 13 | use embassy_stm32::ipcc::{Config, Ipcc}; |
| 14 | use embassy_stm32::peripherals::IPCC; | 14 | use embassy_stm32::peripherals::IPCC; |
| 15 | use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; | 15 | use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; |
| @@ -37,7 +37,7 @@ pub mod unsafe_linked_list; | |||
| 37 | /// Interrupt handler. | 37 | /// Interrupt handler. |
| 38 | pub struct ReceiveInterruptHandler {} | 38 | pub struct ReceiveInterruptHandler {} |
| 39 | 39 | ||
| 40 | impl interrupt::Handler<interrupt::IPCC_C1_RX> for ReceiveInterruptHandler { | 40 | impl interrupt::typelevel::Handler<interrupt::typelevel::IPCC_C1_RX> for ReceiveInterruptHandler { |
| 41 | unsafe fn on_interrupt() { | 41 | unsafe fn on_interrupt() { |
| 42 | if Ipcc::is_rx_pending(channels::cpu2::IPCC_SYSTEM_EVENT_CHANNEL) { | 42 | if Ipcc::is_rx_pending(channels::cpu2::IPCC_SYSTEM_EVENT_CHANNEL) { |
| 43 | debug!("RX SYS evt"); | 43 | debug!("RX SYS evt"); |
| @@ -53,7 +53,7 @@ impl interrupt::Handler<interrupt::IPCC_C1_RX> for ReceiveInterruptHandler { | |||
| 53 | 53 | ||
| 54 | pub struct TransmitInterruptHandler {} | 54 | pub struct TransmitInterruptHandler {} |
| 55 | 55 | ||
| 56 | impl interrupt::Handler<interrupt::IPCC_C1_TX> for TransmitInterruptHandler { | 56 | impl interrupt::typelevel::Handler<interrupt::typelevel::IPCC_C1_TX> for TransmitInterruptHandler { |
| 57 | unsafe fn on_interrupt() { | 57 | unsafe fn on_interrupt() { |
| 58 | if Ipcc::is_tx_pending(channels::cpu1::IPCC_SYSTEM_CMD_RSP_CHANNEL) { | 58 | if Ipcc::is_tx_pending(channels::cpu1::IPCC_SYSTEM_CMD_RSP_CHANNEL) { |
| 59 | debug!("TX SYS cmd rsp"); | 59 | debug!("TX SYS cmd rsp"); |
| @@ -182,8 +182,8 @@ pub struct TlMbox<'d> { | |||
| 182 | impl<'d> TlMbox<'d> { | 182 | impl<'d> TlMbox<'d> { |
| 183 | pub fn init( | 183 | pub fn init( |
| 184 | ipcc: impl Peripheral<P = IPCC> + 'd, | 184 | ipcc: impl Peripheral<P = IPCC> + 'd, |
| 185 | _irqs: impl interrupt::Binding<interrupt::IPCC_C1_RX, ReceiveInterruptHandler> | 185 | _irqs: impl interrupt::typelevel::Binding<interrupt::typelevel::IPCC_C1_RX, ReceiveInterruptHandler> |
| 186 | + interrupt::Binding<interrupt::IPCC_C1_TX, TransmitInterruptHandler>, | 186 | + interrupt::typelevel::Binding<interrupt::typelevel::IPCC_C1_TX, TransmitInterruptHandler>, |
| 187 | config: Config, | 187 | config: Config, |
| 188 | ) -> Self { | 188 | ) -> Self { |
| 189 | into_ref!(ipcc); | 189 | into_ref!(ipcc); |
| @@ -223,11 +223,11 @@ impl<'d> TlMbox<'d> { | |||
| 223 | mm::MemoryManager::enable(); | 223 | mm::MemoryManager::enable(); |
| 224 | 224 | ||
| 225 | // enable interrupts | 225 | // enable interrupts |
| 226 | interrupt::IPCC_C1_RX::unpend(); | 226 | interrupt::typelevel::IPCC_C1_RX::unpend(); |
| 227 | interrupt::IPCC_C1_TX::unpend(); | 227 | interrupt::typelevel::IPCC_C1_TX::unpend(); |
| 228 | 228 | ||
| 229 | unsafe { interrupt::IPCC_C1_RX::enable() }; | 229 | unsafe { interrupt::typelevel::IPCC_C1_RX::enable() }; |
| 230 | unsafe { interrupt::IPCC_C1_TX::enable() }; | 230 | unsafe { interrupt::typelevel::IPCC_C1_TX::enable() }; |
| 231 | 231 | ||
| 232 | STATE.reset(); | 232 | STATE.reset(); |
| 233 | 233 | ||
diff --git a/examples/stm32wb/Cargo.toml b/examples/stm32wb/Cargo.toml index 14897b171..5b82dd83b 100644 --- a/examples/stm32wb/Cargo.toml +++ b/examples/stm32wb/Cargo.toml | |||
| @@ -9,6 +9,7 @@ embassy-sync = { version = "0.2.0", path = "../../embassy-sync", features = ["de | |||
| 9 | embassy-executor = { version = "0.2.0", path = "../../embassy-executor", features = ["nightly", "arch-cortex-m", "executor-thread", "defmt", "integrated-timers"] } | 9 | embassy-executor = { version = "0.2.0", path = "../../embassy-executor", features = ["nightly", "arch-cortex-m", "executor-thread", "defmt", "integrated-timers"] } |
| 10 | embassy-time = { version = "0.1.0", path = "../../embassy-time", features = ["defmt", "defmt-timestamp-uptime", "tick-hz-32_768"] } | 10 | embassy-time = { version = "0.1.0", path = "../../embassy-time", features = ["defmt", "defmt-timestamp-uptime", "tick-hz-32_768"] } |
| 11 | embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["nightly", "defmt", "stm32wb55rg", "time-driver-any", "memory-x", "exti"] } | 11 | embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["nightly", "defmt", "stm32wb55rg", "time-driver-any", "memory-x", "exti"] } |
| 12 | embassy-stm32-wpan = { version = "0.1.0", path = "../../embassy-stm32-wpan", features = ["defmt"] } | ||
| 12 | 13 | ||
| 13 | defmt = "0.3" | 14 | defmt = "0.3" |
| 14 | defmt-rtt = "0.4" | 15 | defmt-rtt = "0.4" |
diff --git a/tests/stm32/src/bin/tl_mbox.rs b/tests/stm32/src/bin/tl_mbox.rs index fab9f0e1b..0f643d578 100644 --- a/tests/stm32/src/bin/tl_mbox.rs +++ b/tests/stm32/src/bin/tl_mbox.rs | |||
| @@ -8,13 +8,14 @@ mod common; | |||
| 8 | 8 | ||
| 9 | use common::*; | 9 | use common::*; |
| 10 | use embassy_executor::Spawner; | 10 | use embassy_executor::Spawner; |
| 11 | use embassy_stm32::tl_mbox::{Config, TlMbox}; | 11 | use embassy_stm32::bind_interrupts; |
| 12 | use embassy_stm32::{bind_interrupts, tl_mbox}; | 12 | use embassy_stm32::ipcc::Config; |
| 13 | use embassy_stm32_wpan::TlMbox; | ||
| 13 | use embassy_time::{Duration, Timer}; | 14 | use embassy_time::{Duration, Timer}; |
| 14 | 15 | ||
| 15 | bind_interrupts!(struct Irqs{ | 16 | bind_interrupts!(struct Irqs{ |
| 16 | IPCC_C1_RX => tl_mbox::ReceiveInterruptHandler; | 17 | IPCC_C1_RX => embassy_stm32_wpan::ReceiveInterruptHandler; |
| 17 | IPCC_C1_TX => tl_mbox::TransmitInterruptHandler; | 18 | IPCC_C1_TX => embassy_stm32_wpan::TransmitInterruptHandler; |
| 18 | }); | 19 | }); |
| 19 | 20 | ||
| 20 | #[embassy_executor::main] | 21 | #[embassy_executor::main] |
| @@ -23,7 +24,7 @@ async fn main(_spawner: Spawner) { | |||
| 23 | info!("Hello World!"); | 24 | info!("Hello World!"); |
| 24 | 25 | ||
| 25 | let config = Config::default(); | 26 | let config = Config::default(); |
| 26 | let mbox = TlMbox::new(p.IPCC, Irqs, config); | 27 | let mbox = TlMbox::init(p.IPCC, Irqs, config); |
| 27 | 28 | ||
| 28 | loop { | 29 | loop { |
| 29 | let wireless_fw_info = mbox.wireless_fw_info(); | 30 | let wireless_fw_info = mbox.wireless_fw_info(); |
