⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smilynx.c

📁 cpc-1631的BSP包for VxWorks操作系统
💻 C
📖 第 1 页 / 共 3 页
字号:
    register SmiVideoWin *pVWin = (SmiVideoWin *)&smiVW;
	
    int depth = pSmiDriver->generic.ugi.pMode->colorDepth;
    int Bpp = depth >> 3; /* 1 byte per pix for 8 bit color, 2 for 16 */

    pVP->width    = pSmiDriver->generic.ugi.pMode->width*Bpp;
    pVP->control |= Bpp << 16;
    pVWin->bottom = pSmiDriver->generic.ugi.pMode->height- 1;
    pVWin->right  = pSmiDriver->generic.ugi.pMode->width - 1;
    pVWin->width  = pVP->width;

    /* color key */
    WRITE_VPR (pSmiDriver,0x0004, pVP->colorKey);

     /* color key mask */
    WRITE_VPR (pSmiDriver,0x0008, pVP->colorKeyMask);

    /* data src start adrs */
    WRITE_VPR (pSmiDriver ,0x000c, pVP->start / 8);

    /* data width and offset */
    WRITE_VPR (pSmiDriver, 0x0010,
        ((pVP->offset   / 8 * Bpp) << 16) |
         (pSmiDriver->generic.ugi.pMode->width / 8 * Bpp));

    /* video window 1 */
    WRITE_VPR (pSmiDriver, 0x0014,
        ((pVWin->top << 16) | pVWin->left));

    WRITE_VPR (pSmiDriver, 0x0018,
        ((pVWin->bottom << 16) | pVWin->right));

    WRITE_VPR (pSmiDriver, 0x001c, pVWin->srcStart / 8);

    WRITE_VPR (pSmiDriver, 0x0020,
        (((pVWin->offset / 8) << 16) | (pVWin->width / 8)));

    WRITE_VPR (pSmiDriver, 0x0024,
        (((pVWin->hStretch) << 8) | pVWin->vStretch));

    /* video window 2 */
    WRITE_VPR (pSmiDriver, 0x0028,
        ((pVWin->top << 16) | pVWin->left));

    WRITE_VPR (pSmiDriver, 0x002c,
        ((pVWin->bottom << 16) | pVWin->right));

    WRITE_VPR (pSmiDriver, 0x0030,
        pVWin->srcStart / 8);

    WRITE_VPR (pSmiDriver, 0x0034,
        (((pVWin->offset / 8) << 16) | (pVWin->width / 8)));

    WRITE_VPR (pSmiDriver, 0x0038,
        (((pVWin->hStretch) << 8) | pVWin->vStretch));

    /* fifo prio control */
    WRITE_VPR (pSmiDriver, 0x0054, pVP->fifoPrio);

    /* fifo empty request levell */
    WRITE_VPR (pSmiDriver, 0x0058, pVP->fifoERL);

    /* conversion constant */
    WRITE_VPR (pSmiDriver, 0x005c, pVP->YUVtoRGB);

    /* vpr control word */
    WRITE_VPR (pSmiDriver, 0x0000, pVP->control);
}

/******************************************************************************
 *
 * Init drawing engine registers
 */
