diff options
| -rw-r--r-- | embassy-rp/src/dma.rs | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/embassy-rp/src/dma.rs b/embassy-rp/src/dma.rs index 25e3ec8fc..6423d1938 100644 --- a/embassy-rp/src/dma.rs +++ b/embassy-rp/src/dma.rs | |||
| @@ -14,8 +14,18 @@ use crate::{interrupt, pac, peripherals}; | |||
| 14 | #[interrupt] | 14 | #[interrupt] |
| 15 | unsafe fn DMA_IRQ_0() { | 15 | unsafe fn DMA_IRQ_0() { |
| 16 | let ints0 = pac::DMA.ints0().read().ints0(); | 16 | let ints0 = pac::DMA.ints0().read().ints0(); |
| 17 | |||
| 18 | for channel in 0..CHANNEL_COUNT { | 17 | for channel in 0..CHANNEL_COUNT { |
| 18 | let ctrl_trig = pac::DMA.ch(channel).ctrl_trig().read(); | ||
| 19 | if ctrl_trig.ahb_error() { | ||
| 20 | panic!("DMA: ahb error on DMA_0 channel {}", channel); | ||
| 21 | } | ||
| 22 | if ctrl_trig.read_error() { | ||
| 23 | panic!("DMA: read error on DMA_0 channel {}", channel); | ||
| 24 | } | ||
| 25 | if ctrl_trig.write_error() { | ||
| 26 | panic!("DMA: write error on DMA_0 channel {}", channel); | ||
| 27 | } | ||
| 28 | |||
| 19 | if ints0 & (1 << channel) == (1 << channel) { | 29 | if ints0 & (1 << channel) == (1 << channel) { |
| 20 | CHANNEL_WAKERS[channel].wake(); | 30 | CHANNEL_WAKERS[channel].wake(); |
| 21 | } | 31 | } |
| @@ -119,7 +129,9 @@ impl<'a, C: Channel> Drop for Transfer<'a, C> { | |||
| 119 | fn drop(&mut self) { | 129 | fn drop(&mut self) { |
| 120 | let p = self.channel.regs(); | 130 | let p = self.channel.regs(); |
| 121 | unsafe { | 131 | unsafe { |
| 122 | p.ctrl_trig().write(|w| w.set_en(false)); | 132 | pac::DMA |
| 133 | .chan_abort() | ||
| 134 | .modify(|m| m.set_chan_abort(1 << self.channel.number())); | ||
| 123 | while p.ctrl_trig().read().busy() {} | 135 | while p.ctrl_trig().read().busy() {} |
| 124 | } | 136 | } |
| 125 | } | 137 | } |
