15 # error "Wrong implementation included for this platform" 21 #define MOZZI_FAST_ANALOG_IMPLEMENTED 30 #include <hardware/adc.h> 31 #include <hardware/dma.h> 33 #define getADCReading() rp2040_adc_result 34 #define channelNumToIndex(channel) channel 36 inline void adc_run_once () {
37 hw_set_bits(&adc_hw->cs, ADC_CS_START_ONCE_BITS);
40 uint8_t adcPinToChannelNum(uint8_t pin) {
41 if (pin >= 26) pin -= 26;
46 void adcStartConversion(uint8_t channel) {
47 adc_select_input(channel);
52 void startSecondADCReadOnCurrentChannel() {
58 if (speed == FAST_ADC) {
60 }
else if (speed == FASTER_ADC) {
67 void rp2040_adc_queue_handler();
69 static uint16_t rp2040_adc_result = 0;
70 int rp2040_adc_dma_chan;
71 void setupMozziADC(int8_t speed) {
72 for (
int i = 0; i < NUM_ANALOG_INPUTS; ++i) {
85 uint dma_chan = dma_claim_unused_channel(
true);
86 rp2040_adc_dma_chan = dma_chan;
87 static dma_channel_config cfg = dma_channel_get_default_config(dma_chan);
90 channel_config_set_transfer_data_size(&cfg, DMA_SIZE_16);
91 channel_config_set_read_increment(&cfg,
false);
92 channel_config_set_write_increment(&cfg,
false);
95 channel_config_set_dreq(&cfg, DREQ_ADC);
97 dma_channel_configure(dma_chan, &cfg,
105 dma_channel_set_irq0_enabled(dma_chan,
true);
106 irq_add_shared_handler(DMA_IRQ_0, rp2040_adc_queue_handler, PICO_SHARED_IRQ_HANDLER_DEFAULT_ORDER_PRIORITY);
107 irq_set_enabled(DMA_IRQ_0,
true);
108 dma_channel_start(dma_chan);
111 void rp2040_adc_queue_handler() {
112 if (!dma_channel_get_irq0_status(rp2040_adc_dma_chan))
return;
113 dma_channel_acknowledge_irq0(rp2040_adc_dma_chan);
116 dma_channel_set_trans_count(rp2040_adc_dma_chan, 1,
true);
123 #define LOOP_YIELD tight_loop_contents(); 126 #if (RP2040_AUDIO_OUT_MODE == PWM_VIA_BARE_CHIP) || (EXTERNAL_AUDIO_OUTPUT == true) 127 #include <hardware/pwm.h> 128 #if (EXTERNAL_AUDIO_OUTPUT != true) 129 inline void audioOutput(
const AudioOutput f) {
130 pwm_set_gpio_level(AUDIO_CHANNEL_1_PIN, f.l()+AUDIO_BIAS);
131 #if (AUDIO_CHANNELS > 1
) 132 pwm_set_gpio_level(AUDIO_CHANNEL_2_PIN, f.r()+AUDIO_BIAS);
137 #include <pico/time.h> 146 absolute_time_t next_audio_update;
147 uint64_t micros_per_update;
148 uint audio_update_alarm_num;
150 void audioOutputCallback(uint) {
152 defaultAudioOutput();
153 next_audio_update = delayed_by_us(next_audio_update, micros_per_update);
155 }
while (hardware_alarm_set_target(audio_update_alarm_num, next_audio_update));
158 #elif (RP2040_AUDIO_OUT_MODE == EXTERNAL_DAC_VIA_I2S) 163 inline bool canBufferAudioOutput() {
164 return (i2s.availableForWrite());
167 inline void audioOutput(
const AudioOutput f) {
169 #if (AUDIO_BITS == 8
) 170 #if (AUDIO_CHANNELS > 1
) 171 i2s.write8(f.l(), f.r());
173 i2s.write8(f.l(), 0);
176 #elif (AUDIO_BITS == 16
) 177 #if (AUDIO_CHANNELS > 1
) 178 i2s.write16(f.l(), f.r());
180 i2s.write16(f.l(), 0);
183 #elif (AUDIO_BITS == 24
) 184 #if (AUDIO_CHANNELS > 1
) 185 i2s.write24(f.l(), f.r());
187 i2s.write24(f.l(), 0);
190 #elif (AUDIO_BITS == 32
) 191 #if (AUDIO_CHANNELS > 1
) 192 i2s.write32(f.l(), f.r());
194 i2s.write32(f.l(), 0);
197 #error The number of AUDIO_BITS set in AudioConfigRP2040.h is incorrect 205 static void startAudio() {
206 #if (RP2040_AUDIO_OUT_MODE == PWM_VIA_BARE_CHIP) || (EXTERNAL_AUDIO_OUTPUT == true) 207 #if (EXTERNAL_AUDIO_OUTPUT != true) 210 analogWrite(AUDIO_CHANNEL_1_PIN, AUDIO_BIAS);
213 pwm_config c = pwm_get_default_config();
214 pwm_config_set_clkdiv(&c, 1);
215 pwm_config_set_wrap(&c, 1l << AUDIO_BITS);
216 pwm_init(pwm_gpio_to_slice_num(AUDIO_CHANNEL_1_PIN), &c,
true);
217 gpio_set_function(AUDIO_CHANNEL_1_PIN, GPIO_FUNC_PWM);
218 gpio_set_drive_strength(AUDIO_CHANNEL_1_PIN, GPIO_DRIVE_STRENGTH_12MA);
219 # if (AUDIO_CHANNELS > 1
) 220 # if ((AUDIO_CHANNEL_1_PIN / 2
) != (AUDIO_CHANNEL_2_PIN / 2
)) 221 # error Audio channel pins for stereo or HIFI must be on the same PWM slice (which is the case for the pairs (0
,1
), (2
,3
), (4
,5
), etc. Adjust AudioConfigRP2040.h . 223 gpio_set_function(AUDIO_CHANNEL_2_PIN, GPIO_FUNC_PWM);
224 gpio_set_drive_strength(AUDIO_CHANNEL_2_PIN, GPIO_DRIVE_STRENGTH_12MA);
228 for (audio_update_alarm_num = 0; audio_update_alarm_num < 4; ++audio_update_alarm_num) {
229 if (!hardware_alarm_is_claimed(audio_update_alarm_num)) {
230 hardware_alarm_claim(audio_update_alarm_num);
231 hardware_alarm_set_callback(audio_update_alarm_num, audioOutputCallback);
235 micros_per_update = 1000000l / AUDIO_RATE;
237 next_audio_update = make_timeout_time_us(micros_per_update);
239 }
while (hardware_alarm_set_target(audio_update_alarm_num, next_audio_update));
241 #elif (RP2040_AUDIO_OUT_MODE == EXTERNAL_DAC_VIA_I2S) 242 i2s.setBCLK(BCLK_PIN);
243 i2s.setDATA(DOUT_PIN);
244 i2s.setBitsPerSample(AUDIO_BITS);
246 #if (AUDIO_BITS > 16
) 247 i2s.setBuffers(BUFFERS, (size_t) (BUFFER_SIZE/BUFFERS), 0);
249 i2s.setBuffers(BUFFERS, (size_t) (BUFFER_SIZE/BUFFERS/2), 0);
251 #if (LSBJ_FORMAT == true) 254 i2s.begin(AUDIO_RATE);
259 #if (RP2040_AUDIO_OUT_MODE == PWM_VIA_BARE_CHIP) || (EXTERNAL_AUDIO_OUTPUT == true) 260 hardware_alarm_set_callback(audio_update_alarm_num, NULL);
261 #elif (RP2040_AUDIO_OUT_MODE == EXTERNAL_DAC_VIA_I2S) void stopMozzi()
Stops audio and control interrupts and restores the timers to the values they had before Mozzi was st...
void setupFastAnalogRead(int8_t speed)
NOTE: Code needed to set up faster than usual analog reads, e.g.