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 --- |