Commit e9c05b42e33e60a18e443d6526e9400ea2714444
1 parent
4d043a09
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
Showing
2 changed files
with
95 additions
and
37 deletions
hw/pl110.c
@@ -10,6 +10,7 @@ | @@ -10,6 +10,7 @@ | ||
10 | #include "vl.h" | 10 | #include "vl.h" |
11 | 11 | ||
12 | #define PL110_CR_EN 0x001 | 12 | #define PL110_CR_EN 0x001 |
13 | +#define PL110_CR_BGR 0x100 | ||
13 | #define PL110_CR_BEBO 0x200 | 14 | #define PL110_CR_BEBO 0x200 |
14 | #define PL110_CR_BEPO 0x400 | 15 | #define PL110_CR_BEPO 0x400 |
15 | #define PL110_CR_PWR 0x800 | 16 | #define PL110_CR_PWR 0x800 |
@@ -114,6 +115,7 @@ static void pl110_update_display(void *opaque) | @@ -114,6 +115,7 @@ static void pl110_update_display(void *opaque) | ||
114 | int first, last = 0; | 115 | int first, last = 0; |
115 | int dirty, new_dirty; | 116 | int dirty, new_dirty; |
116 | int i; | 117 | int i; |
118 | + int bpp_offset; | ||
117 | 119 | ||
118 | if (!pl110_enabled(s)) | 120 | if (!pl110_enabled(s)) |
119 | return; | 121 | return; |
@@ -145,12 +147,17 @@ static void pl110_update_display(void *opaque) | @@ -145,12 +147,17 @@ static void pl110_update_display(void *opaque) | ||
145 | fprintf(stderr, "pl110: Bad color depth\n"); | 147 | fprintf(stderr, "pl110: Bad color depth\n"); |
146 | exit(1); | 148 | exit(1); |
147 | } | 149 | } |
150 | + if (s->cr & PL110_CR_BGR) | ||
151 | + bpp_offset = 0; | ||
152 | + else | ||
153 | + bpp_offset = 18; | ||
154 | + | ||
148 | if (s->cr & PL110_CR_BEBO) | 155 | if (s->cr & PL110_CR_BEBO) |
149 | - fn = fntable[s->bpp + 6]; | 156 | + fn = fntable[s->bpp + 6 + bpp_offset]; |
150 | else if (s->cr & PL110_CR_BEPO) | 157 | else if (s->cr & PL110_CR_BEPO) |
151 | - fn = fntable[s->bpp + 12]; | 158 | + fn = fntable[s->bpp + 12 + bpp_offset]; |
152 | else | 159 | else |
153 | - fn = fntable[s->bpp]; | 160 | + fn = fntable[s->bpp + bpp_offset]; |
154 | 161 | ||
155 | src_width = s->cols; | 162 | src_width = s->cols; |
156 | switch (s->bpp) { | 163 | switch (s->bpp) { |
hw/pl110_template.h
@@ -24,35 +24,68 @@ | @@ -24,35 +24,68 @@ | ||
24 | #error unknown bit depth | 24 | #error unknown bit depth |
25 | #endif | 25 | #endif |
26 | 26 | ||
27 | +#undef RGB | ||
28 | +#define BORDER bgr | ||
27 | #define ORDER 0 | 29 | #define ORDER 0 |
28 | #include "pl110_template.h" | 30 | #include "pl110_template.h" |
29 | #define ORDER 1 | 31 | #define ORDER 1 |
30 | #include "pl110_template.h" | 32 | #include "pl110_template.h" |
31 | #define ORDER 2 | 33 | #define ORDER 2 |
32 | #include "pl110_template.h" | 34 | #include "pl110_template.h" |
35 | +#undef BORDER | ||
36 | +#define RGB | ||
37 | +#define BORDER rgb | ||
38 | +#define ORDER 0 | ||
39 | +#include "pl110_template.h" | ||
40 | +#define ORDER 1 | ||
41 | +#include "pl110_template.h" | ||
42 | +#define ORDER 2 | ||
43 | +#include "pl110_template.h" | ||
44 | +#undef BORDER | ||
33 | 45 | ||
34 | -static drawfn glue(pl110_draw_fn_,BITS)[18] = | 46 | +static drawfn glue(pl110_draw_fn_,BITS)[36] = |
35 | { | 47 | { |
36 | - glue(pl110_draw_line1_lblp,BITS), | ||
37 | - glue(pl110_draw_line2_lblp,BITS), | ||
38 | - glue(pl110_draw_line4_lblp,BITS), | ||
39 | - glue(pl110_draw_line8_lblp,BITS), | ||
40 | - glue(pl110_draw_line16_lblp,BITS), | ||
41 | - glue(pl110_draw_line32_lblp,BITS), | ||
42 | - | ||
43 | - glue(pl110_draw_line1_bbbp,BITS), | ||
44 | - glue(pl110_draw_line2_bbbp,BITS), | ||
45 | - glue(pl110_draw_line4_bbbp,BITS), | ||
46 | - glue(pl110_draw_line8_bbbp,BITS), | ||
47 | - glue(pl110_draw_line16_bbbp,BITS), | ||
48 | - glue(pl110_draw_line32_bbbp,BITS), | ||
49 | - | ||
50 | - glue(pl110_draw_line1_lbbp,BITS), | ||
51 | - glue(pl110_draw_line2_lbbp,BITS), | ||
52 | - glue(pl110_draw_line4_lbbp,BITS), | ||
53 | - glue(pl110_draw_line8_lbbp,BITS), | ||
54 | - glue(pl110_draw_line16_lbbp,BITS), | ||
55 | - glue(pl110_draw_line32_lbbp,BITS) | 48 | + glue(pl110_draw_line1_lblp_bgr,BITS), |
49 | + glue(pl110_draw_line2_lblp_bgr,BITS), | ||
50 | + glue(pl110_draw_line4_lblp_bgr,BITS), | ||
51 | + glue(pl110_draw_line8_lblp_bgr,BITS), | ||
52 | + glue(pl110_draw_line16_lblp_bgr,BITS), | ||
53 | + glue(pl110_draw_line32_lblp_bgr,BITS), | ||
54 | + | ||
55 | + glue(pl110_draw_line1_bbbp_bgr,BITS), | ||
56 | + glue(pl110_draw_line2_bbbp_bgr,BITS), | ||
57 | + glue(pl110_draw_line4_bbbp_bgr,BITS), | ||
58 | + glue(pl110_draw_line8_bbbp_bgr,BITS), | ||
59 | + glue(pl110_draw_line16_bbbp_bgr,BITS), | ||
60 | + glue(pl110_draw_line32_bbbp_bgr,BITS), | ||
61 | + | ||
62 | + glue(pl110_draw_line1_lbbp_bgr,BITS), | ||
63 | + glue(pl110_draw_line2_lbbp_bgr,BITS), | ||
64 | + glue(pl110_draw_line4_lbbp_bgr,BITS), | ||
65 | + glue(pl110_draw_line8_lbbp_bgr,BITS), | ||
66 | + glue(pl110_draw_line16_lbbp_bgr,BITS), | ||
67 | + glue(pl110_draw_line32_lbbp_bgr,BITS), | ||
68 | + | ||
69 | + glue(pl110_draw_line1_lblp_rgb,BITS), | ||
70 | + glue(pl110_draw_line2_lblp_rgb,BITS), | ||
71 | + glue(pl110_draw_line4_lblp_rgb,BITS), | ||
72 | + glue(pl110_draw_line8_lblp_rgb,BITS), | ||
73 | + glue(pl110_draw_line16_lblp_rgb,BITS), | ||
74 | + glue(pl110_draw_line32_lblp_rgb,BITS), | ||
75 | + | ||
76 | + glue(pl110_draw_line1_bbbp_rgb,BITS), | ||
77 | + glue(pl110_draw_line2_bbbp_rgb,BITS), | ||
78 | + glue(pl110_draw_line4_bbbp_rgb,BITS), | ||
79 | + glue(pl110_draw_line8_bbbp_rgb,BITS), | ||
80 | + glue(pl110_draw_line16_bbbp_rgb,BITS), | ||
81 | + glue(pl110_draw_line32_bbbp_rgb,BITS), | ||
82 | + | ||
83 | + glue(pl110_draw_line1_lbbp_rgb,BITS), | ||
84 | + glue(pl110_draw_line2_lbbp_rgb,BITS), | ||
85 | + glue(pl110_draw_line4_lbbp_rgb,BITS), | ||
86 | + glue(pl110_draw_line8_lbbp_rgb,BITS), | ||
87 | + glue(pl110_draw_line16_lbbp_rgb,BITS), | ||
88 | + glue(pl110_draw_line32_lbbp_rgb,BITS), | ||
56 | }; | 89 | }; |
57 | 90 | ||
58 | #undef BITS | 91 | #undef BITS |
@@ -61,18 +94,18 @@ static drawfn glue(pl110_draw_fn_,BITS)[18] = | @@ -61,18 +94,18 @@ static drawfn glue(pl110_draw_fn_,BITS)[18] = | ||
61 | #else | 94 | #else |
62 | 95 | ||
63 | #if ORDER == 0 | 96 | #if ORDER == 0 |
64 | -#define NAME glue(lblp, BITS) | 97 | +#define NAME glue(glue(lblp_, BORDER), BITS) |
65 | #ifdef WORDS_BIGENDIAN | 98 | #ifdef WORDS_BIGENDIAN |
66 | #define SWAP_WORDS 1 | 99 | #define SWAP_WORDS 1 |
67 | #endif | 100 | #endif |
68 | #elif ORDER == 1 | 101 | #elif ORDER == 1 |
69 | -#define NAME glue(bbbp, BITS) | 102 | +#define NAME glue(glue(bbbp_, BORDER), BITS) |
70 | #ifndef WORDS_BIGENDIAN | 103 | #ifndef WORDS_BIGENDIAN |
71 | #define SWAP_WORDS 1 | 104 | #define SWAP_WORDS 1 |
72 | #endif | 105 | #endif |
73 | #else | 106 | #else |
74 | #define SWAP_PIXELS 1 | 107 | #define SWAP_PIXELS 1 |
75 | -#define NAME glue(lbbp, BITS) | 108 | +#define NAME glue(glue(lbbp_, BORDER), BITS) |
76 | #ifdef WORDS_BIGENDIAN | 109 | #ifdef WORDS_BIGENDIAN |
77 | #define SWAP_WORDS 1 | 110 | #define SWAP_WORDS 1 |
78 | #endif | 111 | #endif |
@@ -195,29 +228,38 @@ static void glue(pl110_draw_line16_,NAME)(uint32_t *pallette, uint8_t *d, const | @@ -195,29 +228,38 @@ static void glue(pl110_draw_line16_,NAME)(uint32_t *pallette, uint8_t *d, const | ||
195 | #ifdef SWAP_WORDS | 228 | #ifdef SWAP_WORDS |
196 | data = bswap32(data); | 229 | data = bswap32(data); |
197 | #endif | 230 | #endif |
231 | +#ifdef RGB | ||
232 | +#define LSB r | ||
233 | +#define MSB b | ||
234 | +#else | ||
235 | +#define LSB b | ||
236 | +#define MSB r | ||
237 | +#endif | ||
198 | #if 0 | 238 | #if 0 |
199 | - r = data & 0x1f; | 239 | + LSB = data & 0x1f; |
200 | data >>= 5; | 240 | data >>= 5; |
201 | g = data & 0x3f; | 241 | g = data & 0x3f; |
202 | data >>= 6; | 242 | data >>= 6; |
203 | - b = data & 0x1f; | 243 | + MSB = data & 0x1f; |
204 | data >>= 5; | 244 | data >>= 5; |
205 | #else | 245 | #else |
206 | - r = (data & 0x1f) << 3; | 246 | + LSB = (data & 0x1f) << 3; |
207 | data >>= 5; | 247 | data >>= 5; |
208 | g = (data & 0x3f) << 2; | 248 | g = (data & 0x3f) << 2; |
209 | data >>= 6; | 249 | data >>= 6; |
210 | - b = (data & 0x1f) << 3; | 250 | + MSB = (data & 0x1f) << 3; |
211 | data >>= 5; | 251 | data >>= 5; |
212 | #endif | 252 | #endif |
213 | COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b)); | 253 | COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b)); |
214 | - r = (data & 0x1f) << 3; | 254 | + LSB = (data & 0x1f) << 3; |
215 | data >>= 5; | 255 | data >>= 5; |
216 | g = (data & 0x3f) << 2; | 256 | g = (data & 0x3f) << 2; |
217 | data >>= 6; | 257 | data >>= 6; |
218 | - b = (data & 0x1f) << 3; | 258 | + MSB = (data & 0x1f) << 3; |
219 | data >>= 5; | 259 | data >>= 5; |
220 | COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b)); | 260 | COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b)); |
261 | +#undef MSB | ||
262 | +#undef LSB | ||
221 | width -= 2; | 263 | width -= 2; |
222 | src += 4; | 264 | src += 4; |
223 | } | 265 | } |
@@ -229,16 +271,25 @@ static void glue(pl110_draw_line32_,NAME)(uint32_t *pallette, uint8_t *d, const | @@ -229,16 +271,25 @@ static void glue(pl110_draw_line32_,NAME)(uint32_t *pallette, uint8_t *d, const | ||
229 | unsigned int r, g, b; | 271 | unsigned int r, g, b; |
230 | while (width > 0) { | 272 | while (width > 0) { |
231 | data = *(uint32_t *)src; | 273 | data = *(uint32_t *)src; |
274 | +#ifdef RGB | ||
275 | +#define LSB r | ||
276 | +#define MSB b | ||
277 | +#else | ||
278 | +#define LSB b | ||
279 | +#define MSB r | ||
280 | +#endif | ||
232 | #ifdef SWAP_WORDS | 281 | #ifdef SWAP_WORDS |
233 | - r = data & 0xff; | 282 | + LSB = data & 0xff; |
234 | g = (data >> 8) & 0xff; | 283 | g = (data >> 8) & 0xff; |
235 | - b = (data >> 16) & 0xff; | 284 | + MSB = (data >> 16) & 0xff; |
236 | #else | 285 | #else |
237 | - r = (data >> 24) & 0xff; | 286 | + LSB = (data >> 24) & 0xff; |
238 | g = (data >> 16) & 0xff; | 287 | g = (data >> 16) & 0xff; |
239 | - b = (data >> 8) & 0xff; | 288 | + MSB = (data >> 8) & 0xff; |
240 | #endif | 289 | #endif |
241 | COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b)); | 290 | COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b)); |
291 | +#undef MSB | ||
292 | +#undef LSB | ||
242 | width--; | 293 | width--; |
243 | src += 4; | 294 | src += 4; |
244 | } | 295 | } |