X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=hw%2Fpl110.c;h=adaf1315fc086a75920e3d100fac61ac2810c0df;hb=cd346349b45ef056f138a184f660b8c34c3213cc;hp=7340d4b4a33d3965cc8121eee1f384afb8d7f2f5;hpb=187337f8b0ec0813dd3876d1efe37d415fb81c2e;p=qemu diff --git a/hw/pl110.c b/hw/pl110.c index 7340d4b..adaf131 100644 --- a/hw/pl110.c +++ b/hw/pl110.c @@ -1,4 +1,4 @@ -/* +/* * Arm PrimeCell PL110 Color LCD Controller * * Copyright (c) 2005-2006 CodeSourcery. @@ -10,6 +10,7 @@ #include "vl.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,10 +115,11 @@ 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; - + switch (s->ds->depth) { case 0: return; @@ -145,13 +147,18 @@ 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) { case BPP_1: @@ -302,8 +309,12 @@ static uint32_t pl110_read(void *opaque, target_phys_addr_t offset) case 5: /* LCDLPBASE */ return s->lpbase; case 6: /* LCDIMSC */ + if (s->versatile) + return s->cr; return s->int_mask; case 7: /* LCDControl */ + if (s->versatile) + return s->int_mask; return s->cr; case 8: /* LCDRIS */ return s->int_status;