Simplify some of the bdma macros.

Make more things associated consts.
This commit is contained in:
Bob McWhirter 2021-07-13 09:59:36 -04:00
parent 92247369e7
commit 8fbea38a5b

View File

@ -150,7 +150,7 @@ unsafe fn on_irq() {
(bdma, $dma:ident) => { (bdma, $dma:ident) => {
let isr = pac::$dma.isr().read(); let isr = pac::$dma.isr().read();
pac::$dma.ifcr().write_value(isr); pac::$dma.ifcr().write_value(isr);
let dman = <crate::peripherals::$dma as sealed::Dma>::num() as usize; let dman = <crate::peripherals::$dma as sealed::Dma>::NUM as usize;
for chn in 0..crate::pac::dma_channels_count!($dma) { for chn in 0..crate::pac::dma_channels_count!($dma) {
let n = dman * 8 + chn; let n = dman * 8 + chn;
@ -186,18 +186,18 @@ pub(crate) mod sealed {
use super::*; use super::*;
pub trait Dma { pub trait Dma {
fn num() -> u8; const NUM: u8;
} }
pub trait Channel { pub trait Channel {
const CH_NUM: u8;
fn dma_regs() -> pac::bdma::Dma; fn dma_regs() -> pac::bdma::Dma;
fn state_num(&self) -> usize; fn state_num(&self) -> usize;
fn ch_num(&self) -> u8;
fn regs(&self) -> pac::bdma::Ch { fn regs(&self) -> pac::bdma::Ch {
Self::dma_regs().ch(self.ch_num() as usize) Self::dma_regs().ch(Self::CH_NUM as usize)
} }
} }
} }
@ -206,31 +206,27 @@ pub trait Dma: sealed::Dma + Sized {}
pub trait Channel: sealed::Channel + Sized {} pub trait Channel: sealed::Channel + Sized {}
macro_rules! impl_dma { macro_rules! impl_dma {
($peri:ident, $num:expr) => { ($peri:ident) => {
impl Dma for crate::peripherals::$peri {} impl Dma for crate::peripherals::$peri {}
impl sealed::Dma for crate::peripherals::$peri { impl sealed::Dma for crate::peripherals::$peri {
fn num() -> u8 { const NUM: u8 = dma_num!($peri);
$num
}
} }
}; };
} }
macro_rules! impl_dma_channel { macro_rules! impl_dma_channel {
($channel_peri:ident, $dma_peri:ident, $dma_num:expr, $ch_num:expr) => { ($channel_peri:ident, $dma_peri:ident, $ch_num:expr) => {
impl Channel for crate::peripherals::$channel_peri {} impl Channel for crate::peripherals::$channel_peri {}
impl sealed::Channel for crate::peripherals::$channel_peri { impl sealed::Channel for crate::peripherals::$channel_peri {
const CH_NUM: u8 = $ch_num;
#[inline] #[inline]
fn dma_regs() -> pac::bdma::Dma { fn dma_regs() -> pac::bdma::Dma {
crate::pac::$dma_peri crate::pac::$dma_peri
} }
fn state_num(&self) -> usize { fn state_num(&self) -> usize {
($dma_num * 8) + $ch_num (dma_num!($dma_peri) * 8) + $ch_num
}
fn ch_num(&self) -> u8 {
$ch_num
} }
} }
@ -363,31 +359,26 @@ macro_rules! impl_dma_channel {
}; };
} }
macro_rules! dma_num {
(DMA1) => {
0
};
(DMA2) => {
1
};
(BDMA) => {
0
};
}
pac::peripherals! { pac::peripherals! {
(bdma, DMA1) => { (bdma, $peri:ident) => {
impl_dma!(DMA1, 0); impl_dma!($peri);
pac::bdma_channels! {
($channel_peri:ident, DMA1, $channel_num:expr) => {
impl_dma_channel!($channel_peri, DMA1, 0, $channel_num);
}; };
} }
};
(bdma, DMA2) => {
impl_dma!(DMA2, 1);
pac::bdma_channels! { pac::bdma_channels! {
($channel_peri:ident, DMA2, $channel_num:expr) => { ($channel_peri:ident, $dma_peri:ident, $channel_num:expr) => {
impl_dma_channel!($channel_peri, DMA2, 1, $channel_num); impl_dma_channel!($channel_peri, $dma_peri, $channel_num);
};
}
};
// Because H7cm changes the naming
(bdma, BDMA) => {
impl_dma!(BDMA, 0);
pac::bdma_channels! {
($channel_peri:ident, BDMA, $channel_num:expr) => {
impl_dma_channel!($channel_peri, BDMA, 0, $channel_num);
};
}
}; };
} }