summaryrefslogtreecommitdiff
path: root/platform/wavelet3d/host_sw/vdc_rayas.c
blob: 5a583b62d508f2bc6b6a60e37524e9a1f6c54366 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#define MOD_NAME "vdc"

#include "log.h"
#include "vdc.h"

struct vdc_ctrl
{
	unsigned dacen      : 1;
	unsigned dacon      : 1;
	unsigned doublebuff : 1;
	unsigned rsvd3      : 29;
};

struct vdc_geometry
{
	unsigned lines  : 16;
	unsigned length : 16;
};

struct vdc_stream
{
	unsigned hstride : 16;
	unsigned rsvd16  : 16;
};

struct vdc_fb
{
	unsigned rsvd0 : 2;
	unsigned addr  : 30;
};

#define VDC_BASE     0x24000000
#define VDC_CTRL     (*(volatile struct vdc_ctrl *)    (VDC_BASE + 0x00))
#define VDC_GEOMETRY (*(volatile struct vdc_geometry *)(VDC_BASE + 0x04))
#define VDC_STREAM   (*(volatile struct vdc_stream *)  (VDC_BASE + 0x08))
#define VDC_FRONT    (*(volatile struct vdc_fb *)      (VDC_BASE + 0x0c))
#define VDC_BACK     (*(volatile struct vdc_fb *)      (VDC_BASE + 0x10))
#define VDC_RETIRE   (*(volatile struct vdc_fb *)      (VDC_BASE + 0x14))

#define FB_BASE ((void *)0x1d000000)

void vdc_init(void)
{
	log("fb init, vdc_on=%u", VDC_CTRL.dacon);

	unsigned r[] = { 0x00ff0000, 0x0000ff00, 0xff0000ff };
	unsigned g[] = { 0x0000ff00, 0xff0000ff, 0x00ff0000 };
	unsigned b[] = { 0xff0000ff, 0x00ff0000, 0x0000ff00 };

	unsigned *p = (unsigned *)FB_BASE;

	for (unsigned n = 0; n < 120; ++n) {
		unsigned *porig = p;
		for (unsigned i = 0; i < 480; i += 3, p += 3) {
			p[0] = r[0];
			p[1] = r[1];
			p[2] = r[2];
		}
		p = porig + 512;
	}

	for (unsigned n = 0; n < 120; ++n) {
		unsigned *porig = p;
		for (unsigned i = 0; i < 480; i += 3, p += 3) {
			p[0] = g[0];
			p[1] = g[1];
			p[2] = g[2];
		}
		p = porig + 512;
	}

	for (unsigned n = 0; n < 120; ++n) {
		unsigned *porig = p;
		for (unsigned i = 0; i < 480; i += 3, p += 3) {
			p[0] = b[0];
			p[1] = b[1];
			p[2] = b[2];
		}
		p = porig + 512;
	}

	for (unsigned n = 0; n < 120; ++n) {
		unsigned *porig = p;
		for (unsigned i = 0; i < 480; i += 3, p += 3) {
			p[0] = r[0];
			p[1] = r[1];
			p[2] = r[2];
		}
		p = porig + 512;
	}

	log("fb done");

	VDC_FRONT = (struct vdc_fb){ .addr = (unsigned)FB_BASE >> 2, .rsvd0 = 0, };
	VDC_STREAM = (struct vdc_stream){ .hstride = 512, .rsvd16 = 0, };
	VDC_GEOMETRY = (struct vdc_geometry){ .length = 479, .lines = 479, };
	VDC_CTRL = (struct vdc_ctrl){ .dacen = 1, .dacon = 0, .doublebuff = 0, };

	log("init done, vdc_on=%u", VDC_CTRL.dacon);
}