File tree 3 files changed +28
-0
lines changed
3 files changed +28
-0
lines changed Original file line number Diff line number Diff line change @@ -388,6 +388,27 @@ bool audio_dma_get_paused(audio_dma_t *dma) {
388
388
return (control & DMA_CH0_CTRL_TRIG_EN_BITS ) == 0 ;
389
389
}
390
390
391
+ uint32_t audio_dma_pause_all (void ) {
392
+ uint32_t result = 0 ;
393
+ for (size_t channel = 0 ; channel < NUM_DMA_CHANNELS ; channel ++ ) {
394
+ audio_dma_t * dma = MP_STATE_PORT (playing_audio )[channel ];
395
+ if (dma != NULL && !audio_dma_get_paused (dma )) {
396
+ audio_dma_pause (dma );
397
+ result |= (1 << channel );
398
+ }
399
+ }
400
+ return result ;
401
+ }
402
+
403
+ void audio_dma_unpause_mask (uint32_t channel_mask ) {
404
+ for (size_t channel = 0 ; channel < NUM_DMA_CHANNELS ; channel ++ ) {
405
+ audio_dma_t * dma = MP_STATE_PORT (playing_audio )[channel ];
406
+ if (dma != NULL && (channel_mask & (1 << channel ))) {
407
+ audio_dma_resume (dma );
408
+ }
409
+ }
410
+ }
411
+
391
412
void audio_dma_init (audio_dma_t * dma ) {
392
413
dma -> buffer [0 ] = NULL ;
393
414
dma -> buffer [1 ] = NULL ;
Original file line number Diff line number Diff line change @@ -89,4 +89,7 @@ void audio_dma_pause(audio_dma_t *dma);
89
89
void audio_dma_resume (audio_dma_t * dma );
90
90
bool audio_dma_get_paused (audio_dma_t * dma );
91
91
92
+ uint32_t audio_dma_pause_all (void );
93
+ void audio_dma_unpause_mask (uint32_t channel_mask );
94
+
92
95
#endif // MICROPY_INCLUDED_RASPBERRYPI_AUDIO_DMA_OUT_H
Original file line number Diff line number Diff line change 39
39
#include "lib/oofatfs/ff.h"
40
40
#include "shared-bindings/microcontroller/__init__.h"
41
41
42
+ #include "audio_dma.h"
42
43
#include "supervisor/flash.h"
43
44
#include "supervisor/usb.h"
44
45
@@ -97,9 +98,12 @@ void port_internal_flash_flush(void) {
97
98
}
98
99
// Make sure we don't have an interrupt while we do flash operations.
99
100
common_hal_mcu_disable_interrupts ();
101
+ // and audio DMA must be paused as well
102
+ uint32_t channel_mask = audio_dma_pause_all ();
100
103
flash_range_erase (CIRCUITPY_CIRCUITPY_DRIVE_START_ADDR + _cache_lba , SECTOR_SIZE );
101
104
flash_range_program (CIRCUITPY_CIRCUITPY_DRIVE_START_ADDR + _cache_lba , _cache , SECTOR_SIZE );
102
105
_cache_lba = NO_CACHE ;
106
+ audio_dma_unpause_mask (channel_mask );
103
107
common_hal_mcu_enable_interrupts ();
104
108
}
105
109
You can’t perform that action at this time.
0 commit comments