summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dev/arm/RealView.py3
-rw-r--r--src/dev/arm/pl111.cc26
-rw-r--r--src/dev/arm/pl111.hh3
3 files changed, 16 insertions, 16 deletions
diff --git a/src/dev/arm/RealView.py b/src/dev/arm/RealView.py
index 51a82f438..f2fc9c0af 100644
--- a/src/dev/arm/RealView.py
+++ b/src/dev/arm/RealView.py
@@ -148,8 +148,7 @@ class Pl050(AmbaIntDevice):
class Pl111(AmbaDmaDevice):
type = 'Pl111'
cxx_header = "dev/arm/pl111.hh"
- # Override the default clock
- clock = '24MHz'
+ pixel_clock = Param.Clock('24MHz', "Pixel clock")
vnc = Param.VncInput(Parent.any, "Vnc server for remote frame buffer display")
amba_id = 0x00141111
diff --git a/src/dev/arm/pl111.cc b/src/dev/arm/pl111.cc
index c68f606cd..2973cda27 100644
--- a/src/dev/arm/pl111.cc
+++ b/src/dev/arm/pl111.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010 ARM Limited
+ * Copyright (c) 2010-2012 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -64,6 +64,7 @@ Pl111::Pl111(const Params *p)
clcdCrsrCtrl(0), clcdCrsrConfig(0), clcdCrsrPalette0(0),
clcdCrsrPalette1(0), clcdCrsrXY(0), clcdCrsrClip(0), clcdCrsrImsc(0),
clcdCrsrIcr(0), clcdCrsrRis(0), clcdCrsrMis(0),
+ pixelClock(p->pixel_clock),
vnc(p->vnc), bmp(NULL), width(LcdMaxWidth), height(LcdMaxHeight),
bytesPerPixel(4), startTime(0), startAddr(0), maxAddr(0), curAddr(0),
waterMark(0), dmaPendingNum(0), readEvent(this), fillFifoEvent(this),
@@ -440,14 +441,12 @@ Pl111::readFramebuffer()
schedule(intEvent, nextCycle());
curAddr = 0;
- startTime = curCycle();
+ startTime = curTick();
maxAddr = static_cast<Addr>(length * bytesPerPixel);
DPRINTF(PL111, " lcd frame buffer size of %d bytes \n", maxAddr);
- dmaPendingNum = 0;
-
fillFifo();
}
@@ -475,13 +474,15 @@ Pl111::fillFifo()
void
Pl111::dmaDone()
{
- Cycles maxFrameTime(lcdTiming2.cpl * height);
+ DPRINTF(PL111, "DMA Done\n");
+
+ Tick maxFrameTime = lcdTiming2.cpl * height * pixelClock;
--dmaPendingNum;
if (maxAddr == curAddr && !dmaPendingNum) {
- if ((curCycle() - startTime) > maxFrameTime) {
- warn("CLCD controller buffer underrun, took %d cycles when should"
+ if ((curTick() - startTime) > maxFrameTime) {
+ warn("CLCD controller buffer underrun, took %d ticks when should"
" have taken %d\n", curTick() - startTime, maxFrameTime);
lcdRis.underflow = 1;
if (!intEvent.scheduled())
@@ -500,14 +501,11 @@ Pl111::dmaDone()
// schedule the next read based on when the last frame started
// and the desired fps (i.e. maxFrameTime), we turn the
- // argument into a relative number of cycles in the future by
- // subtracting curCycle()
+ // argument into a relative number of cycles in the future
if (lcdControl.lcden)
- // @todo: This is a terrible way of doing the time
- // keeping, make it all relative
- schedule(readEvent,
- clockEdge(Cycles(startTime - curCycle() +
- maxFrameTime)));
+ schedule(readEvent, clockEdge(ticksToCycles(startTime -
+ curTick() +
+ maxFrameTime)));
}
if (dmaPendingNum > (maxOutstandingDma - waterMark))
diff --git a/src/dev/arm/pl111.hh b/src/dev/arm/pl111.hh
index 49512fcc0..2388e1c7a 100644
--- a/src/dev/arm/pl111.hh
+++ b/src/dev/arm/pl111.hh
@@ -227,6 +227,9 @@ class Pl111: public AmbaDmaDevice
/** Cursor masked interrupt status register - const */
InterruptReg clcdCrsrMis;
+ /** Pixel clock */
+ Tick pixelClock;
+
/** VNC server */
VncInput *vnc;