Skip to content

Commit f3333f8

Browse files
authored
Merge pull request #801 from Daft-Freak/pico-extras-dma-sm-alloc
Avoid DMA channel/PIO SM conflicts from scanvideo/audio
2 parents 517fa76 + df0272b commit f3333f8

File tree

4 files changed

+36
-6
lines changed

4 files changed

+36
-6
lines changed

32blit-pico/audio_i2s.cpp

+13-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
#include "audio.hpp"
22
#include "config.h"
33

4+
#include "hardware/dma.h"
5+
#include "hardware/pio.h"
46
#include "pico/audio_i2s.h"
57
#define AUDIO_SAMPLE_FREQ 44100
68

79
#include "audio/audio.hpp"
810

11+
#define audio_pio __CONCAT(pio, PICO_AUDIO_I2S_PIO)
12+
913
static audio_buffer_pool *audio_pool = nullptr;
1014

1115
void init_audio() {
@@ -23,11 +27,18 @@ void init_audio() {
2327
struct audio_buffer_pool *producer_pool = audio_new_producer_pool(&producer_format, 4, 441);
2428
const struct audio_format *output_format;
2529

30+
uint8_t dma_channel = dma_claim_unused_channel(true);
31+
uint8_t pio_sm = pio_claim_unused_sm(audio_pio, true);
32+
33+
// audio_i2s_setup claims
34+
dma_channel_unclaim(dma_channel);
35+
pio_sm_unclaim(audio_pio, pio_sm);
36+
2637
struct audio_i2s_config config = {
2738
.data_pin = PICO_AUDIO_I2S_DATA_PIN,
2839
.clock_pin_base = PICO_AUDIO_I2S_CLOCK_PIN_BASE,
29-
.dma_channel = 1,
30-
.pio_sm = 1,
40+
.dma_channel = dma_channel,
41+
.pio_sm = pio_sm,
3142
};
3243

3344
output_format = audio_i2s_setup(&audio_format, &config);

32blit-pico/audio_pwm.cpp

+12-2
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33

44
#include "pico/audio_pwm.h"
55
#include "hardware/clocks.h"
6+
#include "hardware/dma.h"
67
#include "hardware/pio.h"
78

89
#define AUDIO_SAMPLE_FREQ 22050
910

1011
#include "audio/audio.hpp"
1112

13+
#define audio_pio __CONCAT(pio, PICO_AUDIO_I2S_PIO)
14+
1215
static audio_buffer_pool *audio_pool = nullptr;
1316

1417
void init_audio() {
@@ -26,11 +29,18 @@ void init_audio() {
2629
struct audio_buffer_pool *producer_pool = audio_new_producer_pool(&producer_format, 4, 441);
2730
const struct audio_format *output_format;
2831

32+
uint8_t dma_channel = dma_claim_unused_channel(true);
33+
uint8_t pio_sm = pio_claim_unused_sm(audio_pio, true);
34+
35+
// audio_i2s_setup claims
36+
dma_channel_unclaim(dma_channel);
37+
pio_sm_unclaim(audio_pio, pio_sm);
38+
2939
struct audio_pwm_channel_config audio_pwm_config = {
3040
.core = {
3141
.base_pin = PICO_AUDIO_PWM_MONO_PIN,
32-
.dma_channel = 1,
33-
.pio_sm = 1,
42+
.dma_channel = dma_channel,
43+
.pio_sm = pio_sm,
3444
},
3545
.pattern = 3,
3646
};

32blit-pico/display_scanvideo.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "display.hpp"
22

33
#include "hardware/clocks.h"
4+
#include "hardware/dma.h"
45
#include "pico/time.h"
56
#include "pico/scanvideo.h"
67
#include "pico/scanvideo/composable_scanline.h"
@@ -43,7 +44,12 @@ static void fill_scanline_buffer(struct scanvideo_scanline_buffer *buffer) {
4344
}
4445

4546
void init_display() {
47+
// channel 0 get claimed later, channel 3 doesn't get claimed, but does get used
48+
// reserve them so out claims don't conflict
49+
dma_claim_mask(1 << 0 | 1 << 3);
4650

51+
// PIO SMs that get claimed later
52+
pio_claim_sm_mask(pio0, 1 << 0 | 1 << 3);
4753
}
4854

4955
void update_display(uint32_t time) {
@@ -56,6 +62,10 @@ void update_display(uint32_t time) {
5662
}
5763

5864
void init_display_core1() {
65+
dma_unclaim_mask(1 << 0 | 1 << 3);
66+
pio_sm_unclaim(pio0, 0);
67+
pio_sm_unclaim(pio0, 3);
68+
5969
// no mode switching yet
6070
#if ALLOW_HIRES
6171
#if DISPLAY_HEIGHT == 160 // extra middle mode

32blit-pico/main.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ int main() {
182182
init_input();
183183
init_fs();
184184
init_usb();
185+
init_audio();
185186

186187
#if defined(ENABLE_CORE1)
187188
multicore_launch_core1(core1_main);
@@ -192,8 +193,6 @@ int main() {
192193
blit::render = ::render;
193194
blit::update = ::update;
194195

195-
init_audio();
196-
197196
// user init
198197
::init();
199198

0 commit comments

Comments
 (0)