pl111.cc (10565:23593fdaadcd) pl111.cc (10839:10cac0f0f419)
1/*
1/*
2 * Copyright (c) 2010-2012 ARM Limited
2 * Copyright (c) 2010-2012, 2015 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated

--- 23 unchanged lines hidden (view full) ---

34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * Authors: William Wang
38 * Ali Saidi
39 */
40
41#include "base/vnc/vncinput.hh"
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated

--- 23 unchanged lines hidden (view full) ---

34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * Authors: William Wang
38 * Ali Saidi
39 */
40
41#include "base/vnc/vncinput.hh"
42#include "base/bitmap.hh"
43#include "base/output.hh"
44#include "base/trace.hh"
45#include "debug/PL111.hh"
46#include "debug/Uart.hh"
47#include "dev/arm/amba_device.hh"
48#include "dev/arm/base_gic.hh"
49#include "dev/arm/pl111.hh"
50#include "mem/packet.hh"

--- 7 unchanged lines hidden (view full) ---

58// initialize clcd registers
59Pl111::Pl111(const Params *p)
60 : AmbaDmaDevice(p), lcdTiming0(0), lcdTiming1(0), lcdTiming2(0),
61 lcdTiming3(0), lcdUpbase(0), lcdLpbase(0), lcdControl(0), lcdImsc(0),
62 lcdRis(0), lcdMis(0),
63 clcdCrsrCtrl(0), clcdCrsrConfig(0), clcdCrsrPalette0(0),
64 clcdCrsrPalette1(0), clcdCrsrXY(0), clcdCrsrClip(0), clcdCrsrImsc(0),
65 clcdCrsrIcr(0), clcdCrsrRis(0), clcdCrsrMis(0),
42#include "base/output.hh"
43#include "base/trace.hh"
44#include "debug/PL111.hh"
45#include "debug/Uart.hh"
46#include "dev/arm/amba_device.hh"
47#include "dev/arm/base_gic.hh"
48#include "dev/arm/pl111.hh"
49#include "mem/packet.hh"

--- 7 unchanged lines hidden (view full) ---

57// initialize clcd registers
58Pl111::Pl111(const Params *p)
59 : AmbaDmaDevice(p), lcdTiming0(0), lcdTiming1(0), lcdTiming2(0),
60 lcdTiming3(0), lcdUpbase(0), lcdLpbase(0), lcdControl(0), lcdImsc(0),
61 lcdRis(0), lcdMis(0),
62 clcdCrsrCtrl(0), clcdCrsrConfig(0), clcdCrsrPalette0(0),
63 clcdCrsrPalette1(0), clcdCrsrXY(0), clcdCrsrClip(0), clcdCrsrImsc(0),
64 clcdCrsrIcr(0), clcdCrsrRis(0), clcdCrsrMis(0),
66 pixelClock(p->pixel_clock), vnc(p->vnc), bmp(NULL), pic(NULL),
65 pixelClock(p->pixel_clock),
66 converter(PixelConverter::rgba8888_le), fb(LcdMaxWidth, LcdMaxHeight),
67 vnc(p->vnc), bmp(&fb), pic(NULL),
67 width(LcdMaxWidth), height(LcdMaxHeight),
68 bytesPerPixel(4), startTime(0), startAddr(0), maxAddr(0), curAddr(0),
69 waterMark(0), dmaPendingNum(0), readEvent(this), fillFifoEvent(this),
70 dmaDoneEventAll(maxOutstandingDma, this),
71 dmaDoneEventFree(maxOutstandingDma),
72 intEvent(this), enableCapture(p->enable_capture)
73{
74 pioSize = 0xFFFF;
75
76 dmaBuffer = new uint8_t[buffer_size];
77
78 memset(lcdPalette, 0, sizeof(lcdPalette));
79 memset(cursorImage, 0, sizeof(cursorImage));
80 memset(dmaBuffer, 0, buffer_size);
81
82 for (int i = 0; i < maxOutstandingDma; ++i)
83 dmaDoneEventFree[i] = &dmaDoneEventAll[i];
84
85 if (vnc)
68 width(LcdMaxWidth), height(LcdMaxHeight),
69 bytesPerPixel(4), startTime(0), startAddr(0), maxAddr(0), curAddr(0),
70 waterMark(0), dmaPendingNum(0), readEvent(this), fillFifoEvent(this),
71 dmaDoneEventAll(maxOutstandingDma, this),
72 dmaDoneEventFree(maxOutstandingDma),
73 intEvent(this), enableCapture(p->enable_capture)
74{
75 pioSize = 0xFFFF;
76
77 dmaBuffer = new uint8_t[buffer_size];
78
79 memset(lcdPalette, 0, sizeof(lcdPalette));
80 memset(cursorImage, 0, sizeof(cursorImage));
81 memset(dmaBuffer, 0, buffer_size);
82
83 for (int i = 0; i < maxOutstandingDma; ++i)
84 dmaDoneEventFree[i] = &dmaDoneEventAll[i];
85
86 if (vnc)
86 vnc->setFramebufferAddr(dmaBuffer);
87 vnc->setFrameBuffer(&fb);
87}
88
89Pl111::~Pl111()
90{
91 delete[] dmaBuffer;
92}
93
94// read registers and frame buffer

--- 278 unchanged lines hidden (view full) ---

373 break;
374 }
375 }
376
377 pkt->makeAtomicResponse();
378 return pioDelay;
379}
380
88}
89
90Pl111::~Pl111()
91{
92 delete[] dmaBuffer;
93}
94
95// read registers and frame buffer

