fixup to some new dma helper methods
pull/22/head
graham sanderson 2021-05-25 15:58:59 -05:00
rodzic 70ace30133
commit aeb85ce948
6 zmienionych plików z 49 dodań i 38 usunięć

Wyświetl plik

@ -267,6 +267,7 @@ typedef uint (*scanvideo_scanline_repeat_count_fn)(uint32_t scanline_id);
void scanvideo_set_scanline_repeat_fn(scanvideo_scanline_repeat_count_fn fn);
extern const scanvideo_timing_t vga_timing_640x480_60_default;
extern const scanvideo_timing_t vga_timing_1280x1024_60_default;
extern const scanvideo_timing_t vga_timing_wide_480_50;
extern const scanvideo_timing_t vga_timing_648x480_60_alt1;
@ -279,6 +280,7 @@ extern const scanvideo_mode_t vga_mode_800x600_60;
extern const scanvideo_mode_t vga_mode_1024x768_63;
extern const scanvideo_mode_t vga_mode_1280x1024_40;
extern const scanvideo_mode_t vga_mode_1024x768_60;
extern const scanvideo_mode_t vga_mode_1280x1024_60;
extern const scanvideo_mode_t vga_mode_720p_60;
extern const scanvideo_mode_t vga_mode_1080p_60;

Wyświetl plik

@ -8,9 +8,7 @@
// todo support for inverted-y (probably belongs in the scanline generators, as would inverted x)
extern const scanvideo_pio_program_t video_24mhz_composable;
#ifdef PICO_SCANVIDEO_48MHZ
#if PICO_SCANVIDEO_48MHZ
const scanvideo_timing_t vga_timing_640x480_60_default =
{
.clock_freq = 24000000,
@ -585,3 +583,30 @@ const scanvideo_mode_t vga_mode_1080p_60 =
.yscale = 1,
};
const scanvideo_timing_t vga_timing_1280x1024_60_default =
{
.clock_freq = 108000000,
.h_active = 1280,
.v_active = 1024,
.h_front_porch = 48,
.h_pulse = 112,
.h_total = 1688,
.h_sync_polarity = 0,
.v_front_porch = 1,
.v_pulse = 3,
.v_total = 1066,
.v_sync_polarity = 0,
};
const scanvideo_mode_t vga_mode_1280x1024_60 =
{
.default_timing = &vga_timing_1920x1080_60_default,
.pio_program = &video_24mhz_composable,
.width = 1280,
.height = 1024,
.xscale = 1,
.yscale = 1,
};

Wyświetl plik

