650 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			650 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * Copyright 2004 by Costas Stylianou <costas.stylianou@psion.com> +44(0)7850 394095
 | 
						|
 *
 | 
						|
 * Permission to use, copy, modify, distribute, and sell this software and its
 | 
						|
 * documentation for any purpose is hereby granted without fee, provided that
 | 
						|
 * the above copyright notice appear in all copies and that both that
 | 
						|
 * copyright notice and this permission notice appear in supporting
 | 
						|
 * documentation, and that the name of Costas Sylianou not be used in
 | 
						|
 * advertising or publicity pertaining to distribution of the software without
 | 
						|
 * specific, written prior permission. Costas Stylianou makes no representations
 | 
						|
 * about the suitability of this software for any purpose.  It is provided
 | 
						|
 * "as is" without express or implied warranty.
 | 
						|
 *
 | 
						|
 * COSTAS STYLIANOU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | 
						|
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | 
						|
 * EVENT SHALL COSTAS STYLIANOU BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | 
						|
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | 
						|
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | 
						|
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
						|
 * PERFORMANCE OF THIS SOFTWARE.
 | 
						|
 */
 | 
						|
/* 
 | 
						|
 * epson13806draw.c - Implementation of hardware accelerated functions for epson S1D13806
 | 
						|
 *               Graphic controller.
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 28-Jan-04  C.Stylianou       PRJ NBL: Created from chipsdraw.c
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#include    "epson13806.h"
 | 
						|
#include    "epson13806draw.h"
 | 
						|
#include    "epson13806reg.h"
 | 
						|
 | 
						|
#include    "kaa.h"
 | 
						|
 | 
						|
#include    "gcstruct.h"
 | 
						|
#include    "scrnintstr.h"
 | 
						|
#include    "pixmapstr.h"
 | 
						|
#include    "regionstr.h"
 | 
						|
#include    "mistruct.h"
 | 
						|
#include    "dixfontstr.h"
 | 
						|
#include    "fb.h"
 | 
						|
#include    "migc.h"
 | 
						|
#include    "miline.h"
 | 
						|
 | 
						|
 | 
						|
// Functionality of BitBLT ROP register for Epson S1D13806 Graphics controller
 | 
						|
CARD8 epson13806Rop[16] = {
 | 
						|
    /* GXclear      */      0x00,         /* 0 */
 | 
						|
    /* GXand        */      0x08,         /* src AND dst */
 | 
						|
    /* GXandReverse */      0x04,         /* src AND NOT dst */
 | 
						|
    /* GXcopy       */      0x0C,         /* src */
 | 
						|
    /* GXandInverted*/      0x02,         /* NOT src AND dst */
 | 
						|
    /* GXnoop       */      0x0A,         /* dst */
 | 
						|
    /* GXxor        */      0x06,         /* src XOR dst */
 | 
						|
    /* GXor         */      0x0E,         /* src OR dst */
 | 
						|
    /* GXnor        */      0x01,         /* NOT src AND NOT dst */
 | 
						|
    /* GXequiv      */      0x09,         /* NOT src XOR dst */
 | 
						|
    /* GXinvert     */      0x05,         /* NOT dst */
 | 
						|
    /* GXorReverse  */      0x0D,         /* src OR NOT dst */
 | 
						|
    /* GXcopyInverted*/     0x03,         /* NOT src */
 | 
						|
    /* GXorInverted */      0x0B,         /* NOT src OR dst */
 | 
						|
    /* GXnand       */      0x07,         /* NOT src OR NOT dst */
 | 
						|
    /* GXset        */      0x0F,         /* 1 */
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#undef __DEBUG_EPSON__
 | 
						|
#undef __DEBUG_EPSON_FBSET__
 | 
						|
#undef __DEBUG_EPSON_SOLID__
 | 
						|
#undef __DEBUG_EPSON_COPY__
 | 
						|
 | 
						|
 | 
						|
#ifdef __DEBUG_EPSON__
 | 
						|
    #define EPSON_DEBUG(a) a
 | 
						|
#else
 | 
						|
    #define EPSON_DEBUG(a)
 | 
						|
#endif
 | 
						|
   
 | 
						|
#ifdef __DEBUG_EPSON_FBSET__
 | 
						|
    #define EPSON_DEBUG_FBSET(a) a
 | 
						|
#else
 | 
						|
    #define EPSON_DEBUG_FBSET(a)
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef __DEBUG_EPSON_SOLID__
 | 
						|
    #define EPSON_DEBUG_SOLID(a) a
 | 
						|
#else
 | 
						|
    #define EPSON_DEBUG_SOLID(a)
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef __DEBUG_EPSON_COPY__
 | 
						|
    #define EPSON_DEBUG_COPY(a) a
 | 
						|
#else
 | 
						|
    #define EPSON_DEBUG_COPY(a)
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
static unsigned int    byteStride;     // Distance between lines in the frame buffer (in bytes)
 | 
						|
static unsigned int    bytesPerPixel;
 | 
						|
static unsigned int    pixelStride;
 | 
						|
 | 
						|
static unsigned char *regbase;
 | 
						|
 | 
						|
/*
 | 
						|
 * epsonSet
 | 
						|
 *
 | 
						|
 * Description:    Sets Epson variables
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
static void
 | 
						|
epsonSet (ScreenPtr pScreen)
 | 
						|
{
 | 
						|
    EPSON_DEBUG_FBSET (fprintf(stderr,"+epsonSet\n"));
 | 
						|
 | 
						|
    KdScreenPriv(pScreen);
 | 
						|
   
 | 
						|
    byteStride = pScreenPriv->screen->fb[0].byteStride;
 | 
						|
    bytesPerPixel = pScreenPriv->screen->fb[0].bitsPerPixel >> 3;
 | 
						|
    pixelStride = pScreenPriv->screen->fb[0].pixelStride;
 | 
						|
 | 
						|
    EPSON_DEBUG_FBSET (fprintf(stderr,"byteStride:     [%x]\n", pScreenPriv->screen->fb[0].byteStride));
 | 
						|
    EPSON_DEBUG_FBSET (fprintf(stderr,"bytesPerPixel:  [%x]\n", pScreenPriv->screen->fb[0].bitsPerPixel >> 3));
 | 
						|
    EPSON_DEBUG_FBSET (fprintf(stderr,"pixelStride:    [%x]\n", pScreenPriv->screen->fb[0].pixelStride));
 | 
						|
 | 
						|
    EPSON_DEBUG_FBSET (fprintf(stderr,"-epsonSet\n"));
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * epsonBg
 | 
						|
 *
 | 
						|
 * Description:    Sets background colour
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
static void
 | 
						|
epsonBg (Pixel bg)
 | 
						|
{
 | 
						|
   EPSON13806_REG16(EPSON13806_BLTBGCOLOR) = bg;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * epsonFg
 | 
						|
 *
 | 
						|
 * Description:    Sets foreground colour
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
static void
 | 
						|
epsonFg (Pixel fg)
 | 
						|
{    
 | 
						|
    EPSON13806_REG16(EPSON13806_BLTFGCOLOR) = fg;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * epsonWaitForHwBltDone
 | 
						|
 *
 | 
						|
 * Description:    Wait for previous blt to be done before programming any blt registers
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
static void
 | 
						|
epsonWaitForHwBltDone (void)
 | 
						|
{
 | 
						|
    while (EPSON13806_REG (EPSON13806_BLTCTRL0) & EPSON13806_BLTCTRL0_ACTIVE) {}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * epsonDrawSync
 | 
						|
 *
 | 
						|
 * Description:    Sync hardware acceleration
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
static void
 | 
						|
epsonWaitMarker (ScreenPtr pScreen, int marker)
 | 
						|
{
 | 
						|
    EPSON_DEBUG (fprintf(stderr,"+epsonDrawSync\n"));
 | 
						|
 | 
						|
    epsonWaitForHwBltDone ();
 | 
						|
 | 
						|
    EPSON_DEBUG (fprintf(stderr,"-epsonDrawSync\n"));
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * epsonPrepareSolid
 | 
						|
 *
 | 
						|
 * Description:    Prepare Solid Fill i.e, can it be accelerated
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
static Bool
 | 
						|
epsonPrepareSolid (PixmapPtr    pPixmap,
 | 
						|
           int        alu,
 | 
						|
           Pixel    pm,
 | 
						|
           Pixel    fg)
 | 
						|
{
 | 
						|
    EPSON_DEBUG_SOLID (fprintf(stderr,"+epsonPrepareSolid\n"));
 | 
						|
    
 | 
						|
    FbBits  depthMask;
 | 
						|
 | 
						|
    depthMask = FbFullMask(pPixmap->drawable.depth);
 | 
						|
    if ((pm & depthMask) != depthMask)
 | 
						|
        return FALSE;
 | 
						|
	
 | 
						|
	epsonSet (pPixmap->drawable.pScreen);
 | 
						|
    fg &= 0xffff;
 | 
						|
    epsonFg (fg);
 | 
						|
    epsonBg (fg);
 | 
						|
	
 | 
						|
	epsonWaitForHwBltDone ();
 | 
						|
	
 | 
						|
	EPSON_DEBUG_SOLID (fprintf(stderr,"Solid.alu [0x%x], [%d]\n", alu ,epson13806Rop[alu]));
 | 
						|
	EPSON13806_REG(EPSON13806_BLTROP) = epson13806Rop[alu];
 | 
						|
	
 | 
						|
	if (epson13806Rop[alu] == GXnoop)
 | 
						|
	{
 | 
						|
		EPSON13806_REG(EPSON13806_BLTOPERATION) = EPSON13806_BLTOPERATION_PATFILLROP;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		EPSON13806_REG(EPSON13806_BLTOPERATION) = EPSON13806_BLTOPERATION_SOLIDFILL;
 | 
						|
	}
 | 
						|
   
 | 
						|
   
 | 
						|
    EPSON_DEBUG_SOLID (fprintf(stderr,"-epsonPrepareSolid\n"));
 | 
						|
    return TRUE;
 | 
						|
    
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * epsonSolid
 | 
						|
 *
 | 
						|
 * Description:    Executes Solid Fill
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
static void
 | 
						|
epsonSolid (int x1, int y1, int x2, int y2)
 | 
						|
{
 | 
						|
    
 | 
						|
    EPSON_DEBUG_SOLID (fprintf(stderr,"+epsonSolid\n"));
 | 
						|
    
 | 
						|
    CARD32  dst_addr;
 | 
						|
    int width, height;
 | 
						|
    
 | 
						|
    EPSON_DEBUG_SOLID (fprintf(stderr,"Solid X1 [%d] Y1 [%d] X2 [%d] Y2 [%d]\n", x1, y1, x2, y2));
 | 
						|
    
 | 
						|
    dst_addr = y1 * byteStride + x1 * bytesPerPixel;
 | 
						|
    width = ((x2 - x1)-1);
 | 
						|
    height = ((y2 - y1)-1);
 | 
						|
    
 | 
						|
    // program dst address
 | 
						|
    EPSON13806_REG16(EPSON13806_BLTDSTSTART01) = dst_addr;
 | 
						|
    EPSON13806_REG(EPSON13806_BLTDSTSTART2) = dst_addr >> 16;
 | 
						|
    
 | 
						|
    // program width and height of blit
 | 
						|
    EPSON13806_REG16(EPSON13806_BLTWIDTH) = width;
 | 
						|
    EPSON13806_REG16(EPSON13806_BLTHEIGHT) = height;
 | 
						|
    
 | 
						|
    EPSON13806_REG(EPSON13806_BLTCTRL0) = EPSON13806_BLTCTRL0_ACTIVE;
 | 
						|
 | 
						|
    // Wait for operation to complete
 | 
						|
    while (EPSON13806_REG(EPSON13806_BLTCTRL0) & EPSON13806_BLTCTRL0_ACTIVE) {}
 | 
						|
        
 | 
						|
    EPSON_DEBUG_SOLID (fprintf(stderr,"-epsonSolid\n"));
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * epsonDoneSolid
 | 
						|
 *
 | 
						|
 * Description:    Done Solid
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
static void
 | 
						|
epsonDoneSolid (void)
 | 
						|
{
 | 
						|
    EPSON_DEBUG_SOLID (fprintf(stderr,"+epsonDoneSolid\n"));
 | 
						|
    
 | 
						|
    // Read from BitBLT data offset 0 to shut it down
 | 
						|
    //(void)EPSON13806_REG(EPSON13806_BITBLTDATA);
 | 
						|
 | 
						|
    EPSON_DEBUG_SOLID (fprintf(stderr,"-epsonDoneSolid\n"));
 | 
						|
    
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * epsonPrepareCopy
 | 
						|
 *
 | 
						|
 * Description:    Prepares BitBLT, i.e, can it be accelerated
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
static Bool
 | 
						|
epsonPrepareCopy (PixmapPtr    pSrcPixmap,
 | 
						|
          PixmapPtr    pDstPixmap,
 | 
						|
          int        dx,
 | 
						|
          int        dy,
 | 
						|
          int        alu,
 | 
						|
          Pixel        pm)
 | 
						|
{
 | 
						|
    EPSON_DEBUG_COPY (fprintf(stderr,"+epsonPrepareCopy dx [0x%x] dy [0x%x]\n", dx, dy));
 | 
						|
    
 | 
						|
    FbBits  depthMask;
 | 
						|
 | 
						|
    depthMask = FbFullMask(pDstPixmap->drawable.depth);
 | 
						|
    
 | 
						|
    if ((pm & depthMask) != depthMask)
 | 
						|
        return FALSE;
 | 
						|
    
 | 
						|
    epsonSet (pDstPixmap->drawable.pScreen);
 | 
						|
	epsonWaitForHwBltDone ();
 | 
						|
    EPSON13806_REG(EPSON13806_BLTROP) = epson13806Rop[alu];
 | 
						|
            
 | 
						|
    EPSON_DEBUG_COPY (fprintf(stderr,"-epsonPrepareCopy\n"));
 | 
						|
        
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * epsonCopy
 | 
						|
 *
 | 
						|
 * Description:    Executes BitBLT
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
static void
 | 
						|
epsonCopy (int srcX,
 | 
						|
       int srcY,
 | 
						|
       int dstX,
 | 
						|
       int dstY,
 | 
						|
       int width,
 | 
						|
       int height)
 | 
						|
{
 | 
						|
    EPSON_DEBUG_COPY (fprintf(stderr,"+epsonCopy\n"));
 | 
						|
    int    src_addr, dst_addr;
 | 
						|
    int neg_dir = FALSE;
 | 
						|
    
 | 
						|
    if (!width || !height)
 | 
						|
        return;
 | 
						|
    
 | 
						|
    src_addr = srcX * bytesPerPixel + srcY * byteStride;
 | 
						|
    dst_addr = dstX * bytesPerPixel + dstY * byteStride;
 | 
						|
    
 | 
						|
    /*
 | 
						|
     * See if regions overlap and dest region is beyond source region.
 | 
						|
     * If so, we need to do a move BLT in negative direction. Only applies
 | 
						|
     * if the BLT is not transparent.
 | 
						|
     */
 | 
						|
    
 | 
						|
    if ((srcX + width  > dstX) && (srcX < dstX + width) &&
 | 
						|
        (srcY + height > dstY) && (srcY < dstY + height) &&
 | 
						|
        (dst_addr > src_addr)) 
 | 
						|
    {
 | 
						|
        neg_dir = TRUE;
 | 
						|
            
 | 
						|
        // negative direction : get the coords of lower right corner
 | 
						|
        src_addr += byteStride * (height-1) + bytesPerPixel * (width-1);
 | 
						|
        dst_addr += byteStride * (height-1) + bytesPerPixel * (width-1);
 | 
						|
    }
 | 
						|
    
 | 
						|
    // program BLIT memory offset
 | 
						|
    EPSON13806_REG16(EPSON13806_BLTSTRIDE) = byteStride/2;
 | 
						|
 | 
						|
    // program src and dst addresses
 | 
						|
    EPSON13806_REG16(EPSON13806_BLTSRCSTART01) = src_addr;
 | 
						|
    EPSON13806_REG(EPSON13806_BLTSRCSTART2) = src_addr >> 16;
 | 
						|
    EPSON13806_REG16(EPSON13806_BLTDSTSTART01) = dst_addr;
 | 
						|
    EPSON13806_REG(EPSON13806_BLTDSTSTART2) = dst_addr >> 16;
 | 
						|
 | 
						|
    // program width and height of blit
 | 
						|
    EPSON13806_REG16(EPSON13806_BLTWIDTH) = width-1;
 | 
						|
    EPSON13806_REG16(EPSON13806_BLTHEIGHT) = height-1;
 | 
						|
    
 | 
						|
    // select pos/neg move BLIT
 | 
						|
    EPSON13806_REG(EPSON13806_BLTOPERATION) = neg_dir ? 
 | 
						|
                EPSON13806_BLTOPERATION_MOVENEGROP : EPSON13806_BLTOPERATION_MOVEPOSROP;
 | 
						|
    
 | 
						|
    EPSON13806_REG(EPSON13806_BLTCTRL0) = EPSON13806_BLTCTRL0_ACTIVE;
 | 
						|
 | 
						|
    // Wait for operation to complete
 | 
						|
    while (EPSON13806_REG(EPSON13806_BLTCTRL0) & EPSON13806_BLTCTRL0_ACTIVE) {}
 | 
						|
 | 
						|
    EPSON_DEBUG_COPY (fprintf(stderr,"-epsonCopy\n"));
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * epsonDoneCopy
 | 
						|
 *
 | 
						|
 * Description:    Done Copy
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
static void
 | 
						|
epsonDoneCopy (void)
 | 
						|
{
 | 
						|
    EPSON_DEBUG_COPY (fprintf(stderr,"+epsonDoneCopy\n"));
 | 
						|
    
 | 
						|
    // Read from BitBLT data offset 0 to shut it down
 | 
						|
    //(void)EPSON13806_REG(EPSON13806_BITBLTDATA);
 | 
						|
 | 
						|
    EPSON_DEBUG_COPY (fprintf(stderr,"-epsonDoneCopy\n"));
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * epsonDrawInit
 | 
						|
 *
 | 
						|
 * Description:    Configure the Epson S1D13806 for a 800x600 TFT colour display
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
Bool
 | 
						|
epsonDrawInit (ScreenPtr pScreen)
 | 
						|
{
 | 
						|
    KdScreenPriv(pScreen);
 | 
						|
    KdScreenInfo *screen = pScreenPriv->screen;
 | 
						|
    EpsonScrPriv *epsons = screen->driver;
 | 
						|
 | 
						|
   EPSON_DEBUG (fprintf(stderr,"+epsonDrawInit\n"));
 | 
						|
   
 | 
						|
   epsonSet(pScreen);
 | 
						|
 | 
						|
#if 0
 | 
						|
    EPSON13806_REG(EPSON13806_MISC) = 0x00;
 | 
						|
    EPSON13806_REG(EPSON13806_DISPMODE) = 0x00;
 | 
						|
    EPSON13806_REG16(EPSON13806_GPIOCFG) = 0xffff;
 | 
						|
    EPSON13806_REG16(EPSON13806_GPIOCTRL) = 0x0001;
 | 
						|
    
 | 
						|
    EPSON13806_REG(EPSON13806_MEMCLKCFG) = 0x01;
 | 
						|
    EPSON13806_REG(EPSON13806_LCDPCLKCFG) = 0x00;
 | 
						|
    EPSON13806_REG(EPSON13806_CRTPCLKCFG) = 0x02;
 | 
						|
    EPSON13806_REG(EPSON13806_MPCLKCFG) = 0x02;
 | 
						|
    EPSON13806_REG(EPSON13806_CPUMEMWAITSEL) = 0x01;
 | 
						|
    EPSON13806_REG(EPSON13806_MEMCFG) = 0x80;
 | 
						|
    EPSON13806_REG(EPSON13806_DRAMREFRESH) = 0x03;
 | 
						|
    EPSON13806_REG16(EPSON13806_DRAMTIMINGCTRL) = 0x0100;
 | 
						|
    
 | 
						|
    // 5ms delay for internal LCD SDRAM to initialize
 | 
						|
     usleep(5000);
 | 
						|
    
 | 
						|
    EPSON13806_REG(EPSON13806_PANELTYPE) = 0x25;
 | 
						|
    EPSON13806_REG(EPSON13806_MODRATE) = 0x00;
 | 
						|
    EPSON13806_REG(EPSON13806_LCDHDP) = 0x63;
 | 
						|
    EPSON13806_REG(EPSON13806_LCDHNDP) = 0x1f;
 | 
						|
    EPSON13806_REG(EPSON13806_TFTFPLINESTART) = 0x01;
 | 
						|
    EPSON13806_REG(EPSON13806_TFTFPLINEPULSE) = 0x0b;
 | 
						|
    EPSON13806_REG16(EPSON13806_LCDVDP0) = 0x0257;
 | 
						|
    EPSON13806_REG(EPSON13806_LCDVNDP) = 0x1b;
 | 
						|
    EPSON13806_REG(EPSON13806_TFTFPFRAMESTART) = 0x0a;
 | 
						|
    EPSON13806_REG(EPSON13806_TFTFPFRAMEPULSE) = 0x01;
 | 
						|
    EPSON13806_REG(EPSON13806_LCDDISPMODE) = 0x85;
 | 
						|
    EPSON13806_REG(EPSON13806_LCDMISC) = 0x00;
 | 
						|
    EPSON13806_REG16(EPSON13806_LCDSTART01) = 0x0000;
 | 
						|
    EPSON13806_REG(EPSON13806_LCDSTART2) = 0x00;
 | 
						|
    EPSON13806_REG16(EPSON13806_LCDSTRIDE) = byteStride>>1;
 | 
						|
    EPSON13806_REG(EPSON13806_LCDPIXELPAN) = 0x00;
 | 
						|
    EPSON13806_REG(EPSON13806_LCDFIFOHIGH) = 0x00;
 | 
						|
    EPSON13806_REG(EPSON13806_LCDFIFOLOW) = 0x00;
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
    EPSON13806_REG(EPSON13806_BLTCTRL0) = 0x00;
 | 
						|
    EPSON13806_REG(EPSON13806_BLTCTRL1) = 0x01;     // We're using 16 bpp
 | 
						|
    EPSON13806_REG16(EPSON13806_BLTSTRIDE) = byteStride>>1; // program BLIT memory offset
 | 
						|
    
 | 
						|
#if 0
 | 
						|
    EPSON13806_REG(EPSON13806_LUTMODE) = 0x00;
 | 
						|
    EPSON13806_REG(EPSON13806_LUTADDR) = 0x00;
 | 
						|
    EPSON13806_REG(EPSON13806_PWRSAVECFG) = 0x10;
 | 
						|
    EPSON13806_REG(EPSON13806_PWRSAVESTATUS) = 0x00;
 | 
						|
    EPSON13806_REG(EPSON13806_CPUMEMWATCHDOG) = 0x00;
 | 
						|
    EPSON13806_REG(EPSON13806_DISPMODE) = 0x01;
 | 
						|
    
 | 
						|
    // Enable backlight voltage
 | 
						|
    EPSON13806_REG16(EPSON13806_GPIOCTRL) |= 1<<1;
 | 
						|
    // 10ms delay after turning on LCD.
 | 
						|
    usleep(10000);
 | 
						|
#endif
 | 
						|
 | 
						|
    // Instruct the BitBLT unit to fill the screen with black, i.e clear fb.
 | 
						|
    static int addr = 0x00000000;
 | 
						|
    EPSON13806_REG16(EPSON13806_BLTDSTSTART01) = addr;
 | 
						|
    EPSON13806_REG(EPSON13806_BLTDSTSTART2) = addr >> 16;
 | 
						|
    EPSON13806_REG16(EPSON13806_BLTFGCOLOR) = 0x0000;
 | 
						|
    EPSON13806_REG(EPSON13806_BLTOPERATION) = EPSON13806_BLTOPERATION_SOLIDFILL; // solid fill blt
 | 
						|
    EPSON13806_REG16(EPSON13806_BLTWIDTH) = (0x0320-1);
 | 
						|
    EPSON13806_REG16(EPSON13806_BLTHEIGHT) = (0x0258-1);
 | 
						|
    EPSON13806_REG(EPSON13806_BLTCTRL0) = EPSON13806_BLTCTRL0_ACTIVE;
 | 
						|
 | 
						|
#if 0
 | 
						|
    // Enable LCD data
 | 
						|
    EPSON13806_REG(EPSON13806_LCDDISPMODE) &= ~(1<<7);
 | 
						|
    
 | 
						|
    // Turn on backlight full
 | 
						|
    EPSON13806_REG16(EPSON13806_GPIOCTRL) |= 0x00fc;
 | 
						|
#endif
 | 
						|
    
 | 
						|
    memset(&epsons->kaa, 0, sizeof(KaaScreenInfoRec));
 | 
						|
    epsons->kaa.waitMarker	= epsonWaitMarker;
 | 
						|
    epsons->kaa.PrepareSolid	= epsonPrepareSolid;
 | 
						|
    epsons->kaa.Solid		= epsonSolid;
 | 
						|
    epsons->kaa.DoneSolid	= epsonDoneSolid;
 | 
						|
    epsons->kaa.PrepareCopy	= epsonPrepareCopy;
 | 
						|
    epsons->kaa.Copy		= epsonCopy;
 | 
						|
    epsons->kaa.DoneCopy	= epsonDoneCopy;
 | 
						|
    epsons->kaa.flags		= KAA_OFFSCREEN_PIXMAPS;
 | 
						|
 | 
						|
    if (!kaaDrawInit (pScreen, &epsons->kaa))
 | 
						|
        return FALSE;
 | 
						|
    
 | 
						|
    EPSON_DEBUG (fprintf(stderr,"-epsonDrawInit\n"));
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * epsonDrawEnable
 | 
						|
 *
 | 
						|
 * Description:    Enables hardware acceleration
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
void
 | 
						|
epsonDrawEnable (ScreenPtr pScreen)
 | 
						|
{
 | 
						|
    EPSON_DEBUG (fprintf(stderr,"+epsonDrawEnable\n"));
 | 
						|
    epsonWaitForHwBltDone ();
 | 
						|
    kaaMarkSync (pScreen);
 | 
						|
    EPSON_DEBUG (fprintf(stderr,"-epsonDrawEnable\n"));
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * epsonDrawDisable
 | 
						|
 *
 | 
						|
 * Description:    Disables hardware acceleration
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
void
 | 
						|
epsonDrawDisable (ScreenPtr pScreen)
 | 
						|
{
 | 
						|
    EPSON_DEBUG (fprintf(stderr,"+epsonDrawDisable\n"));
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * epsonDrawFini
 | 
						|
 *
 | 
						|
 * Description:    Finish hardware acceleration
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
void
 | 
						|
epsonDrawFini (ScreenPtr pScreen)
 | 
						|
{
 | 
						|
    EPSON_DEBUG (fprintf(stderr,"+epsonDrawFini\n"));
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * initEpson13806
 | 
						|
 *
 | 
						|
 * Description:    Maps Epson S1D13806 registers
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 11-Feb-04  C.Stylianou       NBL: Created.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
void
 | 
						|
initEpson13806(void)
 | 
						|
{
 | 
						|
    EPSON_DEBUG (fprintf(stderr,"+initEpson\n"));
 | 
						|
    
 | 
						|
    // Map Epson S1D13806 registers
 | 
						|
    regbase = KdMapDevice (EPSON13806_PHYSICAL_REG_ADDR, EPSON13806_GPIO_REGSIZE);
 | 
						|
    if (!regbase)
 | 
						|
        perror("ERROR: regbase\n");   // Sets up register mappings in header files.
 | 
						|
 | 
						|
#if 0
 | 
						|
    CARD8 rev_code;
 | 
						|
    rev_code = EPSON13806_REG (EPSON13806_REVCODE);
 | 
						|
    if ((rev_code >> 2) != 0x07) 
 | 
						|
        perror("ERROR: EPSON13806 Display Controller NOT FOUND!\n");
 | 
						|
#endif
 | 
						|
    
 | 
						|
    EPSON_DEBUG (fprintf(stderr,"-initEpson\n"));
 | 
						|
}
 |