diff experiments/qemu_vexpress_a9/display.c @ 340:c7cc54c0dfdf devel

Test featurebranch
author Windel Bouwman
date Sun, 23 Feb 2014 16:24:01 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/experiments/qemu_vexpress_a9/display.c	Sun Feb 23 16:24:01 2014 +0100
@@ -0,0 +1,75 @@
+
+
+#define PL110_CR_EN             0x001
+#define PL110_CR_16BPP          0x008
+#define PL110_CR_MONO           0x010
+#define PL110_CR_TFT            0x020
+#define PL110_CR_MONO_8B        0x040
+#define PL110_CR_DUAL_LCD       0x080
+#define PL110_CR_BGR            0x100
+#define PL110_CR_BEBO           0x200
+#define PL110_CR_BEPO           0x400
+#define PL110_CR_PWR            0x800
+
+
+
+
+#define PL110_IOBASE            0x10020000
+#define FB_BASE                 0x60050000
+
+
+typedef unsigned int            uint32;
+typedef unsigned char           uint8;
+typedef unsigned short          uint16;
+
+typedef struct
+{
+    uint32          volatile tim0;          //0
+    uint32          volatile tim1;          //4
+    uint32          volatile tim2;          //8
+    uint32          volatile tim3;          //c
+    uint32          volatile upbase;        //10
+    uint32          volatile lpbase;        //14
+    uint32          volatile control;       //18
+} PL111MMIO;
+
+void print_uart0(const char *s);
+
+extern uint16* image_data;
+extern int image_width;
+extern int image_height;
+
+void do_display(void)
+{
+    uint16          volatile *fb;
+    PL111MMIO       *plio;
+    int             x, y;
+
+    plio = (PL111MMIO*)PL110_IOBASE;
+
+    plio->tim0 = 0x3f1f3f9c;
+    plio->tim1 = 0x080b61df;
+    plio->upbase = FB_BASE;
+
+    /* 16-bit color */
+    plio->control = PL110_CR_EN | (0xC) | PL110_CR_TFT | PL110_CR_PWR;
+
+    fb = (uint16*)FB_BASE;
+
+    for (x = 0; x < (640 * 480) - 10; ++x)
+        {
+                fb[x] = 0x1f << (5 + 6) | 0xf << 5;
+        }
+
+    print_uart0("Cleared disp\n");
+
+    for (x = 0; x < image_width; x++)
+    {
+        for (y = 0; y < image_height; y++)
+        {
+            fb[x + 640 * y] = image_data[x + image_width * y];
+        }
+    }
+
+}
+