main.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "pico/stdlib.h" 4 #include "pico/multicore.h" 5 #include "hardware/clocks.h" 6 #include "hardware/irq.h" 7 #include "hardware/sync.h" 8 #include "hardware/gpio.h" 9 #include "hardware/vreg.h" 10 11 #include "dvi.h" 12 #include "dvi_serialiser.h" 13 #include "common_dvi_pin_configs.h" 14 15 #include "testcard_320x240_rgb565.h" 16 17 // DVDD 1.2V (1.1V seems ok too) 18 #define FRAME_WIDTH 320 19 #define FRAME_HEIGHT 240 20 #define VREG_VSEL VREG_VOLTAGE_1_20 21 #define DVI_TIMING dvi_timing_640x480p_60hz 22 23 struct dvi_inst dvi0; 24 25 void core1_main() { 26 dvi_register_irqs_this_core(&dvi0, DMA_IRQ_0); 27 while (queue_is_empty(&dvi0.q_colour_valid)) 28 __wfe(); 29 dvi_start(&dvi0); 30 dvi_scanbuf_main_16bpp(&dvi0); 31 } 32 33 int main() { 34 vreg_set_voltage(VREG_VSEL); 35 sleep_ms(10); 36 set_sys_clock_khz(DVI_TIMING.bit_clk_khz, true); 37 38 setup_default_uart(); 39 40 dvi0.timing = &DVI_TIMING; 41 dvi0.ser_cfg = DVI_DEFAULT_SERIAL_CONFIG; 42 dvi_init(&dvi0, next_striped_spin_lock_num(), next_striped_spin_lock_num()); 43 44 // Core 1 will wait until it sees the first colour buffer, then start up the 45 // DVI signalling. 46 multicore_launch_core1(core1_main); 47 48 // Pass out pointers into our preprepared image, discard the pointers when 49 // returned to us. Use frame_ctr to scroll the image 50 uint frame_ctr = 0; 51 while (true) { 52 for (uint y = 0; y < FRAME_HEIGHT; ++y) { 53 uint y_scroll = (y + frame_ctr) % FRAME_HEIGHT; 54 const uint16_t *scanline = &((const uint16_t*)testcard_320x240)[y_scroll * FRAME_WIDTH]; 55 queue_add_blocking_u32(&dvi0.q_colour_valid, &scanline); 56 while (queue_try_remove_u32(&dvi0.q_colour_free, &scanline)) 57 ; 58 } 59 ++frame_ctr; 60 } 61 }