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 | 10 | #include "vl.h" |
11 | 11 | |
12 | 12 | #define PL110_CR_EN 0x001 |
13 | +#define PL110_CR_BGR 0x100 | |
13 | 14 | #define PL110_CR_BEBO 0x200 |
14 | 15 | #define PL110_CR_BEPO 0x400 |
15 | 16 | #define PL110_CR_PWR 0x800 |
... | ... | @@ -114,6 +115,7 @@ static void pl110_update_display(void *opaque) |
114 | 115 | int first, last = 0; |
115 | 116 | int dirty, new_dirty; |
116 | 117 | int i; |
118 | + int bpp_offset; | |
117 | 119 | |
118 | 120 | if (!pl110_enabled(s)) |
119 | 121 | return; |
... | ... | @@ -145,12 +147,17 @@ static void pl110_update_display(void *opaque) |
145 | 147 | fprintf(stderr, "pl110: Bad color depth\n"); |
146 | 148 | exit(1); |
147 | 149 | } |
150 | + if (s->cr & PL110_CR_BGR) | |
151 | + bpp_offset = 0; | |
152 | + else | |
153 | + bpp_offset = 18; | |
154 | + | |
148 | 155 | if (s->cr & PL110_CR_BEBO) |
149 | - fn = fntable[s->bpp + 6]; | |
156 | + fn = fntable[s->bpp + 6 + bpp_offset]; | |
150 | 157 | else if (s->cr & PL110_CR_BEPO) |
151 | - fn = fntable[s->bpp + 12]; | |
158 | + fn = fntable[s->bpp + 12 + bpp_offset]; | |
152 | 159 | else |
153 | - fn = fntable[s->bpp]; | |
160 | + fn = fntable[s->bpp + bpp_offset]; | |
154 | 161 | |
155 | 162 | src_width = s->cols; |
156 | 163 | switch (s->bpp) { | ... | ... |
hw/pl110_template.h
... | ... | @@ -24,35 +24,68 @@ |
24 | 24 | #error unknown bit depth |
25 | 25 | #endif |
26 | 26 | |
27 | +#undef RGB | |
28 | +#define BORDER bgr | |
27 | 29 | #define ORDER 0 |
28 | 30 | #include "pl110_template.h" |
29 | 31 | #define ORDER 1 |
30 | 32 | #include "pl110_template.h" |
31 | 33 | #define ORDER 2 |
32 | 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 | 91 | #undef BITS |
... | ... | @@ -61,18 +94,18 @@ static drawfn glue(pl110_draw_fn_,BITS)[18] = |
61 | 94 | #else |
62 | 95 | |
63 | 96 | #if ORDER == 0 |
64 | -#define NAME glue(lblp, BITS) | |
97 | +#define NAME glue(glue(lblp_, BORDER), BITS) | |
65 | 98 | #ifdef WORDS_BIGENDIAN |
66 | 99 | #define SWAP_WORDS 1 |
67 | 100 | #endif |
68 | 101 | #elif ORDER == 1 |
69 | -#define NAME glue(bbbp, BITS) | |
102 | +#define NAME glue(glue(bbbp_, BORDER), BITS) | |
70 | 103 | #ifndef WORDS_BIGENDIAN |
71 | 104 | #define SWAP_WORDS 1 |
72 | 105 | #endif |
73 | 106 | #else |
74 | 107 | #define SWAP_PIXELS 1 |
75 | -#define NAME glue(lbbp, BITS) | |
108 | +#define NAME glue(glue(lbbp_, BORDER), BITS) | |
76 | 109 | #ifdef WORDS_BIGENDIAN |
77 | 110 | #define SWAP_WORDS 1 |
78 | 111 | #endif |
... | ... | @@ -195,29 +228,38 @@ static void glue(pl110_draw_line16_,NAME)(uint32_t *pallette, uint8_t *d, const |
195 | 228 | #ifdef SWAP_WORDS |
196 | 229 | data = bswap32(data); |
197 | 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 | 238 | #if 0 |
199 | - r = data & 0x1f; | |
239 | + LSB = data & 0x1f; | |
200 | 240 | data >>= 5; |
201 | 241 | g = data & 0x3f; |
202 | 242 | data >>= 6; |
203 | - b = data & 0x1f; | |
243 | + MSB = data & 0x1f; | |
204 | 244 | data >>= 5; |
205 | 245 | #else |
206 | - r = (data & 0x1f) << 3; | |
246 | + LSB = (data & 0x1f) << 3; | |
207 | 247 | data >>= 5; |
208 | 248 | g = (data & 0x3f) << 2; |
209 | 249 | data >>= 6; |
210 | - b = (data & 0x1f) << 3; | |
250 | + MSB = (data & 0x1f) << 3; | |
211 | 251 | data >>= 5; |
212 | 252 | #endif |
213 | 253 | COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b)); |
214 | - r = (data & 0x1f) << 3; | |
254 | + LSB = (data & 0x1f) << 3; | |
215 | 255 | data >>= 5; |
216 | 256 | g = (data & 0x3f) << 2; |
217 | 257 | data >>= 6; |
218 | - b = (data & 0x1f) << 3; | |
258 | + MSB = (data & 0x1f) << 3; | |
219 | 259 | data >>= 5; |
220 | 260 | COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b)); |
261 | +#undef MSB | |
262 | +#undef LSB | |
221 | 263 | width -= 2; |
222 | 264 | src += 4; |
223 | 265 | } |
... | ... | @@ -229,16 +271,25 @@ static void glue(pl110_draw_line32_,NAME)(uint32_t *pallette, uint8_t *d, const |
229 | 271 | unsigned int r, g, b; |
230 | 272 | while (width > 0) { |
231 | 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 | 281 | #ifdef SWAP_WORDS |
233 | - r = data & 0xff; | |
282 | + LSB = data & 0xff; | |
234 | 283 | g = (data >> 8) & 0xff; |
235 | - b = (data >> 16) & 0xff; | |
284 | + MSB = (data >> 16) & 0xff; | |
236 | 285 | #else |
237 | - r = (data >> 24) & 0xff; | |
286 | + LSB = (data >> 24) & 0xff; | |
238 | 287 | g = (data >> 16) & 0xff; |
239 | - b = (data >> 8) & 0xff; | |
288 | + MSB = (data >> 8) & 0xff; | |
240 | 289 | #endif |
241 | 290 | COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b)); |
291 | +#undef MSB | |
292 | +#undef LSB | |
242 | 293 | width--; |
243 | 294 | src += 4; |
244 | 295 | } | ... | ... |