From e9c05b42e33e60a18e443d6526e9400ea2714444 Mon Sep 17 00:00:00 2001 From: balrog Date: Thu, 4 Oct 2007 23:45:31 +0000 Subject: [PATCH] Implement PL110 byte order config bit (original patch by Richard Purdie). git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3330 c046a42c-6fe2-441c-8c8c-71466251a162 --- hw/pl110.c | 13 +++-- hw/pl110_template.h | 119 +++++++++++++++++++++++++++++++------------- 2 files changed, 95 insertions(+), 37 deletions(-) diff --git a/hw/pl110.c b/hw/pl110.c index 061ec7aba7..adaf1315fc 100644 --- a/hw/pl110.c +++ b/hw/pl110.c @@ -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,6 +115,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 +147,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) { diff --git a/hw/pl110_template.h b/hw/pl110_template.h index f7cb1f4952..33483c0278 100644 --- a/hw/pl110_template.h +++ b/hw/pl110_template.h @@ -24,35 +24,68 @@ #error unknown bit depth #endif +#undef RGB +#define BORDER bgr #define ORDER 0 #include "pl110_template.h" #define ORDER 1 #include "pl110_template.h" #define ORDER 2 #include "pl110_template.h" +#undef BORDER +#define RGB +#define BORDER rgb +#define ORDER 0 +#include "pl110_template.h" +#define ORDER 1 +#include "pl110_template.h" +#define ORDER 2 +#include "pl110_template.h" +#undef BORDER -static drawfn glue(pl110_draw_fn_,BITS)[18] = +static drawfn glue(pl110_draw_fn_,BITS)[36] = { - glue(pl110_draw_line1_lblp,BITS), - glue(pl110_draw_line2_lblp,BITS), - glue(pl110_draw_line4_lblp,BITS), - glue(pl110_draw_line8_lblp,BITS), - glue(pl110_draw_line16_lblp,BITS), - glue(pl110_draw_line32_lblp,BITS), - - glue(pl110_draw_line1_bbbp,BITS), - glue(pl110_draw_line2_bbbp,BITS), - glue(pl110_draw_line4_bbbp,BITS), - glue(pl110_draw_line8_bbbp,BITS), - glue(pl110_draw_line16_bbbp,BITS), - glue(pl110_draw_line32_bbbp,BITS), - - glue(pl110_draw_line1_lbbp,BITS), - glue(pl110_draw_line2_lbbp,BITS), - glue(pl110_draw_line4_lbbp,BITS), - glue(pl110_draw_line8_lbbp,BITS), - glue(pl110_draw_line16_lbbp,BITS), - glue(pl110_draw_line32_lbbp,BITS) + glue(pl110_draw_line1_lblp_bgr,BITS), + glue(pl110_draw_line2_lblp_bgr,BITS), + glue(pl110_draw_line4_lblp_bgr,BITS), + glue(pl110_draw_line8_lblp_bgr,BITS), + glue(pl110_draw_line16_lblp_bgr,BITS), + glue(pl110_draw_line32_lblp_bgr,BITS), + + glue(pl110_draw_line1_bbbp_bgr,BITS), + glue(pl110_draw_line2_bbbp_bgr,BITS), + glue(pl110_draw_line4_bbbp_bgr,BITS), + glue(pl110_draw_line8_bbbp_bgr,BITS), + glue(pl110_draw_line16_bbbp_bgr,BITS), + glue(pl110_draw_line32_bbbp_bgr,BITS), + + glue(pl110_draw_line1_lbbp_bgr,BITS), + glue(pl110_draw_line2_lbbp_bgr,BITS), + glue(pl110_draw_line4_lbbp_bgr,BITS), + glue(pl110_draw_line8_lbbp_bgr,BITS), + glue(pl110_draw_line16_lbbp_bgr,BITS), + glue(pl110_draw_line32_lbbp_bgr,BITS), + + glue(pl110_draw_line1_lblp_rgb,BITS), + glue(pl110_draw_line2_lblp_rgb,BITS), + glue(pl110_draw_line4_lblp_rgb,BITS), + glue(pl110_draw_line8_lblp_rgb,BITS), + glue(pl110_draw_line16_lblp_rgb,BITS), + glue(pl110_draw_line32_lblp_rgb,BITS), + + glue(pl110_draw_line1_bbbp_rgb,BITS), + glue(pl110_draw_line2_bbbp_rgb,BITS), + glue(pl110_draw_line4_bbbp_rgb,BITS), + glue(pl110_draw_line8_bbbp_rgb,BITS), + glue(pl110_draw_line16_bbbp_rgb,BITS), + glue(pl110_draw_line32_bbbp_rgb,BITS), + + glue(pl110_draw_line1_lbbp_rgb,BITS), + glue(pl110_draw_line2_lbbp_rgb,BITS), + glue(pl110_draw_line4_lbbp_rgb,BITS), + glue(pl110_draw_line8_lbbp_rgb,BITS), + glue(pl110_draw_line16_lbbp_rgb,BITS), + glue(pl110_draw_line32_lbbp_rgb,BITS), }; #undef BITS @@ -61,18 +94,18 @@ static drawfn glue(pl110_draw_fn_,BITS)[18] = #else #if ORDER == 0 -#define NAME glue(lblp, BITS) +#define NAME glue(glue(lblp_, BORDER), BITS) #ifdef WORDS_BIGENDIAN #define SWAP_WORDS 1 #endif #elif ORDER == 1 -#define NAME glue(bbbp, BITS) +#define NAME glue(glue(bbbp_, BORDER), BITS) #ifndef WORDS_BIGENDIAN #define SWAP_WORDS 1 #endif #else #define SWAP_PIXELS 1 -#define NAME glue(lbbp, BITS) +#define NAME glue(glue(lbbp_, BORDER), BITS) #ifdef WORDS_BIGENDIAN #define SWAP_WORDS 1 #endif @@ -195,29 +228,38 @@ static void glue(pl110_draw_line16_,NAME)(uint32_t *pallette, uint8_t *d, const #ifdef SWAP_WORDS data = bswap32(data); #endif +#ifdef RGB +#define LSB r +#define MSB b +#else +#define LSB b +#define MSB r +#endif #if 0 - r = data & 0x1f; + LSB = data & 0x1f; data >>= 5; g = data & 0x3f; data >>= 6; - b = data & 0x1f; + MSB = data & 0x1f; data >>= 5; #else - r = (data & 0x1f) << 3; + LSB = (data & 0x1f) << 3; data >>= 5; g = (data & 0x3f) << 2; data >>= 6; - b = (data & 0x1f) << 3; + MSB = (data & 0x1f) << 3; data >>= 5; #endif COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b)); - r = (data & 0x1f) << 3; + LSB = (data & 0x1f) << 3; data >>= 5; g = (data & 0x3f) << 2; data >>= 6; - b = (data & 0x1f) << 3; + MSB = (data & 0x1f) << 3; data >>= 5; COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b)); +#undef MSB +#undef LSB width -= 2; src += 4; } @@ -229,16 +271,25 @@ static void glue(pl110_draw_line32_,NAME)(uint32_t *pallette, uint8_t *d, const unsigned int r, g, b; while (width > 0) { data = *(uint32_t *)src; +#ifdef RGB +#define LSB r +#define MSB b +#else +#define LSB b +#define MSB r +#endif #ifdef SWAP_WORDS - r = data & 0xff; + LSB = data & 0xff; g = (data >> 8) & 0xff; - b = (data >> 16) & 0xff; + MSB = (data >> 16) & 0xff; #else - r = (data >> 24) & 0xff; + LSB = (data >> 24) & 0xff; g = (data >> 16) & 0xff; - b = (data >> 8) & 0xff; + MSB = (data >> 8) & 0xff; #endif COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b)); +#undef MSB +#undef LSB width--; src += 4; } -- GitLab