void smiInitDrawEngine (SMI_DRIVER * pSmiDriver)
{
    unsigned int val;
	
    int depth = pSmiDriver->generic.ugi.pMode->colorDepth;
    int Bpp = depth >> 3; /* 1 byte per pix for 8 bit color, 2 for 16 */

    /* don't start now */
    WRITE_DPR (pSmiDriver, 0x000c, 0x000f0000);

    /* set rop2 to copypen */
    val = 0xffff3ff0 & READ_DPR (pSmiDriver, 0x000c);
    WRITE_DPR (pSmiDriver,  + 0x000c, (val | 0x8000 | 0x0c));

    /* set clip rect */
    WRITE_DPR (pSmiDriver,  0x002c, 0);
    WRITE_DPR (pSmiDriver,  0x0030,
        ((pSmiDriver->generic.ugi.pMode->height<<16) | pSmiDriver->generic.ugi.pMode->width * Bpp ));

    /* src row pitch */
    val = 0xffff0000 & ( READ_DPR (pSmiDriver, 0x0010));
    WRITE_DPR (pSmiDriver,  0x0010,
        (val | pSmiDriver->generic.ugi.pMode->width * Bpp));

    /* dst row pitch */
    val = 0x0000ffff & ( READ_DPR (pSmiDriver, 0x0010));
    WRITE_DPR (pSmiDriver,  0x0010,
        (((pSmiDriver->generic.ugi.pMode->width * Bpp)<<16) | val));

    /* window width src/dst */
    WRITE_DPR (pSmiDriver, 0x003c,
        (((pSmiDriver->generic.ugi.pMode->width * Bpp & 0x0fff)<<16) |
          (pSmiDriver->generic.ugi.pMode->width * Bpp & 0x0fff)));

   WRITE_DPR (pSmiDriver,  0x001e, 0x0000);


	    /* src base adrs */
    WRITE_DPR (pSmiDriver,  0x0040,
        (((0xdc000000/8) & 0x000fffff)));

    /* dst base adrs */
    WRITE_DPR (pSmiDriver,  0x0044,
        (((0xdc000000/8) & 0x000fffff)));


    /* foreground color */
    WRITE_DPR (pSmiDriver,  0x0014, 0x1f);/*blue*/

    /* background color */
    WRITE_DPR (pSmiDriver,  0x0018, 0x7e0);/*green*/

    /* xcolor */
    WRITE_DPR (pSmiDriver,  0x0020, 0x00ffffff);

    /* xcolor mask */
   WRITE_DPR (pSmiDriver, 0x0024, 0x00ffffff);

    /* bit mask */
   WRITE_DPR (pSmiDriver,  0x0028, 0x00ffffff);

    /* load mono pattern */
    WRITE_DPR (pSmiDriver,  0x0034, 0);
    WRITE_DPR (pSmiDriver, 0x0038, 0);
}

/*******************************************************************************
*
* Init capture port registers
*/
void smiInitCapturePortReg (SMI_DRIVER * pSmiDriver)
{
    SmiCapturePort smiCP = { 0x01400600, 0x30, 0x40, 480, 640, 0, 0, 2560, 6 };
    register SmiCapturePort *pCP = (SmiCapturePort *)&smiCP;

    WRITE_CPR (pSmiDriver,  0x0004, ((pCP->topClip<<16)   | pCP->leftClip));
    WRITE_CPR (pSmiDriver, 0x0008, ((pCP->srcHeight<<16) | pCP->srcWidth));
    WRITE_CPR (pSmiDriver, 0x000c, pCP->srcBufStart1/8);
    WRITE_CPR (pSmiDriver, 0x0010, pCP->srcBufStart2/8);
    WRITE_CPR (pSmiDriver, 0x0014, pCP->srcOffset/8);
    WRITE_CPR (pSmiDriver, 0x0018, pCP->fifoControl);
    WRITE_CPR (pSmiDriver, 0x0000, pCP->control);
}
void smiLynxSetVgaRegisters(SMI_DRIVER * pSmiDriver)
    {
    smiMcrRegSet(pSmiDriver);
    VgaHwInit(pSmiDriver);
    smiSetMode(pSmiDriver);
    shadowRegs(pSmiDriver);
	/*smiInitVideoProc(pSmiDriver);
	smiInitCapturePortReg(pSmiDriver);
	smiInitDrawEngine(pSmiDriver);
	memregInit();*/
	VgaLinuxInit(pSmiDriver);

    }

void smiLynxEnable(SMI_DRIVER * pSmiDriver)
    {
    char tmp;
    TRACK;

    /* ---- muck about with VGA registers ---- */
    /* work on the sequencer */
    /* put sequencer in reset */
    sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x0);
    sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, 0x0);
    
    /* disable video output by setting Screen Out bit */
    sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x1);
    tmp = sysInByte(0xfe000000+VGA_SEQUENCER_DATA);
    sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, tmp | 0x20);
    
    /* enable linear addressing mode, single aperture, and graphics mode */
    sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x18);
    tmp = sysInByte(0xfe000000+VGA_SEQUENCER_DATA);
    pSmiDriver->smiregs.SR18 = tmp;
    sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, tmp | 0x51);

    /* disable aperture banking/enable memory mapped behavior */
    sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x17);
    tmp = sysInByte(VGA_SEQUENCER_DATA);
    pSmiDriver->smiregs.SR17 = tmp; 
    sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, tmp | 0x02);
    
    /* no longer need to use io space */
    pSmiDriver->ioBase = pSmiDriver->generic.fbAddress + 0x700000;

    /* enable 2D engine and video processor */
    sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x21);
    tmp = sysInByte(VGA_SEQUENCER_DATA);
    pSmiDriver->smiregs.SR21 = tmp;
    tmp &= ~0x3;
    sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, tmp);

    /* work on the CRT controller */
    /* enable write access to CRTC registers 0-7 */
    sysOutByte(0xfe000000+VGA_CRTC_REG, 0x11);
    tmp = sysInByte(0xfe000000+VGA_CRTC_DATA);
    sysOutByte(0xfe000000+VGA_CRTC_DATA, tmp & ~0x80);

    /* enable video output by clearing Screen Out bit */
    sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x1);
    tmp = sysInByte(0xfe000000+VGA_SEQUENCER_DATA);
    sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, tmp & ~0x20 );

    /* start sequencer again */
    sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x0);
    sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, 0x3);
    }

