From fe66f0f8f83e03d3ab9bf766ffe41ecd6a0c7a38 Mon Sep 17 00:00:00 2001 From: Bob McWhirter Date: Tue, 20 Jul 2021 09:19:23 -0400 Subject: [PATCH] Checkpoint. --- embassy-stm32/src/spi/mod.rs | 29 ++++++++++++++++++--- embassy-stm32/src/spi/v3.rs | 50 ++++++++++++++++++++++++++++++------ 2 files changed, 68 insertions(+), 11 deletions(-) diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs index 9b04c03a..91b3d4ab 100644 --- a/embassy-stm32/src/spi/mod.rs +++ b/embassy-stm32/src/spi/mod.rs @@ -1,13 +1,14 @@ #![macro_use] -#[cfg_attr(spi_v1, path = "v1.rs")] -#[cfg_attr(spi_v2, path = "v2.rs")] +//#[cfg_attr(spi_v1, path = "v1.rs")] +//#[cfg_attr(spi_v2, path = "v2.rs")] #[cfg_attr(spi_v3, path = "v3.rs")] mod _version; -use crate::{peripherals, rcc::RccPeripheral}; +use crate::{dma, peripherals, rcc::RccPeripheral}; pub use _version::*; use crate::gpio::Pin; +use core::marker::PhantomData; #[cfg_attr(feature = "defmt", derive(defmt::Format))] pub enum Error { @@ -62,6 +63,14 @@ pub(crate) mod sealed { pub trait MisoPin: Pin { fn af_num(&self) -> u8; } + + pub trait TxDmaChannel { + fn request(&self) -> dma::Request; + } + + pub trait RxDmaChannel { + fn request(&self) -> dma::Request; + } } pub trait Instance: sealed::Instance + RccPeripheral + 'static {} @@ -72,6 +81,20 @@ pub trait MosiPin: sealed::MosiPin + 'static {} pub trait MisoPin: sealed::MisoPin + 'static {} +pub trait TxDmaChannel: sealed::TxDmaChannel + 'static {} + +pub trait RxDmaChannel: sealed::RxDmaChannel + 'static {} + +pub trait SpiDma {} + +pub struct DmaPair, Rx: RxDmaChannel> { + tx: Tx, + rx: Rx, + _phantom: PhantomData, +} + +impl, Rx: RxDmaChannel> SpiDma for DmaPair {} + crate::pac::peripherals!( (spi, $inst:ident) => { impl sealed::Instance for peripherals::$inst { diff --git a/embassy-stm32/src/spi/v3.rs b/embassy-stm32/src/spi/v3.rs index 0b4a7145..2c6d4415 100644 --- a/embassy-stm32/src/spi/v3.rs +++ b/embassy-stm32/src/spi/v3.rs @@ -4,7 +4,10 @@ use crate::gpio::{AnyPin, Pin}; use crate::pac::gpio::vals::{Afr, Moder}; use crate::pac::gpio::Gpio; use crate::pac::spi; -use crate::spi::{ByteOrder, Config, Error, Instance, MisoPin, MosiPin, SckPin, WordSize}; +use crate::spi::{ + ByteOrder, Config, DmaPair, Error, Instance, MisoPin, MosiPin, RxDmaChannel, SckPin, SpiDma, + TxDmaChannel, WordSize, +}; use crate::time::Hertz; use core::marker::PhantomData; use core::ptr; @@ -28,26 +31,28 @@ impl WordSize { } } -pub struct Spi<'d, T: Instance> { +pub struct Spi<'d, T: Instance, D = NoDma> { sck: AnyPin, mosi: AnyPin, miso: AnyPin, + dma: D, phantom: PhantomData<&'d mut T>, } -impl<'d, T: Instance> Spi<'d, T> { +impl<'d, T: Instance, D> Spi<'d, T, D> { pub fn new( _peri: impl Unborrow + 'd, sck: impl Unborrow>, mosi: impl Unborrow>, miso: impl Unborrow>, + dma: impl Unborrow, freq: F, config: Config, ) -> Self where F: Into, { - unborrow!(sck, mosi, miso); + unborrow!(sck, mosi, miso, dma); unsafe { Self::configure_pin(sck.block(), sck.pin() as _, sck.af_num()); @@ -113,6 +118,7 @@ impl<'d, T: Instance> Spi<'d, T> { sck, mosi, miso, + dma, phantom: PhantomData, } } @@ -173,7 +179,7 @@ impl<'d, T: Instance> Drop for Spi<'d, T> { } } -impl<'d, T: Instance> embedded_hal::blocking::spi::Write for Spi<'d, T> { +impl<'d, T: Instance> embedded_hal::blocking::spi::Write for Spi<'d, T, NoDma> { type Error = Error; fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> { @@ -210,7 +216,7 @@ impl<'d, T: Instance> embedded_hal::blocking::spi::Write for Spi<'d, T> { } } -impl<'d, T: Instance> embedded_hal::blocking::spi::Transfer for Spi<'d, T> { +impl<'d, T: Instance> embedded_hal::blocking::spi::Transfer for Spi<'d, T, NoDma> { type Error = Error; fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], Self::Error> { @@ -267,7 +273,7 @@ impl<'d, T: Instance> embedded_hal::blocking::spi::Transfer for Spi<'d, T> { } } -impl<'d, T: Instance> embedded_hal::blocking::spi::Write for Spi<'d, T> { +impl<'d, T: Instance> embedded_hal::blocking::spi::Write for Spi<'d, T, NoDma> { type Error = Error; fn write(&mut self, words: &[u16]) -> Result<(), Self::Error> { @@ -304,7 +310,7 @@ impl<'d, T: Instance> embedded_hal::blocking::spi::Write for Spi<'d, T> { } } -impl<'d, T: Instance> embedded_hal::blocking::spi::Transfer for Spi<'d, T> { +impl<'d, T: Instance> embedded_hal::blocking::spi::Transfer for Spi<'d, T, NoDma> { type Error = Error; fn transfer<'w>(&mut self, words: &'w mut [u16]) -> Result<&'w [u16], Self::Error> { @@ -357,3 +363,31 @@ impl<'d, T: Instance> embedded_hal::blocking::spi::Transfer for Spi<'d, T> Ok(words) } } + +use crate::dma::NoDma; +use core::future::Future; +use embassy_traits::spi::FullDuplex; + +#[rustfmt::skip] +impl<'d, T: Instance, Tx: TxDmaChannel, Rx: RxDmaChannel> FullDuplex for Spi<'d, T, DmaPair> { + type Error = super::Error; + type WriteFuture<'a> where Self: 'a = impl Future> + 'a; + type ReadFuture<'a> where Self: 'a = impl Future> + 'a; + type WriteReadFuture<'a> where Self: 'a = impl Future> + 'a; + + fn read<'a>(&'a mut self, data: &'a mut [u8]) -> Self::ReadFuture<'a> { + unimplemented!() + } + + fn write<'a>(&'a mut self, data: &'a [u8]) -> Self::WriteFuture<'a> { + unimplemented!() + } + + fn read_write<'a>( + &'a mut self, + read: &'a mut [u8], + write: &'a [u8], + ) -> Self::WriteReadFuture<'a> { + unimplemented!() + } +}