#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); }