void smiLynxDisable(SMI_DRIVER * pSmiDriver)
    {
    char tmp;
    TRACK;
    /* restore original settings */

    /* put sequencer in reset */
    sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x0);
    sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, 0x0);

    /* disable video output by setting Screen Out bit */
    sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x1);
    tmp = sysInByte(0xfe000000+VGA_SEQUENCER_DATA);
    sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, tmp | 0x20);

    /* disable 2D engine and video processor */
    sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x21);
    sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, pSmiDriver->smiregs.SR21);
    
    /* no longer used mmio */
    pSmiDriver->ioBase = UGL_NULL;

    /* disable write access to CRTC registers 0-7 */
    sysOutByte(0xfe000000+VGA_CRTC_REG, 0x11);
    tmp = sysInByte(0xfe000000+VGA_CRTC_DATA);
    sysOutByte(0xfe000000+VGA_CRTC_DATA, tmp | 0x80);

    /* disable linear addressing mode */
    sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x18);
    sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, pSmiDriver->smiregs.SR18);

    /* enable video output by clearing Screen Out bit */
    sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x1);
    tmp = sysInByte(0xfe000000+VGA_SEQUENCER_DATA);
    sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, tmp & ~0x20 );

    /* start sequencer again */
    sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x0);
    sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, 0x3);
    }

