From 65f849a589be78f8f5dce2311614982ee96bbae5 Mon Sep 17 00:00:00 2001 From: Matt Johnston Date: Thu, 3 Apr 2025 10:48:29 +0800 Subject: [PATCH] stm32: xspi update for Peri --- embassy-stm32/src/xspi/mod.rs | 264 +++++++++++++++++----------------- 1 file changed, 131 insertions(+), 133 deletions(-) diff --git a/embassy-stm32/src/xspi/mod.rs b/embassy-stm32/src/xspi/mod.rs index 3b5406a57..c024b2ed6 100644 --- a/embassy-stm32/src/xspi/mod.rs +++ b/embassy-stm32/src/xspi/mod.rs @@ -8,7 +8,7 @@ pub mod enums; use core::marker::PhantomData; use embassy_embedded_hal::{GetConfig, SetConfig}; -use embassy_hal_internal::{into_ref, PeripheralRef}; +use embassy_hal_internal::PeripheralType; pub use enums::*; use crate::dma::{word, ChannelAndRequest}; @@ -19,7 +19,7 @@ use crate::pac::xspi::Xspi as Regs; #[cfg(xspim_v1)] use crate::pac::xspim::Xspim; use crate::rcc::{self, RccPeripheral}; -use crate::{peripherals, Peripheral}; +use crate::{peripherals, Peri}; /// XPSI driver config. #[derive(Clone, Copy)] @@ -157,28 +157,28 @@ pub enum XspiError { /// XSPI driver. pub struct Xspi<'d, T: Instance, M: PeriMode> { - _peri: PeripheralRef<'d, T>, - clk: Option>, - d0: Option>, - d1: Option>, - d2: Option>, - d3: Option>, - d4: Option>, - d5: Option>, - d6: Option>, - d7: Option>, - d8: Option>, - d9: Option>, - d10: Option>, - d11: Option>, - d12: Option>, - d13: Option>, - d14: Option>, - d15: Option>, - ncs1: Option>, - ncs2: Option>, - dqs0: Option>, - dqs1: Option>, + _peri: Peri<'d, T>, + clk: Option>, + d0: Option>, + d1: Option>, + d2: Option>, + d3: Option>, + d4: Option>, + d5: Option>, + d6: Option>, + d7: Option>, + d8: Option>, + d9: Option>, + d10: Option>, + d11: Option>, + d12: Option>, + d13: Option>, + d14: Option>, + d15: Option>, + ncs1: Option>, + ncs2: Option>, + dqs0: Option>, + dqs1: Option>, dma: Option>, _phantom: PhantomData, config: Config, @@ -251,35 +251,33 @@ impl<'d, T: Instance, M: PeriMode> Xspi<'d, T, M> { } fn new_inner( - peri: impl Peripheral

