*/
-#define SKIP_PIXEL(to) to += deststep
#if DEPTH == 8
# define PIXEL_TYPE uint8_t
-# define COPY_PIXEL(to, from) *to = from; SKIP_PIXEL(to)
# define COPY_PIXEL1(to, from) *to ++ = from
#elif DEPTH == 15 || DEPTH == 16
# define PIXEL_TYPE uint16_t
-# define COPY_PIXEL(to, from) *to = from; SKIP_PIXEL(to)
# define COPY_PIXEL1(to, from) *to ++ = from
#elif DEPTH == 24
# define PIXEL_TYPE uint8_t
-# define COPY_PIXEL(to, from) \
- to[0] = from; to[1] = (from) >> 8; to[2] = (from) >> 16; SKIP_PIXEL(to)
# define COPY_PIXEL1(to, from) \
*to ++ = from; *to ++ = (from) >> 8; *to ++ = (from) >> 16
#elif DEPTH == 32
# define PIXEL_TYPE uint32_t
-# define COPY_PIXEL(to, from) *to = from; SKIP_PIXEL(to)
# define COPY_PIXEL1(to, from) *to ++ = from
#else
# error unknown bit depth
//#define OMAP_DSS_DEBUG
//#define OMAP_DSS_DEBUG_DISPC
//#define OMAP_DSS_DEBUG_DISS
-#define OMAP_DSS_DEBUG_DSI
+//#define OMAP_DSS_DEBUG_DSI
//#define OMAP_DSS_DEBUG_RFBI
//#define OMAP_DSS_DEBUG_VENC
struct omap3_lcd_panel_s {
struct omap_dss_s *dss;
DisplayState *state;
- omap3_lcd_panel_fn_t *line_fn_tab[2];
omap3_lcd_panel_fn_t line_fn;
uint32_t invalidate;
};
struct omap_dss_s {
qemu_irq irq;
qemu_irq drq;
- DisplayState *state;
int autoidle;
int control;
static void omap_dsi_reset(struct omap_dss_s *s)
{
- bzero(&s->dsi, sizeof(s->dsi));
+ memset(&s->dsi, 0, sizeof(s->dsi));
s->dsi.sysconfig = 0x11;
s->dsi.ctrl = 0x100;
s->dsi.complexio_cfg1 = 0x20000000;
omap_dss_reset(s);
-#if 0
- s->state = graphic_console_init(omap_update_display,
- omap_invalidate_display, omap_screen_dump, s);
-#endif
-
register_savevm("omap_dss", -1, 0,
omap_dss_save_state, omap_dss_load_state, s);
/*omap3 lcd panel stuff*/
+#define DEPTH 8
+#include "omap3_lcd_panel_template.h"
+#define DEPTH 15
+#include "omap3_lcd_panel_template.h"
+#define DEPTH 16
+#include "omap3_lcd_panel_template.h"
+#define DEPTH 24
+#include "omap3_lcd_panel_template.h"
+#define DEPTH 32
+#include "omap3_lcd_panel_template.h"
+
/* Bytes(!) per pixel */
static const int omap3_lcd_panel_bpp[0x10] = {
0, /* 0x0: BITMAP1 (CLUT) */
/* check for setup changes since last visit only if flagged */
if (dss->dispc.invalidate) {
dss->dispc.invalidate = 0;
- if (!(dss->dispc.l[0].rotation_flag)) { /* rotation*/
- s->line_fn = s->line_fn_tab[0][dss->dispc.l[0].gfx_format];
- } else {
- fprintf(stderr, "%s: rotation is not supported \n", __FUNCTION__);
- exit(1);
- }
- if (!s->line_fn) {
- fprintf(stderr,
- "%s: line_fn is NULL - unsupported gfx_format (%d)\n",
- __FUNCTION__, dss->dispc.l[0].gfx_format);
- exit(1);
- }
if (lcd_width != ds_get_width(s->state)
|| lcd_height != ds_get_height(s->state)) {
qemu_console_resize(s->state, lcd_width, lcd_height);
s->invalidate = 1;
}
+ int gf = dss->dispc.l[0].gfx_format;
+ if (!(dss->dispc.l[0].rotation_flag)) { /* rotation*/
+ switch (ds_get_bits_per_pixel(s->state)) {
+ case 8: s->line_fn = omap3_lcd_panel_draw_fn_8[gf]; break;
+ case 15: s->line_fn = omap3_lcd_panel_draw_fn_15[gf]; break;
+ case 16: s->line_fn = omap3_lcd_panel_draw_fn_16[gf]; break;
+ case 24: s->line_fn = omap3_lcd_panel_draw_fn_24[gf]; break;
+ case 32: s->line_fn = omap3_lcd_panel_draw_fn_32[gf]; break;
+ default: s->line_fn = 0; break;
+ }
+ } else {
+ switch (ds_get_bits_per_pixel(s->state)) {
+ case 8: s->line_fn = omap3_lcd_panel_draw_fn_r_8[gf]; break;
+ case 15: s->line_fn = omap3_lcd_panel_draw_fn_r_15[gf]; break;
+ case 16: s->line_fn = omap3_lcd_panel_draw_fn_r_16[gf]; break;
+ case 24: s->line_fn = omap3_lcd_panel_draw_fn_r_24[gf]; break;
+ case 32: s->line_fn = omap3_lcd_panel_draw_fn_r_32[gf]; break;
+ default: s->line_fn = 0; break;
+ }
+ }
+ }
+ if (!s->line_fn) {
+ fprintf(stderr,
+ "%s: line_fn is NULL - host bpp=%d, omap3 lcd gfx_format=%d\n",
+ __FUNCTION__,
+ ds_get_bits_per_pixel(s->state),
+ dss->dispc.l[0].gfx_format);
+ exit(1);
}
/* Resolution */
omap_dss_interrupt_update(dss);
}
-/*omap lcd stuff*/
-#define DEPTH 8
-#include "omap3_lcd_panel_template.h"
-#define DEPTH 15
-#include "omap3_lcd_panel_template.h"
-#define DEPTH 16
-#include "omap3_lcd_panel_template.h"
-#define DEPTH 24
-#include "omap3_lcd_panel_template.h"
-#define DEPTH 32
-#include "omap3_lcd_panel_template.h"
-
void *omap3_lcd_panel_init()
{
struct omap3_lcd_panel_s *s = (struct omap3_lcd_panel_s *) qemu_mallocz(sizeof(*s));
s->state = graphic_console_init(omap3_lcd_panel_update_display,
omap3_lcd_panel_invalidate_display,
NULL, NULL, s);
-
- switch (ds_get_bits_per_pixel(s->state)) {
- case 0:
- s->line_fn_tab[0] = s->line_fn_tab[1] =
- qemu_mallocz(sizeof(omap3_lcd_panel_fn_t) * 0x10);
- break;
- case 8:
- s->line_fn_tab[0] = omap3_lcd_panel_draw_fn_8;
- s->line_fn_tab[1] = omap3_lcd_panel_draw_fn_r_8;
- break;
- case 15:
- s->line_fn_tab[0] = omap3_lcd_panel_draw_fn_15;
- s->line_fn_tab[1] = omap3_lcd_panel_draw_fn_r_15;
- break;
- case 16:
- s->line_fn_tab[0] = omap3_lcd_panel_draw_fn_16;
- s->line_fn_tab[1] = omap3_lcd_panel_draw_fn_r_16;
- break;
- case 24:
- s->line_fn_tab[0] = omap3_lcd_panel_draw_fn_24;
- s->line_fn_tab[1] = omap3_lcd_panel_draw_fn_r_24;
- break;
- case 32:
- s->line_fn_tab[0] = omap3_lcd_panel_draw_fn_32;
- s->line_fn_tab[1] = omap3_lcd_panel_draw_fn_r_32;
- break;
- default:
- fprintf(stderr, "%s: Bad color depth\n", __FUNCTION__);
- exit(1);
- }
-
return s;
}