aboutsummaryrefslogtreecommitdiff
path: root/hw/pl110.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/pl110.c')
-rw-r--r--hw/pl110.c21
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);
}
}