Mercurial > lcfOS
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]; + } + } + +} +