aboutsummaryrefslogtreecommitdiff
path: root/hw/display/sm501_template.h
diff options
context:
space:
mode:
authorBALATON Zoltan <balaton@eik.bme.hu>2017-04-21 17:18:09 +0200
committerPeter Maydell <peter.maydell@linaro.org>2017-04-24 12:32:12 +0100
commitafef2e1d537dce002f15ab12d85e99baaa7b6651 (patch)
tree559375e86993c8d9b65252a7a909aa38ad1d0e95 /hw/display/sm501_template.h
parentefae27848da0cf5ea5c88f0172c482b8f37b8725 (diff)
downloadqemu-afef2e1d537dce002f15ab12d85e99baaa7b6651.zip
qemu-afef2e1d537dce002f15ab12d85e99baaa7b6651.tar.gz
qemu-afef2e1d537dce002f15ab12d85e99baaa7b6651.tar.bz2
sm501: Fix device endianness
We only emulate the sysbus device in its default LE mode and PCI is LE as well so specify this for registers and framebuffer memory. Note that though the Linux kernel driver has code which claims to handle both big and little endian, it is obviously bogus for 16 bit and cannot be trusted as a source of information on the framebuffer pixel format. This is our best guess about device behaviour based on the specs and testing with MorphOS that is known to work on real HW. Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Tested-by: Aurelien Jarno <aurelien@aurel32.net> Message-id: 8b9605a569f8bf54074e15903620b18cd9967c89.1492787889.git.balaton@eik.bme.hu Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw/display/sm501_template.h')
-rw-r--r--hw/display/sm501_template.h19
1 files changed, 6 insertions, 13 deletions
diff --git a/hw/display/sm501_template.h b/hw/display/sm501_template.h
index 832ee61..54807bd 100644
--- a/hw/display/sm501_template.h
+++ b/hw/display/sm501_template.h
@@ -64,10 +64,10 @@ static void glue(draw_line16_, PIXEL_NAME)(
uint8_t r, g, b;
do {
- rgb565 = lduw_p(s);
- r = ((rgb565 >> 11) & 0x1f) << 3;
- g = ((rgb565 >> 5) & 0x3f) << 2;
- b = ((rgb565 >> 0) & 0x1f) << 3;
+ rgb565 = lduw_le_p(s);
+ r = (rgb565 >> 8) & 0xf8;
+ g = (rgb565 >> 3) & 0xfc;
+ b = (rgb565 << 3) & 0xf8;
*(PIXEL_TYPE *)d = glue(rgb_to_pixel, PIXEL_NAME)(r, g, b);
s += 2;
d += BPP;
@@ -80,16 +80,9 @@ static void glue(draw_line32_, PIXEL_NAME)(
uint8_t r, g, b;
do {
- ldub_p(s);
-#if defined(TARGET_WORDS_BIGENDIAN)
- r = s[1];
- g = s[2];
- b = s[3];
-#else
- b = s[0];
- g = s[1];
r = s[2];
-#endif
+ g = s[1];
+ b = s[0];
*(PIXEL_TYPE *)d = glue(rgb_to_pixel, PIXEL_NAME)(r, g, b);
s += 4;
d += BPP;