mirror of https://gitee.com/openkylin/qemu.git
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>
This commit is contained in:
parent
efae27848d
commit
afef2e1d53
|
@ -850,7 +850,7 @@ static const MemoryRegionOps sm501_system_config_ops = {
|
|||
.min_access_size = 4,
|
||||
.max_access_size = 4,
|
||||
},
|
||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
static uint32_t sm501_palette_read(void *opaque, hwaddr addr)
|
||||
|
@ -1086,7 +1086,7 @@ static const MemoryRegionOps sm501_disp_ctrl_ops = {
|
|||
.min_access_size = 4,
|
||||
.max_access_size = 4,
|
||||
},
|
||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
static uint64_t sm501_2d_engine_read(void *opaque, hwaddr addr,
|
||||
|
@ -1174,7 +1174,7 @@ static const MemoryRegionOps sm501_2d_engine_ops = {
|
|||
.min_access_size = 4,
|
||||
.max_access_size = 4,
|
||||
},
|
||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
/* draw line functions for all console modes */
|
||||
|
@ -1510,7 +1510,7 @@ static void sm501_realize_sysbus(DeviceState *dev, Error **errp)
|
|||
if (s->chr_state) {
|
||||
serial_mm_init(&s->state.mmio_region, SM501_UART0, 2,
|
||||
NULL, /* TODO : chain irq to IRL */
|
||||
115200, s->chr_state, DEVICE_NATIVE_ENDIAN);
|
||||
115200, s->chr_state, DEVICE_LITTLE_ENDIAN);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue