Lines Matching +full:versatile +full:- +full:lcd
2 * Arm PrimeCell PL110 Color LCD Controller
4 * Copyright (c) 2005-2009 CodeSourcery.
13 #include "hw/qdev-properties.h"
45 /* The Versatile/PB uses a slightly modified PL110 controller. */
119 /* The ARM documentation (DDI0224C) says the CLCDC on the Versatile board
210 return (s->cr & PL110_CR_EN) && (s->cr & PL110_CR_PWR); in pl110_enabled()
216 DisplaySurface *surface = qemu_console_surface(s->con); in pl110_update_display()
227 if (s->cr & PL110_CR_BGR) in pl110_update_display()
232 if ((s->version != VERSION_PL111) && (s->bpp == BPP_16)) { in pl110_update_display()
245 switch (s->mux_ctrl) { in pl110_update_display()
247 bpp_offset = (BPP_16_565 - BPP_16); in pl110_update_display()
255 bpp_offset += (BPP_16_565 - BPP_16); in pl110_update_display()
260 if (s->cr & PL110_CR_BEBO) { in pl110_update_display()
261 fn = pl110_draw_fn_32[s->bpp + 8 + bpp_offset]; in pl110_update_display()
262 } else if (s->cr & PL110_CR_BEPO) { in pl110_update_display()
263 fn = pl110_draw_fn_32[s->bpp + 16 + bpp_offset]; in pl110_update_display()
265 fn = pl110_draw_fn_32[s->bpp + bpp_offset]; in pl110_update_display()
268 src_width = s->cols; in pl110_update_display()
269 switch (s->bpp) { in pl110_update_display()
291 if (s->invalidate) { in pl110_update_display()
292 framebuffer_update_memory_section(&s->fbsection, in pl110_update_display()
293 s->fbmem, in pl110_update_display()
294 s->upbase, in pl110_update_display()
295 s->rows, src_width); in pl110_update_display()
298 framebuffer_update_display(surface, &s->fbsection, in pl110_update_display()
299 s->cols, s->rows, in pl110_update_display()
300 src_width, s->cols * 4, 0, in pl110_update_display()
301 s->invalidate, in pl110_update_display()
302 fn, s->palette, in pl110_update_display()
306 dpy_gfx_update(s->con, 0, first, s->cols, last - first + 1); in pl110_update_display()
308 s->invalidate = 0; in pl110_update_display()
314 s->invalidate = 1; in pl110_invalidate_display()
316 qemu_console_resize(s->con, s->cols, s->rows); in pl110_invalidate_display()
322 DisplaySurface *surface = qemu_console_surface(s->con); in pl110_update_palette()
327 raw = s->raw_palette[n]; in pl110_update_palette()
339 s->palette[n] = rgb_to_pixel8(r, g, b); in pl110_update_palette()
342 s->palette[n] = rgb_to_pixel15(r, g, b); in pl110_update_palette()
345 s->palette[n] = rgb_to_pixel16(r, g, b); in pl110_update_palette()
349 s->palette[n] = rgb_to_pixel32(r, g, b); in pl110_update_palette()
358 if (width != s->cols || height != s->rows) { in pl110_resize()
360 qemu_console_resize(s->con, width, height); in pl110_resize()
363 s->cols = width; in pl110_resize()
364 s->rows = height; in pl110_resize()
371 if (s->int_status & s->int_mask) { in pl110_update()
372 qemu_irq_raise(s->irq); in pl110_update()
374 qemu_irq_lower(s->irq); in pl110_update()
382 /* Fire the vertical compare and next base IRQs and re-arm */ in pl110_vblank_interrupt()
383 s->int_status |= (PL110_IE_NB | PL110_IE_VC); in pl110_vblank_interrupt()
384 timer_mod(s->vblank_timer, in pl110_vblank_interrupt()
396 return idregs[s->version][(offset - 0xfe0) >> 2]; in pl110_read()
399 return s->raw_palette[(offset - 0x200) >> 2]; in pl110_read()
403 return s->timing[0]; in pl110_read()
405 return s->timing[1]; in pl110_read()
407 return s->timing[2]; in pl110_read()
409 return s->timing[3]; in pl110_read()
411 return s->upbase; in pl110_read()
413 return s->lpbase; in pl110_read()
415 if (s->version != VERSION_PL110) { in pl110_read()
416 return s->cr; in pl110_read()
418 return s->int_mask; in pl110_read()
420 if (s->version != VERSION_PL110) { in pl110_read()
421 return s->int_mask; in pl110_read()
423 return s->cr; in pl110_read()
425 return s->int_status; in pl110_read()
427 return s->int_status & s->int_mask; in pl110_read()
430 return s->upbase; in pl110_read()
432 return s->lpbase; in pl110_read()
448 s->invalidate = 1; in pl110_write()
451 n = (offset - 0x200) >> 2; in pl110_write()
452 s->raw_palette[(offset - 0x200) >> 2] = val; in pl110_write()
458 s->timing[0] = val; in pl110_write()
460 pl110_resize(s, n, s->rows); in pl110_write()
463 s->timing[1] = val; in pl110_write()
465 pl110_resize(s, s->cols, n); in pl110_write()
468 s->timing[2] = val; in pl110_write()
471 s->timing[3] = val; in pl110_write()
474 s->upbase = val; in pl110_write()
477 s->lpbase = val; in pl110_write()
480 if (s->version != VERSION_PL110) { in pl110_write()
484 s->int_mask = val; in pl110_write()
488 if (s->version != VERSION_PL110) { in pl110_write()
492 s->cr = val; in pl110_write()
493 s->bpp = (val >> 1) & 7; in pl110_write()
495 qemu_console_resize(s->con, s->cols, s->rows); in pl110_write()
496 timer_mod(s->vblank_timer, in pl110_write()
500 timer_del(s->vblank_timer); in pl110_write()
504 s->int_status &= ~val; in pl110_write()
522 s->mux_ctrl = level; in pl110_mux_ctrl_set()
539 DEFINE_PROP_LINK("framebuffer-memory", PL110State, fbmem,
549 if (!s->fbmem) { in pl110_realize()
550 error_setg(errp, "'framebuffer-memory' property was not set"); in pl110_realize()
554 memory_region_init_io(&s->iomem, OBJECT(s), &pl110_ops, s, "pl110", 0x1000); in pl110_realize()
555 sysbus_init_mmio(sbd, &s->iomem); in pl110_realize()
556 sysbus_init_irq(sbd, &s->irq); in pl110_realize()
557 s->vblank_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, in pl110_realize()
560 s->con = graphic_console_init(dev, 0, &pl110_gfx_ops, s); in pl110_realize()
567 s->version = VERSION_PL110; in pl110_init()
574 s->version = VERSION_PL110_VERSATILE; in pl110_versatile_init()
581 s->version = VERSION_PL111; in pl111_init()
588 set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); in pl110_class_init()
589 dc->vmsd = &vmstate_pl110; in pl110_class_init()
590 dc->realize = pl110_realize; in pl110_class_init()