embassy/embassy-stm32/src/dma/mod.rs

116 lines
2.3 KiB
Rust
Raw Normal View History

2021-07-15 05:42:06 +02:00
#[cfg(dma)]
pub(crate) mod dma;
2023-04-17 00:04:54 +02:00
#[cfg(dma)]
pub use dma::*;
// stm32h7 has both dma and bdma. In that case, we export dma as "main" dma,
// and bdma as "secondary", under `embassy_stm32::dma::bdma`.
#[cfg(all(bdma, dma))]
pub mod bdma;
#[cfg(all(bdma, not(dma)))]
pub(crate) mod bdma;
#[cfg(all(bdma, not(dma)))]
pub use bdma::*;
#[cfg(gpdma)]
pub(crate) mod gpdma;
#[cfg(gpdma)]
pub use gpdma::*;
2021-07-15 05:42:06 +02:00
#[cfg(dmamux)]
mod dmamux;
2021-05-16 02:57:46 +02:00
use core::mem;
2022-06-12 22:15:44 +02:00
use embassy_cortex_m::interrupt::Priority;
2023-04-17 00:04:54 +02:00
use embassy_hal_common::impl_peripheral;
#[cfg(dmamux)]
pub use self::dmamux::*;
2021-11-19 19:15:55 +01:00
2023-04-17 00:04:54 +02:00
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
enum Dir {
MemoryToPeripheral,
PeripheralToMemory,
2021-07-15 05:42:06 +02:00
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
2021-11-19 19:15:55 +01:00
pub enum WordSize {
OneByte,
TwoBytes,
FourBytes,
}
impl WordSize {
pub fn bytes(&self) -> usize {
match self {
Self::OneByte => 1,
Self::TwoBytes => 2,
Self::FourBytes => 4,
}
}
}
2023-04-17 00:04:54 +02:00
mod word_sealed {
pub trait Word {}
}
pub trait Word: word_sealed::Word {
2021-11-19 19:15:55 +01:00
fn bits() -> WordSize;
}
2023-04-17 00:04:54 +02:00
impl word_sealed::Word for u8 {}
2021-11-19 19:15:55 +01:00
impl Word for u8 {
fn bits() -> WordSize {
WordSize::OneByte
}
}
2021-07-15 05:42:06 +02:00
2023-04-17 00:04:54 +02:00
impl word_sealed::Word for u16 {}
2021-11-19 19:15:55 +01:00
impl Word for u16 {
fn bits() -> WordSize {
WordSize::TwoBytes
}
}
2023-04-17 00:04:54 +02:00
impl word_sealed::Word for u32 {}
2021-11-19 19:15:55 +01:00
impl Word for u32 {
fn bits() -> WordSize {
WordSize::FourBytes
}
}
2021-07-15 05:42:06 +02:00
pub struct NoDma;
impl_peripheral!(NoDma);
2021-07-15 05:42:06 +02:00
// TODO: replace transmutes with core::ptr::metadata once it's stable
#[allow(unused)]
pub(crate) fn slice_ptr_parts<T>(slice: *const [T]) -> (usize, usize) {
unsafe { mem::transmute(slice) }
}
#[allow(unused)]
pub(crate) fn slice_ptr_parts_mut<T>(slice: *mut [T]) -> (usize, usize) {
unsafe { mem::transmute(slice) }
}
2023-04-17 00:04:54 +02:00
// safety: must be called only once at startup
pub(crate) unsafe fn init(
#[cfg(bdma)] bdma_priority: Priority,
#[cfg(dma)] dma_priority: Priority,
#[cfg(gpdma)] gpdma_priority: Priority,
) {
#[cfg(bdma)]
bdma::init(bdma_priority);
#[cfg(dma)]
dma::init(dma_priority);
#[cfg(gpdma)]
gpdma::init(gpdma_priority);
#[cfg(dmamux)]
dmamux::init();
}