@@ -98,18 +98,16 @@ STATIC uint32_t rp2_dma_register_value_from_obj(mp_obj_t o, int reg_type) {
98
98
STATIC void rp2_dma_irq_handler (void ) {
99
99
// Main IRQ handler
100
100
uint32_t irq_bits = dma_hw -> ints0 ;
101
- dma_hw -> ints0 = 0xffff ;
102
101
103
102
for (int i = 0 ; i < NUM_DMA_CHANNELS ; i ++ ) {
104
103
if (irq_bits & (1u << i )) {
105
104
mp_irq_obj_t * handler = MP_STATE_PORT (rp2_dma_irq_obj [i ]);
106
105
if (handler ) {
106
+ // An rp2.DMA IRQ handler is registered for this channel, so handle it.
107
+ dma_channel_acknowledge_irq0 (i );
107
108
rp2_dma_obj_t * self = (rp2_dma_obj_t * )handler -> parent ;
108
109
self -> irq_flag = 1 ;
109
110
mp_irq_handler (handler );
110
- } else {
111
- // We got an interrupt with no handler. Disable the channel
112
- dma_channel_set_irq0_enabled (i , false);
113
111
}
114
112
}
115
113
}
@@ -389,6 +387,9 @@ STATIC mp_obj_t rp2_dma_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_t *k
389
387
if (irq == NULL ) {
390
388
irq = mp_irq_new (& rp2_dma_irq_methods , MP_OBJ_FROM_PTR (self ));
391
389
MP_STATE_PORT (rp2_dma_irq_obj [self -> channel ]) = irq ;
390
+
391
+ // Clear any existing IRQs on this DMA channel, they are not for us.
392
+ dma_channel_acknowledge_irq0 (self -> channel );
392
393
}
393
394
394
395
if (n_args > 1 || kw_args -> used != 0 ) {
@@ -457,12 +458,11 @@ MP_DEFINE_CONST_OBJ_TYPE(
457
458
void rp2_dma_init (void ) {
458
459
// Set up interrupts.
459
460
memset (MP_STATE_PORT (rp2_dma_irq_obj ), 0 , sizeof (MP_STATE_PORT (rp2_dma_irq_obj )));
460
- irq_set_exclusive_handler (DMA_IRQ_0 , rp2_dma_irq_handler );
461
+ irq_add_shared_handler (DMA_IRQ_0 , rp2_dma_irq_handler , PICO_SHARED_IRQ_HANDLER_DEFAULT_ORDER_PRIORITY );
461
462
}
462
463
463
464
void rp2_dma_deinit (void ) {
464
- // Disable and clear interrupts.
465
- irq_set_mask_enabled (1u << DMA_IRQ_0 , false);
465
+ // Remove our interrupt handler.
466
466
irq_remove_handler (DMA_IRQ_0 , rp2_dma_irq_handler );
467
467
}
468
468
0 commit comments