+ 'd, - d0: Option>, - d1: Option>, - d2: Option>, - d3: Option>, - d4: Option>, - d5: Option>, - d6: Option>, - d7: Option>, - d8: Option>, - d9: Option>, - d10: Option>, - d11: Option>, - d12: Option>, - d13: Option>, - d14: Option>, - d15: Option>, - clk: Option>, - ncs1: Option>, - ncs2: Option>, - dqs0: Option>, - dqs1: Option>, + peri: Peri<'d, T>, + d0: Option>, + d1: Option>, + d2: Option>, + d3: Option>, + d4: Option>, + d5: Option>, + d6: Option>, + d7: Option>, + d8: Option>, + d9: Option>, + d10: Option>, + d11: Option>, + d12: Option>, + d13: Option>, + d14: Option>, + d15: Option>, + clk: Option>, + ncs1: Option>, + ncs2: Option>, + dqs0: Option>, + dqs1: Option>, dma: Option>, config: Config, width: XspiWidth, dual_quad: bool, ) -> Self { - into_ref!(peri); - #[cfg(xspim_v1)] { // RCC for xspim should be enabled before writing register @@ -656,11 +654,11 @@ impl<'d, T: Instance, M: PeriMode> Xspi<'d, T, M> { impl<'d, T: Instance> Xspi<'d, T, Blocking> { /// Create new blocking XSPI driver for a single spi external chip pub fn new_blocking_singlespi( - peri: impl Peripheral

+ 'd, - clk: impl Peripheral

> + 'd, - d0: impl Peripheral

> + 'd, - d1: impl Peripheral

> + 'd, - ncs: impl Peripheral

> + 'd, + peri: Peri<'d, T>, + clk: Peri<'d, impl CLKPin>, + d0: Peri<'d, impl D0Pin>, + d1: Peri<'d, impl D1Pin>, + ncs: Peri<'d, impl NCS1Pin>, config: Config, ) -> Self { Self::new_inner( @@ -695,11 +693,11 @@ impl<'d, T: Instance> Xspi<'d, T, Blocking> { /// Create new blocking XSPI driver for a dualspi external chip pub fn new_blocking_dualspi( - peri: impl Peripheral

+ 'd, - clk: impl Peripheral

> + 'd, - d0: impl Peripheral

> + 'd, - d1: impl Peripheral

> + 'd, - ncs: impl Peripheral

> + 'd, + peri: Peri<'d, T>, + clk: Peri<'d, impl CLKPin>, + d0: Peri<'d, impl D0Pin>, + d1: Peri<'d, impl D1Pin>, + ncs: Peri<'d, impl NCS1Pin>, config: Config, ) -> Self { Self::new_inner( @@ -737,13 +735,13 @@ impl<'d, T: Instance> Xspi<'d, T, Blocking> { /// Create new blocking XSPI driver for a quadspi external chip pub fn new_blocking_quadspi( - peri: impl Peripheral

+ 'd, - clk: impl Peripheral

> + 'd, - d0: impl Peripheral

> + 'd, - d1: impl Peripheral

> + 'd, - d2: impl Peripheral

> + 'd, - d3: impl Peripheral

> + 'd, - ncs: impl Peripheral

> + 'd, + peri: Peri<'d, T>, + clk: Peri<'d, impl CLKPin>, + d0: Peri<'d, impl D0Pin>, + d1: Peri<'d, impl D1Pin>, + d2: Peri<'d, impl D2Pin>, + d3: Peri<'d, impl D3Pin>, + ncs: Peri<'d, impl NCS1Pin>, config: Config, ) -> Self { Self::new_inner( @@ -781,17 +779,17 @@ impl<'d, T: Instance> Xspi<'d, T, Blocking> { /// Create new blocking XSPI driver for two quadspi external chips pub fn new_blocking_dualquadspi( - peri: impl Peripheral

+ 'd, - clk: impl Peripheral

> + 'd, - d0: impl Peripheral

> + 'd, - d1: impl Peripheral

> + 'd, - d2: impl Peripheral

> + 'd, - d3: impl Peripheral

> + 'd, - d4: impl Peripheral

> + 'd, - d5: impl Peripheral

> + 'd, - d6: impl Peripheral

> + 'd, - d7: impl Peripheral

> + 'd, - ncs: impl Peripheral

> + 'd, + peri: Peri<'d, T>, + clk: Peri<'d, impl CLKPin>, + d0: Peri<'d, impl D0Pin>, + d1: Peri<'d, impl D1Pin>, + d2: Peri<'d, impl D2Pin>, + d3: Peri<'d, impl D3Pin>, + d4: Peri<'d, impl D4Pin>, + d5: Peri<'d, impl D5Pin>, + d6: Peri<'d, impl D6Pin>, + d7: Peri<'d, impl D7Pin>, + ncs: Peri<'d, impl NCS1Pin>, config: Config, ) -> Self { Self::new_inner( @@ -829,17 +827,17 @@ impl<'d, T: Instance> Xspi<'d, T, Blocking> { /// Create new blocking XSPI driver for xspi external chips pub fn new_blocking_xspi( - peri: impl Peripheral

+ 'd, - clk: impl Peripheral

> + 'd, - d0: impl Peripheral

> + 'd, - d1: impl Peripheral

> + 'd, - d2: impl Peripheral

> + 'd, - d3: impl Peripheral

> + 'd, - d4: impl Peripheral

> + 'd, - d5: impl Peripheral

> + 'd, - d6: impl Peripheral

> + 'd, - d7: impl Peripheral

> + 'd, - ncs: impl Peripheral

> + 'd, + peri: Peri<'d, T>, + clk: Peri<'d, impl CLKPin>, + d0: Peri<'d, impl D0Pin>, + d1: Peri<'d, impl D1Pin>, + d2: Peri<'d, impl D2Pin>, + d3: Peri<'d, impl D3Pin>, + d4: Peri<'d, impl D4Pin>, + d5: Peri<'d, impl D5Pin>, + d6: Peri<'d, impl D6Pin>, + d7: Peri<'d, impl D7Pin>, + ncs: Peri<'d, impl NCS1Pin>, config: Config, ) -> Self { Self::new_inner( @@ -879,12 +877,12 @@ impl<'d, T: Instance> Xspi<'d, T, Blocking> { impl<'d, T: Instance> Xspi<'d, T, Async> { /// Create new blocking XSPI driver for a single spi external chip pub fn new_singlespi( - peri: impl Peripheral

+ 'd, - clk: impl Peripheral

> + 'd, - d0: impl Peripheral

> + 'd, - d1: impl Peripheral

> + 'd, - ncs: impl Peripheral

> + 'd, - dma: impl Peripheral

> + 'd, + peri: Peri<'d, T>, + clk: Peri<'d, impl CLKPin>, + d0: Peri<'d, impl D0Pin>, + d1: Peri<'d, impl D1Pin>, + ncs: Peri<'d, impl NCS1Pin>, + dma: Peri<'d, impl XDma>, config: Config, ) -> Self { Self::new_inner( @@ -919,12 +917,12 @@ impl<'d, T: Instance> Xspi<'d, T, Async> { /// Create new blocking XSPI driver for a dualspi external chip pub fn new_dualspi( - peri: impl Peripheral

+ 'd, - clk: impl Peripheral

> + 'd, - d0: impl Peripheral

> + 'd, - d1: impl Peripheral

> + 'd, - ncs: impl Peripheral

> + 'd, - dma: impl Peripheral

> + 'd, + peri: Peri<'d, T>, + clk: Peri<'d, impl CLKPin>, + d0: Peri<'d, impl D0Pin>, + d1: Peri<'d, impl D1Pin>, + ncs: Peri<'d, impl NCS1Pin>, + dma: Peri<'d, impl XDma>, config: Config, ) -> Self { Self::new_inner( @@ -962,14 +960,14 @@ impl<'d, T: Instance> Xspi<'d, T, Async> { /// Create new blocking XSPI driver for a quadspi external chip pub fn new_quadspi( - peri: impl Peripheral

+ 'd, - clk: impl Peripheral

> + 'd, - d0: impl Peripheral

> + 'd, - d1: impl Peripheral

> + 'd, - d2: impl Peripheral

> + 'd, - d3: impl Peripheral

> + 'd, - ncs: impl Peripheral

> + 'd, - dma: impl Peripheral

> + 'd, + peri: Peri<'d, T>, + clk: Peri<'d, impl CLKPin>, + d0: Peri<'d, impl D0Pin>, + d1: Peri<'d, impl D1Pin>, + d2: Peri<'d, impl D2Pin>, + d3: Peri<'d, impl D3Pin>, + ncs: Peri<'d, impl NCS1Pin>, + dma: Peri<'d, impl XDma>, config: Config, ) -> Self { Self::new_inner( @@ -1007,18 +1005,18 @@ impl<'d, T: Instance> Xspi<'d, T, Async> { /// Create new blocking XSPI driver for two quadspi external chips pub fn new_dualquadspi( - peri: impl Peripheral

+ 'd, - clk: impl Peripheral

> + 'd, - d0: impl Peripheral

> + 'd, - d1: impl Peripheral

> + 'd, - d2: impl Peripheral

> + 'd, - d3: impl Peripheral

> + 'd, - d4: impl Peripheral

> + 'd, - d5: impl Peripheral

> + 'd, - d6: impl Peripheral

> + 'd, - d7: impl Peripheral

> + 'd, - ncs: impl Peripheral

> + 'd, - dma: impl Peripheral

> + 'd, + peri: Peri<'d, T>, + clk: Peri<'d, impl CLKPin>, + d0: Peri<'d, impl D0Pin>, + d1: Peri<'d, impl D1Pin>, + d2: Peri<'d, impl D2Pin>, + d3: Peri<'d, impl D3Pin>, + d4: Peri<'d, impl D4Pin>, + d5: Peri<'d, impl D5Pin>, + d6: Peri<'d, impl D6Pin>, + d7: Peri<'d, impl D7Pin>, + ncs: Peri<'d, impl NCS1Pin>, + dma: Peri<'d, impl XDma>, config: Config, ) -> Self { Self::new_inner( @@ -1056,18 +1054,18 @@ impl<'d, T: Instance> Xspi<'d, T, Async> { /// Create new blocking XSPI driver for xspi external chips pub fn new_xspi( - peri: impl Peripheral

+ 'd, - clk: impl Peripheral

> + 'd, - d0: impl Peripheral

> + 'd, - d1: impl Peripheral

> + 'd, - d2: impl Peripheral

> + 'd, - d3: impl Peripheral

> + 'd, - d4: impl Peripheral

> + 'd, - d5: impl Peripheral

> + 'd, - d6: impl Peripheral

> + 'd, - d7: impl Peripheral

> + 'd, - ncs: impl Peripheral

> + 'd, - dma: impl Peripheral

> + 'd, + peri: Peri<'d, T>, + clk: Peri<'d, impl CLKPin>, + d0: Peri<'d, impl D0Pin>, + d1: Peri<'d, impl D1Pin>, + d2: Peri<'d, impl D2Pin>, + d3: Peri<'d, impl D3Pin>, + d4: Peri<'d, impl D4Pin>, + d5: Peri<'d, impl D5Pin>, + d6: Peri<'d, impl D6Pin>, + d7: Peri<'d, impl D7Pin>, + ncs: Peri<'d, impl NCS1Pin>, + dma: Peri<'d, impl XDma>, config: Config, ) -> Self { Self::new_inner( @@ -1296,12 +1294,12 @@ pub(crate) trait SealedInstance { /// XSPI instance trait. #[cfg(xspim_v1)] #[allow(private_bounds)] -pub trait Instance: Peripheral

+ SealedInstance + RccPeripheral + SealedXspimInstance {} +pub trait Instance: SealedInstance + PeripheralType + RccPeripheral + SealedXspimInstance {} /// XSPI instance trait. #[cfg(not(xspim_v1))] #[allow(private_bounds)] -pub trait Instance: Peripheral

+ SealedInstance + RccPeripheral {} +pub trait Instance: SealedInstance + PeripheralType + RccPeripheral {} pin_trait!(D0Pin, Instance); pin_trait!(D1Pin, Instance);