--- 278 unchanged lines hidden (view full) ---

374 break;
375 }
376 }
377
378 pkt->makeAtomicResponse();
379 return pioDelay;
380}
381
382PixelConverter
383Pl111::pixelConverter() const
384{
385 unsigned rw, gw, bw;
386 unsigned offsets[3];
387
388 switch (lcdControl.lcdbpp) {
389 case bpp24:
390 rw = gw = bw = 8;
391 offsets[0] = 0;
392 offsets[1] = 8;
393 offsets[2] = 16;
394 break;
395
396 case bpp16m565:
397 rw = 5;
398 gw = 6;
399 bw = 5;
400 offsets[0] = 0;
401 offsets[1] = 5;
402 offsets[2] = 11;
403 break;
404
405 default:
406 panic("Unimplemented video mode\n");
407 }
408
409 if (lcdControl.bgr) {
410 return PixelConverter(
411 bytesPerPixel,
412 offsets[2], offsets[1], offsets[0],
413 rw, gw, bw,
414 LittleEndianByteOrder);
415 } else {
416 return PixelConverter(
417 bytesPerPixel,
418 offsets[0], offsets[1], offsets[2],
419 rw, gw, bw,
420 LittleEndianByteOrder);
421 }
422}
423
381void
382Pl111::updateVideoParams()
383{
424void
425Pl111::updateVideoParams()
426{
384 if (lcdControl.lcdbpp == bpp24) {
385 bytesPerPixel = 4;
386 } else if (lcdControl.lcdbpp == bpp16m565) {
387 bytesPerPixel = 2;
388 }
427 if (lcdControl.lcdbpp == bpp24) {
428 bytesPerPixel = 4;
429 } else if (lcdControl.lcdbpp == bpp16m565) {
430 bytesPerPixel = 2;
431 }
389
432
390 if (vnc) {
391 if (lcdControl.lcdbpp == bpp24 && lcdControl.bgr)
392 vnc->setFrameBufferParams(VideoConvert::bgr8888, width,
393 height);
394 else if (lcdControl.lcdbpp == bpp24 && !lcdControl.bgr)
395 vnc->setFrameBufferParams(VideoConvert::rgb8888, width,
396 height);
397 else if (lcdControl.lcdbpp == bpp16m565 && lcdControl.bgr)
398 vnc->setFrameBufferParams(VideoConvert::bgr565, width,
399 height);
400 else if (lcdControl.lcdbpp == bpp16m565 && !lcdControl.bgr)
401 vnc->setFrameBufferParams(VideoConvert::rgb565, width,
402 height);
403 else
404 panic("Unimplemented video mode\n");
405 }
433 fb.resize(width, height);
434 converter = pixelConverter();
406
435
407 if (bmp)
408 delete bmp;
409
410 if (lcdControl.lcdbpp == bpp24 && lcdControl.bgr)
411 bmp = new Bitmap(VideoConvert::bgr8888, width, height, dmaBuffer);
412 else if (lcdControl.lcdbpp == bpp24 && !lcdControl.bgr)
413 bmp = new Bitmap(VideoConvert::rgb8888, width, height, dmaBuffer);
414 else if (lcdControl.lcdbpp == bpp16m565 && lcdControl.bgr)
415 bmp = new Bitmap(VideoConvert::bgr565, width, height, dmaBuffer);
416 else if (lcdControl.lcdbpp == bpp16m565 && !lcdControl.bgr)
417 bmp = new Bitmap(VideoConvert::rgb565, width, height, dmaBuffer);
418 else
419 panic("Unimplemented video mode\n");
436 // Workaround configuration bugs where multiple display
437 // controllers are attached to the same VNC server by reattaching
438 // enabled devices. This isn't ideal, but works as long as only
439 // one display controller is active at a time.
440 if (lcdControl.lcdpwr && vnc)
441 vnc->setFrameBuffer(&fb);
420}
421
422void
423Pl111::startDma()
424{
425 if (dmaPendingNum != 0 || readEvent.scheduled())
426 return;
427 readFramebuffer();

--- 60 unchanged lines hidden (view full) ---

488 warn("CLCD controller buffer underrun, took %d ticks when should"
489 " have taken %d\n", curTick() - startTime, maxFrameTime);
490 lcdRis.underflow = 1;
491 if (!intEvent.scheduled())
492 schedule(intEvent, clockEdge());
493 }
494
495 assert(!readEvent.scheduled());
442}
443
444void
445Pl111::startDma()
446{
447 if (dmaPendingNum != 0 || readEvent.scheduled())
448 return;
449 readFramebuffer();

--- 60 unchanged lines hidden (view full) ---

510 warn("CLCD controller buffer underrun, took %d ticks when should"
511 " have taken %d\n", curTick() - startTime, maxFrameTime);
512 lcdRis.underflow = 1;
513 if (!intEvent.scheduled())
514 schedule(intEvent, clockEdge());
515 }
516
517 assert(!readEvent.scheduled());
518 fb.copyIn(dmaBuffer, converter);
496 if (vnc)
497 vnc->setDirty();
498
499 if (enableCapture) {
500 DPRINTF(PL111, "-- write out frame buffer into bmp\n");
501
502 if (!pic)
503 pic = simout.create(csprintf("%s.framebuffer.bmp", sys->name()), true);
504
519 if (vnc)
520 vnc->setDirty();
521
522 if (enableCapture) {
523 DPRINTF(PL111, "-- write out frame buffer into bmp\n");
524
525 if (!pic)
526 pic = simout.create(csprintf("%s.framebuffer.bmp", sys->name()), true);
527
505 assert(bmp);
506 assert(pic);
507 pic->seekp(0);
528 assert(pic);
529 pic->seekp(0);
508 bmp->write(pic);
530 bmp.write(*pic);
509 }
510
511 // schedule the next read based on when the last frame started
512 // and the desired fps (i.e. maxFrameTime), we turn the
513 // argument into a relative number of cycles in the future
514 if (lcdControl.lcden)
515 schedule(readEvent, clockEdge(ticksToCycles(startTime -
516 curTick() +

--- 199 unchanged lines hidden (view full) ---

716 schedule(dmaDoneEventAll[x], dma_done_event_tick[x]);
717 else
718 dmaDoneEventFree.push_back(&dmaDoneEventAll[x]);
719 }
720 assert(maxOutstandingDma - dmaDoneEventFree.size() == dmaPendingNum);
721
722 if (lcdControl.lcdpwr) {
723 updateVideoParams();
531 }
532
533 // schedule the next read based on when the last frame started
534 // and the desired fps (i.e. maxFrameTime), we turn the
535 // argument into a relative number of cycles in the future
536 if (lcdControl.lcden)
537 schedule(readEvent, clockEdge(ticksToCycles(startTime -
538 curTick() +

--- 199 unchanged lines hidden (view full) ---

738 schedule(dmaDoneEventAll[x], dma_done_event_tick[x]);
739 else
740 dmaDoneEventFree.push_back(&dmaDoneEventAll[x]);
741 }
742 assert(maxOutstandingDma - dmaDoneEventFree.size() == dmaPendingNum);
743
744 if (lcdControl.lcdpwr) {
745 updateVideoParams();
746 fb.copyIn(dmaBuffer, converter);
724 if (vnc)
725 vnc->setDirty();
726 }
727}
728
729void
730Pl111::generateInterrupt()
731{

--- 25 unchanged lines hidden ---
747 if (vnc)
748 vnc->setDirty();
749 }
750}
751
752void
753Pl111::generateInterrupt()
754{

--- 25 unchanged lines hidden ---