summaryrefslogtreecommitdiff
path: root/platform/wavelet3d/host_sw/vdc_rayas.c
diff options
context:
space:
mode:
Diffstat (limited to 'platform/wavelet3d/host_sw/vdc_rayas.c')
-rw-r--r--platform/wavelet3d/host_sw/vdc_rayas.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/platform/wavelet3d/host_sw/vdc_rayas.c b/platform/wavelet3d/host_sw/vdc_rayas.c
new file mode 100644
index 0000000..5a583b6
--- /dev/null
+++ b/platform/wavelet3d/host_sw/vdc_rayas.c
@@ -0,0 +1,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);
+}