kopia lustrzana https://github.com/raspberrypi/pico-extras
rodzic
70ace30133
commit
aeb85ce948
|
@ -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;
|
||||
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
Ładowanie…
Reference in New Issue