/ software / apps / hello_dvi / main.c
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  }