dvisampler: character synchronization
[litex.git] / software / videomixer / main.c
1 #include <stdio.h>
2
3 #include <irq.h>
4 #include <uart.h>
5 #include <hw/dvisampler.h>
6
7 static int d0, d1, d2;
8
9 static void calibrate_delays(void)
10 {
11 CSR_DVISAMPLER0_D0_DELAY_CTL = DVISAMPLER_DELAY_CAL;
12 CSR_DVISAMPLER0_D1_DELAY_CTL = DVISAMPLER_DELAY_CAL;
13 CSR_DVISAMPLER0_D2_DELAY_CTL = DVISAMPLER_DELAY_CAL;
14 while(CSR_DVISAMPLER0_D0_DELAY_BUSY || CSR_DVISAMPLER0_D1_DELAY_BUSY || CSR_DVISAMPLER0_D2_DELAY_BUSY);
15 CSR_DVISAMPLER0_D0_DELAY_CTL = DVISAMPLER_DELAY_RST;
16 CSR_DVISAMPLER0_D1_DELAY_CTL = DVISAMPLER_DELAY_RST;
17 CSR_DVISAMPLER0_D2_DELAY_CTL = DVISAMPLER_DELAY_RST;
18 CSR_DVISAMPLER0_D0_PHASE_RESET = 1;
19 CSR_DVISAMPLER0_D1_PHASE_RESET = 1;
20 CSR_DVISAMPLER0_D2_PHASE_RESET = 1;
21 d0 = d1 = d2 = 0;
22 printf("Delays calibrated\n");
23 }
24
25 static void adjust_phase(void)
26 {
27 switch(CSR_DVISAMPLER0_D0_PHASE) {
28 case DVISAMPLER_TOO_LATE:
29 CSR_DVISAMPLER0_D0_DELAY_CTL = DVISAMPLER_DELAY_DEC;
30 d0--;
31 CSR_DVISAMPLER0_D0_PHASE_RESET = 1;
32 break;
33 case DVISAMPLER_TOO_EARLY:
34 CSR_DVISAMPLER0_D0_DELAY_CTL = DVISAMPLER_DELAY_INC;
35 d0++;
36 CSR_DVISAMPLER0_D0_PHASE_RESET = 1;
37 break;
38 }
39 switch(CSR_DVISAMPLER0_D1_PHASE) {
40 case DVISAMPLER_TOO_LATE:
41 CSR_DVISAMPLER0_D1_DELAY_CTL = DVISAMPLER_DELAY_DEC;
42 d1--;
43 CSR_DVISAMPLER0_D1_PHASE_RESET = 1;
44 break;
45 case DVISAMPLER_TOO_EARLY:
46 CSR_DVISAMPLER0_D1_DELAY_CTL = DVISAMPLER_DELAY_INC;
47 d1++;
48 CSR_DVISAMPLER0_D1_PHASE_RESET = 1;
49 break;
50 }
51 switch(CSR_DVISAMPLER0_D2_PHASE) {
52 case DVISAMPLER_TOO_LATE:
53 CSR_DVISAMPLER0_D2_DELAY_CTL = DVISAMPLER_DELAY_DEC;
54 d2--;
55 CSR_DVISAMPLER0_D2_PHASE_RESET = 1;
56 break;
57 case DVISAMPLER_TOO_EARLY:
58 CSR_DVISAMPLER0_D2_DELAY_CTL = DVISAMPLER_DELAY_INC;
59 d2++;
60 CSR_DVISAMPLER0_D2_PHASE_RESET = 1;
61 break;
62 }
63 printf("Ph: %4d %4d %4d // %d%d%d\n", d0, d1, d2,
64 CSR_DVISAMPLER0_D0_CHAR_SYNCED,
65 CSR_DVISAMPLER0_D1_CHAR_SYNCED,
66 CSR_DVISAMPLER0_D2_CHAR_SYNCED);
67 }
68
69 static void vmix(void)
70 {
71 unsigned int counter;
72
73 while(1) {
74 while(!CSR_DVISAMPLER0_PLL_LOCKED);
75 printf("PLL locked\n");
76 calibrate_delays();
77 adjust_phase();
78
79 counter = 0;
80 while(CSR_DVISAMPLER0_PLL_LOCKED) {
81 counter++;
82 if(counter == 200000) {
83 adjust_phase();
84 counter = 0;
85 }
86 }
87 printf("PLL unlocked\n");
88 }
89 }
90
91 int main(void)
92 {
93 irq_setmask(0);
94 irq_setie(1);
95 uart_init();
96
97 puts("Minimal video mixer software built "__DATE__" "__TIME__"\n");
98
99 vmix();
100
101 return 0;
102 }