@ -31,10 +31,6 @@ CU_REGISTER_DEBUG_PINS(audio_timing)
#define GPIO_FUNC_PIOx __CONCAT(GPIO_FUNC_PIO, PICO_AUDIO_I2S_PIO)
#define DREQ_PIOx_TX0 __CONCAT(__CONCAT(DREQ_PIO, PICO_AUDIO_I2S_PIO), _TX0)
#define dma_intsx __CONCAT(dma_hw->ints, PICO_AUDIO_I2S_DMA_IRQ)
#define dma_channel_set_irqx_enabled __CONCAT(__CONCAT(dma_channel_set_irq, PICO_AUDIO_I2S_DMA_IRQ),_enabled)
#define DMA_IRQ_x __CONCAT(DMA_IRQ_, PICO_AUDIO_I2S_DMA_IRQ)
struct {
audio_buffer_t *playing_buffer;
uint32_t freq;
@ -89,8 +85,8 @@ const audio_format_t *audio_i2s_setup(const audio_format_t *intended_audio_forma
false // trigger
);
irq_add_shared_handler(DMA_IRQ_x, audio_i2s_dma_irq_handler, PICO_SHARED_IRQ_HANDLER_DEFAULT_ORDER_PRIORITY);
dma_channel_set_irqx_enabled(dma_channel, 1);
irq_add_shared_handler(DMA_IRQ_0 + PICO_AUDIO_I2S_DMA_IRQ, audio_i2s_dma_irq_handler, PICO_SHARED_IRQ_HANDLER_DEFAULT_ORDER_PRIORITY);
dma_irqn_set_channel_enabled(PICO_AUDIO_I2S_DMA_IRQ, dma_channel, 1);
return intended_audio_format;
}
@ -262,7 +258,7 @@ bool audio_i2s_connect_s8(audio_buffer_pool_t *producer) {
audio_i2s_consumer = audio_new_consumer_pool(&pio_i2s_consumer_buffer_format, 2, samples_per_buffer);
// todo we need a method to calculate this in clocks
uint32_t system_clock_frequency = 48000000;
uint32_t system_clock_frequency = clock_get_hz(clk_sys);
// uint32_t divider = system_clock_frequency * 256 / producer->format->sample_freq * 16 * 4;
uint32_t divider = system_clock_frequency * 4 / producer->format->sample_freq; // avoid arithmetic overflow
pio_sm_set_clkdiv_int_frac(audio_pio, shared_state.pio_sm, divider >> 8u, divider & 0xffu);
@ -322,8 +318,8 @@ void __isr __time_critical_func(audio_i2s_dma_irq_handler)() {
assert(false);
#else
uint dma_channel = shared_state.dma_channel;
if (dma_intsx & (1u << dma_channel)) {
dma_intsx = 1u << dma_channel;
if (dma_irqn_get_channel_status(PICO_AUDIO_I2S_DMA_IRQ, dma_channel)) {
dma_irqn_acknowledge_channel(PICO_AUDIO_I2S_DMA_IRQ, dma_channel);
DEBUG_PINS_SET(audio_timing, 4);
// free the buffer we just finished
if (shared_state.playing_buffer) {
@ -349,7 +345,7 @@ void audio_i2s_set_enabled(bool enabled) {
printf("(on core %d\n", get_core_num());
}
#endif
irq_set_enabled(DMA_IRQ_x, enabled);
irq_set_enabled(DMA_IRQ_0 + PICO_AUDIO_I2S_DMA_IRQ, enabled);
if (enabled) {
audio_start_dma_transfer();

Wyświetl plik

@ -26,10 +26,6 @@
#define GPIO_FUNC_PIOx __CONCAT(GPIO_FUNC_PIO, PICO_AUDIO_PWM_PIO)
#define DREQ_PIOx_TX0 __CONCAT(__CONCAT(DREQ_PIO, PICO_AUDIO_PWM_PIO), _TX0)
#define dma_intsx __CONCAT(dma_hw->ints, PICO_AUDIO_PWM_DMA_IRQ)
#define dma_channel_set_irqx_enabled __CONCAT(__CONCAT(dma_channel_set_irq, PICO_AUDIO_PWM_DMA_IRQ),_enabled)
#define DMA_IRQ_x __CONCAT(DMA_IRQ_, PICO_AUDIO_PWM_DMA_IRQ)
// ======================
// == DEBUGGING =========
@ -145,9 +141,8 @@ static void __isr __time_critical_func(audio_pwm_dma_irq_handler)()
for(int ch = 0; ch < shared_state.channel_count; ch++)
{
uint dma_channel = shared_state.dma_channel[ch];
if (dma_intsx & (1u << dma_channel))
{
dma_intsx = 1u << dma_channel;
if (dma_irqn_get_channel_status(PICO_AUDIO_PWM_DMA_IRQ, dma_channel)) {
dma_irqn_acknowledge_channel(PICO_AUDIO_PWM_DMA_IRQ, dma_channel);
DEBUG_PINS_SET(audio_timing, 4);
// free the buffer we just finished
if (shared_state.playing_buffer[ch])
@ -217,8 +212,7 @@ const audio_format_t *audio_pwm_setup(const audio_format_t *intended_audio_forma
const audio_pwm_channel_config_t *config = channel_config0;
// todo should be shared, but we don't have that yet
irq_set_exclusive_handler(DMA_IRQ_x, audio_pwm_dma_irq_handler);
irq_add_shared_handler(DMA_IRQ_0 + PICO_AUDIO_PWM_DMA_IRQ, audio_pwm_dma_irq_handler, PICO_SHARED_IRQ_HANDLER_DEFAULT_ORDER_PRIORITY);
for(int ch = 0; ch < shared_state.channel_count; ch++)
{
@ -261,7 +255,7 @@ const audio_format_t *audio_pwm_setup(const audio_format_t *intended_audio_forma
0, // count
false // trigger
);
dma_channel_set_irqx_enabled(dma_channel, 1);
dma_irqn_set_channel_enabled(PICO_AUDIO_PWM_DMA_IRQ, dma_channel, 1);
config = 0;
}
@ -286,7 +280,7 @@ void audio_pwm_set_enabled(bool enabled)
}
#endif
#if !PICO_AUDIO_PWM_NOOP
irq_set_enabled(DMA_IRQ_x, enabled);
irq_set_enabled(DMA_IRQ_0 + PICO_AUDIO_PWM_DMA_IRQ, enabled);
if (enabled)
{

Wyświetl plik

@ -25,10 +25,6 @@ CU_REGISTER_DEBUG_PINS(audio_timing)
#define GPIO_FUNC_PIOx __CONCAT(GPIO_FUNC_PIO, PICO_AUDIO_SPDIF_PIO)
#define DREQ_PIOx_TX0 __CONCAT(__CONCAT(DREQ_PIO, PICO_AUDIO_SPDIF_PIO), _TX0)
#define dma_intsx __CONCAT(dma_hw->ints, PICO_AUDIO_SPDIF_DMA_IRQ)
#define dma_channel_set_irqx_enabled __CONCAT(__CONCAT(dma_channel_set_irq, PICO_AUDIO_SPDIF_DMA_IRQ),_enabled)
#define DMA_IRQ_x __CONCAT(DMA_IRQ_, PICO_AUDIO_SPDIF_DMA_IRQ)
struct {
audio_buffer_t *playing_buffer;
uint32_t freq;
@ -167,8 +163,8 @@ const audio_format_t *audio_spdif_setup(const audio_format_t *intended_audio_for
false // trigger
);
irq_add_shared_handler(DMA_IRQ_x, audio_spdif_dma_irq_handler, PICO_SHARED_IRQ_HANDLER_DEFAULT_ORDER_PRIORITY);
dma_channel_set_irqx_enabled(dma_channel, 1);
irq_add_shared_handler(DMA_IRQ_0 + PICO_AUDIO_SPDIF_DMA_IRQ, audio_spdif_dma_irq_handler, PICO_SHARED_IRQ_HANDLER_DEFAULT_ORDER_PRIORITY);
dma_irqn_set_channel_enabled(PICO_AUDIO_SPDIF_DMA_IRQ, dma_channel, 1);
return intended_audio_format;
}
@ -337,8 +333,8 @@ void __isr __time_critical_func(audio_spdif_dma_irq_handler)() {
assert(false);
#else
uint dma_channel = shared_state.dma_channel;
if (dma_intsx & (1u << dma_channel)) {
dma_intsx = 1u << dma_channel;
if (dma_irqn_get_channel_status(PICO_AUDIO_SPDIF_DMA_IRQ, dma_channel)) {
dma_irqn_acknowledge_channel(PICO_AUDIO_SPDIF_DMA_IRQ, dma_channel);
DEBUG_PINS_SET(audio_timing, 4);
// free the buffer we just finished
if (shared_state.playing_buffer) {
@ -364,7 +360,7 @@ void audio_spdif_set_enabled(bool enabled) {
printf("(on core %d\n", get_core_num());
}
#endif
irq_set_enabled(DMA_IRQ_x, enabled);
irq_set_enabled(DMA_IRQ_0 + PICO_AUDIO_SPDIF_DMA_IRQ, enabled);
if (enabled) {
audio_start_dma_transfer();

Wyświetl plik

@ -1163,7 +1163,7 @@ scanvideo_scanline_buffer_t *__video_time_critical_func(scanvideo_begin_scanline
}
#if PICO_SCANVIDEO_LINKED_SCANLINE_BUFFERS
extern scanvideo_scanline_buffer_t *__video_time_critical_func(scanvideo_begin_scanline_generation_linked)(uint n,
scanvideo_scanline_buffer_t *__video_time_critical_func(scanvideo_begin_scanline_generation_linked)(uint n,
bool block) {
full_scanline_buffer_t *fsb;
@ -1435,8 +1435,6 @@ bool scanvideo_setup_with_timing(const scanvideo_mode_t *mode, const scanvideo_t
dma_claim_mask(PICO_SCANVIDEO_SCANLINE_DMA_CHANNELS_MASK);
dma_set_irq0_channel_mask_enabled(PICO_SCANVIDEO_SCANLINE_DMA_CHANNELS_MASK, true);
// also done in scanvideo_timing_enable
// video_pio->inte1 = 1u << (PICO_SCANVIDEO_TIMING_SM + PIO_IRQ1_INTE_SM0_TXNFULL_LSB);
// todo reset DMA channels
@ -1677,8 +1675,8 @@ void scanvideo_timing_enable(bool enable) {
// todo but we should make sure we clear out state when we turn it off, and probably reset scanline counter when we turn it on
if (enable != video_timing_enabled) {
// todo should we disable these too? if not move to scanvideo_setup
video_pio->inte0 = PIO_IRQ0_INTE_SM0_BITS | PIO_IRQ0_INTE_SM1_BITS;
video_pio->inte1 = (1u << (PICO_SCANVIDEO_TIMING_SM + PIO_IRQ1_INTE_SM0_TXNFULL_LSB));
pio_set_irq0_source_mask_enabled(video_pio, (1u << pis_interrupt0) | (1u << pis_interrupt1), true);
pio_set_irq1_source_enabled(video_pio, pis_sm0_tx_fifo_not_full + PICO_SCANVIDEO_TIMING_SM, true);
irq_set_mask_enabled((1u << PIO0_IRQ_0)
| (1u << PIO0_IRQ_1)
#if !PICO_SCANVIDEO_NO_DMA_TRACKING