diff options
Diffstat (limited to 'hw/pl110.c')
-rw-r--r-- | hw/pl110.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/hw/pl110.c b/hw/pl110.c index 061ec7aba..e5b2b2363 100644 --- a/hw/pl110.c +++ b/hw/pl110.c @@ -7,9 +7,12 @@ * This code is licenced under the GNU LGPL */ -#include "vl.h" +#include "hw.h" +#include "primecell.h" +#include "console.h" #define PL110_CR_EN 0x001 +#define PL110_CR_BGR 0x100 #define PL110_CR_BEBO 0x200 #define PL110_CR_BEPO 0x400 #define PL110_CR_PWR 0x800 @@ -114,6 +117,7 @@ static void pl110_update_display(void *opaque) int first, last = 0; int dirty, new_dirty; int i; + int bpp_offset; if (!pl110_enabled(s)) return; @@ -145,12 +149,17 @@ static void pl110_update_display(void *opaque) fprintf(stderr, "pl110: Bad color depth\n"); exit(1); } + if (s->cr & PL110_CR_BGR) + bpp_offset = 0; + else + bpp_offset = 18; + if (s->cr & PL110_CR_BEBO) - fn = fntable[s->bpp + 6]; + fn = fntable[s->bpp + 6 + bpp_offset]; else if (s->cr & PL110_CR_BEPO) - fn = fntable[s->bpp + 12]; + fn = fntable[s->bpp + 12 + bpp_offset]; else - fn = fntable[s->bpp]; + fn = fntable[s->bpp + bpp_offset]; src_width = s->cols; switch (s->bpp) { @@ -319,7 +328,7 @@ static uint32_t pl110_read(void *opaque, target_phys_addr_t offset) case 12: /* LCDLPCURR */ return s->lpbase; default: - cpu_abort (cpu_single_env, "pl110_read: Bad offset %x\n", offset); + cpu_abort (cpu_single_env, "pl110_read: Bad offset %x\n", (int)offset); return 0; } } @@ -386,7 +395,7 @@ static void pl110_write(void *opaque, target_phys_addr_t offset, pl110_update(s); break; default: - cpu_abort (cpu_single_env, "pl110_write: Bad offset %x\n", offset); + cpu_abort (cpu_single_env, "pl110_write: Bad offset %x\n", (int)offset); } } |