UGL_STATUS smiLynxModeSet (UGL_DEVICE_ID devId, UGL_MODE * pMode)
    {
    UGL_BOOL allocate; /* revisit */
    SMI_DRIVER * pDriver = (SMI_DRIVER *)devId;
    	
    UGL_GENERIC_DRIVER * pGenDriver = (UGL_GENERIC_DRIVER *) pDriver;
    UGL_UGI_DRIVER     * pUgiDriver = (UGL_UGI_DRIVER     *) pDriver;

	TRACK;
	
    if(pDriver->generic.ugi.pMode == UGL_NULL)
        {
	allocate = UGL_TRUE;
	}
    else
        {
	allocate = UGL_FALSE;
        }

    pDriver->modeIndex = uglGenericModeFind(smiModes, pMode, NELEMENTS(smiModes));

    if(pDriver->modeIndex > -1)
        {
        pDriver->generic.ugi.pMode = &smiModes[pDriver->modeIndex];
	}
    else
	return(UGL_STATUS_ERROR);
    
    /* create software clut */
    if(8 == pMode->colorDepth)
        uglGenericClutCreate(&pDriver->generic, 256);

    /* Create pageZero (mandatory) */
    if(allocate == UGL_TRUE)
	{
        UGL_GEN_DDB * pDdb;
        UGL_PAGE * pPageZero;
        pDdb = (UGL_GEN_DDB *)UGL_CALLOC(1, sizeof(UGL_GEN_DDB));
        pDdb->header.type = UGL_DDB_TYPE;
        pDdb->header.height = pDriver->generic.ugi.pMode->height;
        pDdb->header.width = pDriver->generic.ugi.pMode->width;
        pDdb->stride = pDriver->generic.ugi.pMode->width;
        pDdb->colorDepth = pDriver->generic.ugi.pMode->colorDepth;
        pDdb->image = pDriver->generic.fbAddress;
        
        pPageZero = (UGL_PAGE *)UGL_CALLOC(1, sizeof(UGL_PAGE));
        pPageZero->pDdb = (UGL_DDB*) pDdb;
        pDriver->generic.ugi.pPageZero = pPageZero;
        pDriver->generic.pDrawPage = pPageZero;
        pDriver->generic.pVisiblePage = pPageZero;

        /* don't use a memory pool, yet */
        pDriver->generic.videoMemPoolId = NULL;
	}

    
    /* assign depth specific functions */
    
    if (pDriver->generic.ugi.pMode->colorDepth == 8)
        {
        colorBit = 8;
        pUgiDriver->bitmapBlt		= uglGeneric8BitBitmapBlt;
        pUgiDriver->bitmapCreate	= uglGeneric8BitBitmapCreate;
        pUgiDriver->bitmapDestroy	= uglGeneric8BitBitmapDestroy;
        pUgiDriver->bitmapRead		= uglGeneric8BitBitmapRead;
        pUgiDriver->bitmapWrite		= uglGeneric8BitBitmapWrite;
        pUgiDriver->bitmapStretchBlt	= uglGeneric8BitBitmapStretchBlt;
        pUgiDriver->monoBitmapBlt	= uglGeneric8BitMonoBitmapBlt;
        pUgiDriver->monoBitmapCreate	= uglGeneric8BitMonoBitmapCreate;
        pUgiDriver->monoBitmapDestroy	= uglGeneric8BitMonoBitmapDestroy;
        pUgiDriver->monoBitmapRead	= uglGeneric8BitMonoBitmapRead;
        pUgiDriver->monoBitmapWrite	= uglGeneric8BitMonoBitmapWrite;
        pUgiDriver->monoBitmapStretchBlt = uglGeneric8BitMonoBitmapStretchBlt;
        pUgiDriver->transBitmapBlt	= uglGeneric8BitTransBitmapBlt;
        pUgiDriver->transBitmapStretchBlt = uglGeneric8BitTransBitmapStretchBlt;
	pUgiDriver->colorConvert	= uglGeneric8BitColorConvert;
        pUgiDriver->pixelGet		= uglGeneric8BitPixelGet;
        pUgiDriver->pixelSet		= uglGeneric8BitPixelSet;

        pUgiDriver->colorAlloc		= uglGenericColorAllocIndexed;
	pUgiDriver->colorFree		= uglGenericColorFreeIndexed;

        pGenDriver->bresenhamLine	= uglGeneric8BitBresenhamLine;
        pGenDriver->fbPixelGet		= uglGeneric8BitFbPixelGet;
        pGenDriver->fbPixelSet		= uglGeneric8BitFbPixelSet;
	pGenDriver->fill		= uglGeneric8BitFill;
	pGenDriver->hLine		= uglGeneric8BitHLine;
	pGenDriver->rectFill		= uglGeneric8BitRectFill;
	pGenDriver->vLine		= uglGeneric8BitVLine;
        }
    else /* depth == 16 */
        {
        colorBit = 16;
        pUgiDriver->bitmapBlt		= uglGeneric16BitBitmapBlt;
        pUgiDriver->bitmapCreate	= uglGeneric16BitBitmapCreate;
        pUgiDriver->bitmapDestroy	= uglGeneric16BitBitmapDestroy;
        pUgiDriver->bitmapRead		= uglGeneric16BitBitmapRead;
        pUgiDriver->bitmapWrite		= uglGeneric16BitBitmapWrite;
        pUgiDriver->bitmapStretchBlt	= uglGeneric16BitBitmapStretchBlt;
        pUgiDriver->monoBitmapBlt	= uglGeneric16BitMonoBitmapBlt;
        pUgiDriver->monoBitmapCreate	= uglGeneric16BitMonoBitmapCreate;
        pUgiDriver->monoBitmapDestroy	= uglGeneric16BitMonoBitmapDestroy;
        pUgiDriver->monoBitmapRead	= uglGeneric16BitMonoBitmapRead;
        pUgiDriver->monoBitmapWrite	= uglGeneric16BitMonoBitmapWrite;
        pUgiDriver->monoBitmapStretchBlt = uglGeneric16BitMonoBitmapStretchBlt;
        pUgiDriver->transBitmapBlt	= uglGeneric16BitTransBitmapBlt;
        pUgiDriver->transBitmapStretchBlt = uglGeneric16BitTransBitmapStretchBlt;
	pUgiDriver->colorConvert	= uglGeneric16BitColorConvert;
        pUgiDriver->pixelGet		= uglGeneric16BitPixelGet;
        pUgiDriver->pixelSet		= uglGeneric16BitPixelSet;

        pUgiDriver->colorAlloc		= uglGenericColorAllocDirect;
	pUgiDriver->colorFree		= UGL_NULL;

        pGenDriver->bresenhamLine	= uglGeneric16BitBresenhamLine;
        pGenDriver->fbPixelGet		= uglGeneric16BitFbPixelGet;
        pGenDriver->fbPixelSet		= uglGeneric16BitFbPixelSet;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -