606 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			606 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
/* $Header$ */
 | 
						|
/*
 | 
						|
 * 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.
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * epson13806.c - Implementation of hardware accelerated functions for
 | 
						|
 *                Epson S1D13806 graphics controller.
 | 
						|
 *
 | 
						|
 * History:
 | 
						|
 * 28-Jan-04  C.Stylianou                     PRJ NBL: Created from fbdev.c.
 | 
						|
 * 30-Mar-04  Phil Blundell/Peter Naulls      Integration with XFree 4.3
 | 
						|
 *  
 | 
						|
 */
 | 
						|
 | 
						|
#ifdef HAVE_CONFIG_H
 | 
						|
#include <config.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#include <sys/ioctl.h>
 | 
						|
 | 
						|
#include "epson13806.h"
 | 
						|
#include "epson13806reg.h"
 | 
						|
 | 
						|
extern int KdTsPhyScreen;
 | 
						|
 | 
						|
Bool
 | 
						|
epsonInitialize (KdCardInfo *card, EpsonPriv *priv)
 | 
						|
{
 | 
						|
    int k;
 | 
						|
    unsigned long off;
 | 
						|
    if ((priv->fd = open("/dev/fb0", O_RDWR)) < 0) {
 | 
						|
        perror("Error opening /dev/fb0\n");
 | 
						|
        return FALSE;
 | 
						|
        }
 | 
						|
 | 
						|
    if ((k=ioctl(priv->fd, FBIOGET_FSCREENINFO, &priv->fix)) < 0) {
 | 
						|
        perror("Error with /dev/fb ioctl FIOGET_FSCREENINFO");
 | 
						|
        close (priv->fd);
 | 
						|
        return FALSE;
 | 
						|
        }
 | 
						|
 | 
						|
    if ((k=ioctl(priv->fd, FBIOGET_VSCREENINFO, &priv->var)) < 0) {
 | 
						|
        perror("Error with /dev/fb ioctl FIOGET_VSCREENINFO");
 | 
						|
        close (priv->fd);
 | 
						|
        return FALSE;
 | 
						|
        }
 | 
						|
    
 | 
						|
    priv->fb_base = KdMapDevice (EPSON13806_PHYSICAL_VMEM_ADDR, EPSON13806_VMEM_SIZE);
 | 
						|
        
 | 
						|
        
 | 
						|
    if (priv->fb_base == (char *)-1) {
 | 
						|
        perror("ERROR: mmap framebuffer fails!");
 | 
						|
        close (priv->fd);
 | 
						|
        return FALSE;
 | 
						|
        }
 | 
						|
 | 
						|
    off = (unsigned long) priv->fix.smem_start % (unsigned long) getpagesize();
 | 
						|
    priv->fb = priv->fb_base + off;
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
Bool
 | 
						|
epsonCardInit (KdCardInfo *card)
 | 
						|
{
 | 
						|
    EpsonPriv    *priv;
 | 
						|
 | 
						|
    priv = (EpsonPriv *) xalloc (sizeof (EpsonPriv));
 | 
						|
    if (!priv)
 | 
						|
    return FALSE;
 | 
						|
    
 | 
						|
    if (!epsonInitialize (card, priv))
 | 
						|
    {
 | 
						|
    	xfree (priv);
 | 
						|
    	return FALSE;
 | 
						|
    }
 | 
						|
    card->driver = priv;
 | 
						|
    
 | 
						|
    // Call InitEpson to map onto Epson registers
 | 
						|
    initEpson13806();
 | 
						|
    
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
#define FBDEV_KLUDGE_FORMAT
 | 
						|
#ifdef FBDEV_KLUDGE_FORMAT
 | 
						|
static Pixel
 | 
						|
epsonMakeContig (Pixel orig, Pixel others)
 | 
						|
{
 | 
						|
    Pixel   low;
 | 
						|
 | 
						|
    low = lowbit (orig) >> 1;
 | 
						|
    while (low && (others & low) == 0)
 | 
						|
    {
 | 
						|
    	orig |= low;
 | 
						|
    	low >>= 1;
 | 
						|
    }
 | 
						|
    return orig;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
Bool
 | 
						|
epsonScreenInitialize (KdScreenInfo *screen, EpsonScrPriv *scrpriv)
 | 
						|
{
 | 
						|
    EpsonPriv    *priv = screen->card->driver;
 | 
						|
    Pixel    allbits;
 | 
						|
    int        depth;
 | 
						|
    Bool    gray;
 | 
						|
    depth = priv->var.bits_per_pixel;
 | 
						|
    gray = priv->var.grayscale;
 | 
						|
    
 | 
						|
    
 | 
						|
    screen->fb[0].visuals = (1 << TrueColor);
 | 
						|
#define Mask(o,l)   (((1 << l) - 1) << o)
 | 
						|
    screen->fb[0].redMask = Mask (priv->var.red.offset, priv->var.red.length);
 | 
						|
    screen->fb[0].greenMask = Mask (priv->var.green.offset, priv->var.green.length);
 | 
						|
    screen->fb[0].blueMask = Mask (priv->var.blue.offset, priv->var.blue.length);
 | 
						|
#ifdef FBDEV_KLUDGE_FORMAT
 | 
						|
    /*
 | 
						|
     * This is a kludge so that Render will work -- fill in the gaps
 | 
						|
     * in the pixel
 | 
						|
     */
 | 
						|
    screen->fb[0].redMask = epsonMakeContig (screen->fb[0].redMask,
 | 
						|
                         screen->fb[0].greenMask|
 | 
						|
                         screen->fb[0].blueMask);
 | 
						|
 | 
						|
    screen->fb[0].greenMask = epsonMakeContig (screen->fb[0].greenMask,
 | 
						|
                           screen->fb[0].redMask|
 | 
						|
                           screen->fb[0].blueMask);
 | 
						|
 | 
						|
    screen->fb[0].blueMask = epsonMakeContig (screen->fb[0].blueMask,
 | 
						|
                          screen->fb[0].redMask|
 | 
						|
                          screen->fb[0].greenMask);
 | 
						|
 | 
						|
#endif
 | 
						|
    allbits = screen->fb[0].redMask | screen->fb[0].greenMask | screen->fb[0].blueMask;
 | 
						|
    depth = 32;
 | 
						|
    while (depth && !(allbits & (1 << (depth - 1))))
 | 
						|
        depth--;
 | 
						|
    
 | 
						|
    screen->rate = 60;
 | 
						|
    scrpriv->randr = screen->randr;
 | 
						|
    
 | 
						|
    {
 | 
						|
        screen->fb[0].depth = depth;
 | 
						|
        screen->fb[0].bitsPerPixel = priv->var.bits_per_pixel;
 | 
						|
        screen->width = priv->var.xres;
 | 
						|
        screen->height = priv->var.yres;
 | 
						|
        screen->fb[0].byteStride = priv->fix.line_length;
 | 
						|
        screen->fb[0].pixelStride = (priv->fix.line_length * 8 / 
 | 
						|
                     priv->var.bits_per_pixel);
 | 
						|
        screen->fb[0].frameBuffer = (CARD8 *) (priv->fb);
 | 
						|
        screen->off_screen_base = screen->fb[0].byteStride * screen->height;
 | 
						|
        screen->memory_base = priv->fb;
 | 
						|
        screen->memory_size = EPSON13806_VMEM_SIZE;
 | 
						|
    }
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
Bool
 | 
						|
epsonScreenInit (KdScreenInfo *screen)
 | 
						|
{
 | 
						|
    EpsonScrPriv *scrpriv;
 | 
						|
 | 
						|
    scrpriv = xalloc (sizeof (EpsonScrPriv));
 | 
						|
    if (!scrpriv)
 | 
						|
        return FALSE;
 | 
						|
    memset (scrpriv, '\0', sizeof (EpsonScrPriv));
 | 
						|
    screen->driver = scrpriv;
 | 
						|
    if (!epsonScreenInitialize (screen, scrpriv)) {
 | 
						|
        screen->driver = 0;
 | 
						|
    xfree (scrpriv);
 | 
						|
    return FALSE;
 | 
						|
    }
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
    
 | 
						|
static void *
 | 
						|
epsonWindowLinear (ScreenPtr    pScreen,
 | 
						|
           CARD32    row,
 | 
						|
           CARD32    offset,
 | 
						|
           int        mode,
 | 
						|
           CARD32    *size,
 | 
						|
           void        *closure)
 | 
						|
{
 | 
						|
    KdScreenPriv(pScreen);
 | 
						|
    EpsonPriv        *priv = pScreenPriv->card->driver;
 | 
						|
 | 
						|
    if (!pScreenPriv->enabled)
 | 
						|
        return 0;
 | 
						|
    *size = priv->fix.line_length;
 | 
						|
    return (CARD8 *) priv->fb + row * priv->fix.line_length + offset;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#ifdef RANDR
 | 
						|
static Bool
 | 
						|
epsonRandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
 | 
						|
{
 | 
						|
    KdScreenPriv(pScreen);
 | 
						|
    KdScreenInfo        *screen = pScreenPriv->screen;
 | 
						|
    EpsonScrPriv        *scrpriv = screen->driver;
 | 
						|
#if 0
 | 
						|
    RRVisualGroupPtr        pVisualGroup;
 | 
						|
    RRGroupOfVisualGroupPtr pGroupOfVisualGroup;
 | 
						|
#endif
 | 
						|
    RRScreenSizePtr        pSize;
 | 
						|
    Rotation            randr;
 | 
						|
    int                n;
 | 
						|
    
 | 
						|
    *rotations = RR_Rotate_0|RR_Rotate_90|RR_Rotate_180|RR_Rotate_270;
 | 
						|
    
 | 
						|
    for (n = 0; n < pScreen->numDepths; n++)
 | 
						|
        if (pScreen->allowedDepths[n].numVids)
 | 
						|
            break;
 | 
						|
    if (n == pScreen->numDepths)
 | 
						|
        return FALSE;
 | 
						|
 | 
						|
#if 0    
 | 
						|
    pVisualGroup = RRCreateVisualGroup (pScreen);
 | 
						|
    if (!pVisualGroup)
 | 
						|
        return FALSE;
 | 
						|
    
 | 
						|
    if (!RRAddDepthToVisualGroup (pScreen, pVisualGroup, &pScreen->allowedDepths[n])) {
 | 
						|
        RRDestroyVisualGroup (pScreen, pVisualGroup);
 | 
						|
        return FALSE;
 | 
						|
        }
 | 
						|
 | 
						|
    pVisualGroup = RRRegisterVisualGroup (pScreen, pVisualGroup);
 | 
						|
    if (!pVisualGroup)
 | 
						|
        return FALSE;
 | 
						|
    
 | 
						|
    pGroupOfVisualGroup = RRCreateGroupOfVisualGroup (pScreen);
 | 
						|
 | 
						|
    if (!RRAddVisualGroupToGroupOfVisualGroup (pScreen,
 | 
						|
                     pGroupOfVisualGroup,
 | 
						|
                     pVisualGroup))
 | 
						|
    {
 | 
						|
    RRDestroyGroupOfVisualGroup (pScreen, pGroupOfVisualGroup);
 | 
						|
    /* pVisualGroup left until screen closed */
 | 
						|
    return FALSE;
 | 
						|
    }
 | 
						|
 | 
						|
    pGroupOfVisualGroup = RRRegisterGroupOfVisualGroup (pScreen, pGroupOfVisualGroup);
 | 
						|
    if (!pGroupOfVisualGroup)
 | 
						|
    return FALSE;
 | 
						|
#endif
 | 
						|
 | 
						|
    pSize = RRRegisterSize (pScreen,
 | 
						|
                screen->width,
 | 
						|
                screen->height,
 | 
						|
                screen->width_mm,
 | 
						|
                screen->height_mm);
 | 
						|
    
 | 
						|
    randr = KdSubRotation (scrpriv->randr, screen->randr);
 | 
						|
    
 | 
						|
    RRSetCurrentConfig (pScreen, randr, RR_Rotate_0, pSize);
 | 
						|
    
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
static Bool
 | 
						|
epsonRandRSetConfig (ScreenPtr        pScreen,
 | 
						|
             Rotation        randr,
 | 
						|
             int        rate,
 | 
						|
             RRScreenSizePtr    pSize)
 | 
						|
{
 | 
						|
    KdScreenPriv(pScreen);
 | 
						|
    KdScreenInfo    *screen = pScreenPriv->screen;
 | 
						|
    EpsonScrPriv    *scrpriv = screen->driver;
 | 
						|
    Bool        wasEnabled = pScreenPriv->enabled;
 | 
						|
 | 
						|
    randr = KdAddRotation (randr, screen->randr);
 | 
						|
 | 
						|
    if (scrpriv->randr != randr)
 | 
						|
    {
 | 
						|
        if (wasEnabled)
 | 
						|
            KdDisableScreen (pScreen);
 | 
						|
    
 | 
						|
        scrpriv->randr = randr;
 | 
						|
 | 
						|
        if (wasEnabled)
 | 
						|
            KdEnableScreen (pScreen);
 | 
						|
    }
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
static Bool
 | 
						|
epsonRandRInit (ScreenPtr pScreen)
 | 
						|
{
 | 
						|
    rrScrPrivPtr    pScrPriv;
 | 
						|
    
 | 
						|
    if (!RRScreenInit (pScreen))
 | 
						|
    return FALSE;
 | 
						|
 | 
						|
    pScrPriv = rrGetScrPriv(pScreen);
 | 
						|
    pScrPriv->rrGetInfo = epsonRandRGetInfo;
 | 
						|
    pScrPriv->rrSetConfig = epsonRandRSetConfig;
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
static Bool
 | 
						|
epsonCreateColormap (ColormapPtr pmap)
 | 
						|
{
 | 
						|
    ScreenPtr        pScreen = pmap->pScreen;
 | 
						|
    KdScreenPriv(pScreen);
 | 
						|
    EpsonPriv        *priv = pScreenPriv->card->driver;
 | 
						|
    VisualPtr        pVisual;
 | 
						|
    int            i;
 | 
						|
    int            nent;
 | 
						|
    xColorItem        *pdefs;
 | 
						|
    
 | 
						|
    switch (priv->fix.visual) {
 | 
						|
        case FB_VISUAL_STATIC_PSEUDOCOLOR:
 | 
						|
            pVisual = pmap->pVisual;
 | 
						|
            nent = pVisual->ColormapEntries;
 | 
						|
            pdefs = ALLOCATE_LOCAL (nent * sizeof (xColorItem));
 | 
						|
            if (!pdefs)
 | 
						|
                return FALSE;
 | 
						|
            for (i = 0; i < nent; i++)
 | 
						|
                pdefs[i].pixel = i;
 | 
						|
            epsonGetColors (pScreen, 0, nent, pdefs);
 | 
						|
            for (i = 0; i < nent; i++)
 | 
						|
            {
 | 
						|
                pmap->red[i].co.local.red = pdefs[i].red;
 | 
						|
                pmap->red[i].co.local.green = pdefs[i].green;
 | 
						|
                pmap->red[i].co.local.blue = pdefs[i].blue;
 | 
						|
            }
 | 
						|
            DEALLOCATE_LOCAL (pdefs);
 | 
						|
            return TRUE;
 | 
						|
 | 
						|
        default:
 | 
						|
            return fbInitializeColormap (pmap);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
Bool
 | 
						|
epsonInitScreen (ScreenPtr pScreen)
 | 
						|
{
 | 
						|
#ifdef TOUCHSCREEN
 | 
						|
    KdTsPhyScreen = pScreen->myNum;
 | 
						|
#endif
 | 
						|
 | 
						|
    pScreen->CreateColormap = epsonCreateColormap;
 | 
						|
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
static Bool
 | 
						|
epsonFinishInitScreen (ScreenPtr pScreen)
 | 
						|
{
 | 
						|
    if (!shadowSetup (pScreen))
 | 
						|
    return FALSE;
 | 
						|
 | 
						|
#ifdef RANDR
 | 
						|
    if (!epsonRandRInit (pScreen))
 | 
						|
    return FALSE;
 | 
						|
#endif
 | 
						|
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
static Bool
 | 
						|
epsonSetShadow (ScreenPtr pScreen)
 | 
						|
{
 | 
						|
    KdScreenPriv(pScreen);
 | 
						|
    KdScreenInfo    *screen = pScreenPriv->screen;
 | 
						|
    EpsonScrPriv    *scrpriv = screen->driver;
 | 
						|
    ShadowUpdateProc    update;
 | 
						|
    ShadowWindowProc    window;
 | 
						|
 | 
						|
    window = epsonWindowLinear;
 | 
						|
    update = shadowUpdatePacked;
 | 
						|
 | 
						|
    return KdShadowSet (pScreen, scrpriv->randr, update, window);
 | 
						|
}
 | 
						|
 | 
						|
static Bool
 | 
						|
epsonCreateResources (ScreenPtr pScreen)
 | 
						|
{
 | 
						|
    return epsonSetShadow (pScreen);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
epsonPreserve (KdCardInfo *card)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
Bool
 | 
						|
epsonEnable (ScreenPtr pScreen)
 | 
						|
{
 | 
						|
    KdScreenPriv(pScreen);
 | 
						|
    EpsonPriv        *priv = pScreenPriv->card->driver;
 | 
						|
    int            k;
 | 
						|
 | 
						|
    priv->var.activate = FB_ACTIVATE_NOW|FB_CHANGE_CMAP_VBL;
 | 
						|
    
 | 
						|
    /* display it on the LCD */
 | 
						|
    k = ioctl (priv->fd, FBIOPUT_VSCREENINFO, &priv->var);
 | 
						|
    if (k < 0) {
 | 
						|
        perror ("FBIOPUT_VSCREENINFO");
 | 
						|
        return FALSE;
 | 
						|
        }
 | 
						|
 | 
						|
    k = ioctl (priv->fd, FBIOGET_FSCREENINFO, &priv->fix);
 | 
						|
    if (k < 0) {
 | 
						|
        perror ("FBIOGET_FSCREENINFO");
 | 
						|
        return FALSE;
 | 
						|
    }
 | 
						|
 | 
						|
    if (priv->fix.visual == FB_VISUAL_DIRECTCOLOR) {
 | 
						|
        struct fb_cmap    cmap;
 | 
						|
        int        i;
 | 
						|
 | 
						|
        for (i = 0; 
 | 
						|
             i < (1 << priv->var.red.length) ||
 | 
						|
             i < (1 << priv->var.green.length) ||
 | 
						|
             i < (1 << priv->var.blue.length); i++) {
 | 
						|
            priv->red[i] = i * 65535 / ((1 << priv->var.red.length) - 1);
 | 
						|
            priv->green[i] = i * 65535 / ((1 << priv->var.green.length) - 1);
 | 
						|
            priv->blue[i] = i * 65535 / ((1 << priv->var.blue.length) - 1);
 | 
						|
        }
 | 
						|
        cmap.start = 0;
 | 
						|
        cmap.len = i;
 | 
						|
        cmap.red = &priv->red[0];
 | 
						|
        cmap.green = &priv->green[0];
 | 
						|
        cmap.blue = &priv->blue[0];
 | 
						|
        cmap.transp = 0;
 | 
						|
        ioctl (priv->fd, FBIOPUTCMAP, &cmap);
 | 
						|
        }
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
Bool
 | 
						|
epsonDPMS (ScreenPtr pScreen, int mode)
 | 
						|
{
 | 
						|
    KdScreenPriv(pScreen);
 | 
						|
    EpsonPriv    *priv = pScreenPriv->card->driver;
 | 
						|
    static int oldmode = -1;
 | 
						|
 | 
						|
    if (mode == oldmode)
 | 
						|
        return TRUE;
 | 
						|
#ifdef FBIOPUT_POWERMODE
 | 
						|
    if (ioctl (priv->fd, FBIOPUT_POWERMODE, &mode) >= 0) {
 | 
						|
        oldmode = mode;
 | 
						|
        return TRUE;
 | 
						|
        }
 | 
						|
#endif
 | 
						|
#ifdef FBIOBLANK
 | 
						|
    if (ioctl (priv->fd, FBIOBLANK, mode ? mode + 1 : 0) >= 0) {
 | 
						|
        oldmode = mode;
 | 
						|
        return TRUE;
 | 
						|
        }
 | 
						|
#endif
 | 
						|
    return FALSE;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
epsonDisable (ScreenPtr pScreen)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
epsonRestore (KdCardInfo *card)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
epsonScreenFini (KdScreenInfo *screen)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
epsonCardFini (KdCardInfo *card)
 | 
						|
{
 | 
						|
    EpsonPriv    *priv = card->driver;
 | 
						|
    
 | 
						|
    munmap (priv->fb_base, priv->fix.smem_len);
 | 
						|
    close (priv->fd);
 | 
						|
    xfree (priv);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
epsonGetColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
 | 
						|
{
 | 
						|
    KdScreenPriv(pScreen);
 | 
						|
    EpsonPriv        *priv = pScreenPriv->card->driver;
 | 
						|
    struct fb_cmap  cmap;
 | 
						|
    int            p;
 | 
						|
    int            k;
 | 
						|
    int            min, max;
 | 
						|
 | 
						|
    min = 256;
 | 
						|
    max = 0;
 | 
						|
    for (k = 0; k < n; k++) {
 | 
						|
        if (pdefs[k].pixel < min)
 | 
						|
            min = pdefs[k].pixel;
 | 
						|
        if (pdefs[k].pixel > max)
 | 
						|
            max = pdefs[k].pixel;
 | 
						|
        }
 | 
						|
    cmap.start = min;
 | 
						|
    cmap.len = max - min + 1;
 | 
						|
    cmap.red = &priv->red[min];
 | 
						|
    cmap.green = &priv->green[min];;
 | 
						|
    cmap.blue = &priv->blue[min];
 | 
						|
    cmap.transp = 0;
 | 
						|
    k = ioctl (priv->fd, FBIOGETCMAP, &cmap);
 | 
						|
    if (k < 0) {
 | 
						|
        perror ("can't get colormap");
 | 
						|
        return;
 | 
						|
        }
 | 
						|
    while (n--) {
 | 
						|
    p = pdefs->pixel;
 | 
						|
    pdefs->red = priv->red[p];
 | 
						|
    pdefs->green = priv->green[p];
 | 
						|
    pdefs->blue = priv->blue[p];
 | 
						|
    pdefs++;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
epsonPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
 | 
						|
{
 | 
						|
    KdScreenPriv(pScreen);
 | 
						|
    EpsonPriv    *priv = pScreenPriv->card->driver;
 | 
						|
    struct fb_cmap  cmap;
 | 
						|
    int            p;
 | 
						|
    int            min, max;
 | 
						|
 | 
						|
    min = 256;
 | 
						|
    max = 0;
 | 
						|
    while (n--) {
 | 
						|
        p = pdefs->pixel;
 | 
						|
        priv->red[p] = pdefs->red;
 | 
						|
        priv->green[p] = pdefs->green;
 | 
						|
        priv->blue[p] = pdefs->blue;
 | 
						|
        if (p < min)
 | 
						|
            min = p;
 | 
						|
        if (p > max)
 | 
						|
            max = p;
 | 
						|
        pdefs++;
 | 
						|
        }
 | 
						|
    cmap.start = min;
 | 
						|
    cmap.len = max - min + 1;
 | 
						|
    cmap.red = &priv->red[min];
 | 
						|
    cmap.green = &priv->green[min];
 | 
						|
    cmap.blue = &priv->blue[min];
 | 
						|
    cmap.transp = 0;
 | 
						|
    ioctl (priv->fd, FBIOPUTCMAP, &cmap);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
KdCardFuncs epsonFuncs = {
 | 
						|
    epsonCardInit,          /* cardinit */
 | 
						|
    epsonScreenInit,        /* scrinit */
 | 
						|
    epsonInitScreen,        /* initScreen */
 | 
						|
    epsonFinishInitScreen,
 | 
						|
    epsonCreateResources,
 | 
						|
    epsonPreserve,          /* preserve */
 | 
						|
    epsonEnable,            /* enable */
 | 
						|
    epsonDPMS,              /* dpms */
 | 
						|
    epsonDisable,           /* disable */
 | 
						|
    epsonRestore,           /* restore */
 | 
						|
    epsonScreenFini,        /* scrfini */
 | 
						|
    epsonCardFini,          /* cardfini */
 | 
						|
    
 | 
						|
    0,                      /* initCursor */
 | 
						|
    0,                      /* enableCursor */
 | 
						|
    0,                      /* disableCursor */
 | 
						|
    0,                      /* finiCursor */
 | 
						|
    0,                      /* recolorCursor */
 | 
						|
    
 | 
						|
    /* 
 | 
						|
     * History:
 | 
						|
     * 28-Jan-04  C.Stylianou       NBL: Added the following for h/w accel.
 | 
						|
     *
 | 
						|
     */
 | 
						|
 | 
						|
    epsonDrawInit,          /* initAccel */
 | 
						|
    epsonDrawEnable,        /* enableAccel */
 | 
						|
    epsonDrawDisable,       /* disableAccel */
 | 
						|
    epsonDrawFini,          /* finiAccel */
 | 
						|
    
 | 
						|
    epsonGetColors,         /* getColors */
 | 
						|
    epsonPutColors,         /* putColors */
 | 
						|
};
 |