stm32/dma: fix h7 impls

This commit is contained in:
Dario Nieuwenhuis
2021-07-15 06:31:54 +02:00
committed by Bob McWhirter
parent 2ee20f5dcb
commit 63a0e188ea
3 changed files with 65 additions and 23 deletions

View File

@ -138,7 +138,6 @@ unsafe fn on_irq() {
}
}
/// safety: must be called only once
pub(crate) unsafe fn init() {
pac::interrupts! {
@ -212,6 +211,9 @@ pac::bdma_channels! {
};
}
// HACK: on stm32h7 "DMA" interrupts are for DMA, not BDMA, so this
// would cause duplicate interrupt definitions. Do it manually insted
#[cfg(not(rcc_h7))]
pac::interrupts! {
(DMA, $irq:ident) => {
#[crate::interrupt]
@ -220,3 +222,41 @@ pac::interrupts! {
}
};
}
#[cfg(rcc_h7)]
mod _if_h7 {
use super::*;
#[crate::interrupt]
unsafe fn BDMA_CHANNEL0() {
on_irq()
}
#[crate::interrupt]
unsafe fn BDMA_CHANNEL1() {
on_irq()
}
#[crate::interrupt]
unsafe fn BDMA_CHANNEL2() {
on_irq()
}
#[crate::interrupt]
unsafe fn BDMA_CHANNEL3() {
on_irq()
}
#[crate::interrupt]
unsafe fn BDMA_CHANNEL4() {
on_irq()
}
#[crate::interrupt]
unsafe fn BDMA_CHANNEL5() {
on_irq()
}
#[crate::interrupt]
unsafe fn BDMA_CHANNEL6() {
on_irq()
}
#[crate::interrupt]
unsafe fn BDMA_CHANNEL7() {
on_irq()
}
}

View File

@ -31,28 +31,33 @@ macro_rules! dma_num {
(DMA2) => {
1
};
(BDMA) => {
0
};
}
macro_rules! dmamux_peri {
(DMA1) => {
crate::pac::DMAMUX1
};
(DMA2) => {
crate::pac::DMAMUX1
};
(BDMA) => {
crate::pac::DMAMUX1
};
}
#[cfg(not(rcc_h7))]
pac::bdma_channels! {
($channel_peri:ident, $dma_peri:ident, $channel_num:expr) => {
impl MuxChannel for peripherals::$channel_peri {
const DMAMUX_CH_NUM: u8 = (dma_num!($dma_peri) * 8) + $channel_num;
const DMAMUX_REGS: pac::dmamux::Dmamux = dmamux_peri!($dma_peri);
const DMAMUX_REGS: pac::dmamux::Dmamux = pac::DMAMUX1;
}
};
}
#[cfg(rcc_h7)]
pac::dma_channels! {
($channel_peri:ident, $dma_peri:ident, $channel_num:expr) => {
impl MuxChannel for peripherals::$channel_peri {
const DMAMUX_CH_NUM: u8 = (dma_num!($dma_peri) * 8) + $channel_num;
const DMAMUX_REGS: pac::dmamux::Dmamux = pac::DMAMUX1;
}
};
}
#[cfg(rcc_h7)]
pac::bdma_channels! {
($channel_peri:ident, $dma_peri:ident, $channel_num:expr) => {
impl MuxChannel for peripherals::$channel_peri {
const DMAMUX_CH_NUM: u8 = $channel_num;
const DMAMUX_REGS: pac::dmamux::Dmamux = pac::DMAMUX2;
}
};
}