salcddrv.c

来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C语言 代码 · 共 401 行

C
401
字号
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 2000  Microsoft Corporation

Module Name:  

    sa_lcd.cpp

Abstract:  

Functions:

Notes:

--*/
#include <windows.h>
#include <types.h>
#include "Dspdbg.h"
#include <drv_glob.h>
#include <dispdrvr.h>
#include "sa11x1.h"
#include "sa11X0bd.h"
#include "sa11x0.h"
#include "sa11X1db.h"

#include "bcr.h"

#include "cursor.h"
#include "tv.h"
#include "palette.h"

extern BOOL gSleepModeFlag;
extern BOOL   gInPowerHandler;

extern void *DispDrvrPhysicalFrameBuffer;

extern int DispDrvr_cxScreen;  // pixels
extern int DispDrvr_cyScreen;  // pixels
extern int DispDrvr_cdwStride;  // 640 pixels / 4 pixels per DWORD 

extern PBYTE gFrameBuffer;			// pointer to first byte of screen memory
extern PBYTE gBlankFrameBuffer;		// pointer to first byte of screen memory

extern BOOL   bVideoVGA,bVideoLCD,bVideoTV,bLandscapeDisplay;

extern volatile struct lcdregs	*v_pLcdRegs;
extern volatile struct gpioreg	*v_pGPIORegs;
extern volatile struct ppcreg	*v_pPPCRegs;
extern volatile struct FrameBuffer		*lcdFrameBuffer;
extern volatile struct TVFrameBuffer	*NTSCFrameBuffer;
extern unsigned	TVFieldSeparation;


extern BOOL    gDrawCursorFlag;
extern RECT    gCursorRect;
extern CRITICAL_SECTION    gDisplayMutex;
extern UINT nDisplayType;


PDRIVER_GLOBALS v_pDriverGlobals;

void DispVideoSetup();
extern void DispDrvrSetPalette (const PALETTEENTRY source[],unsigned short firstEntry,unsigned short numEntries);
extern void ClearFrameBuffer(BOOL color);
extern void CopyFrameBuffer(BOOL gDirection);
extern void msWait(unsigned msVal); 
extern PVOID VirtualAllocCopy(unsigned size,TCHAR *str,PVOID pVirtualAddress);
extern void LCDOff(volatile struct lcdregs *pLCDreg);
extern BOOL DispGetRegistryData(VOID);
extern void LcdSetupGPIOs(volatile struct gpioreg *pGPIOs);
extern unsigned LCDSetControlReg3(unsigned uClockSpeed);

void DispPowerOn(BOOL gInPowerHandler)
{
	if (!gSleepModeFlag) {
		DispDrvrSetPalette(_rgbIdentity,0,PALETTE_SIZE);
		ClearFrameBuffer(TRUE);	
	}
	else
		CopyFrameBuffer(FALSE);
 	if (nDisplayType==LQ039Q2DS01) {		// SA-1110 Handheld Ref design Sharp TFT 320x240 display
			//RETAILMSG(1,(TEXT("DispVideoSetup Setting BCR \r\n")));
		if (!set_BCRVal((BCR_LCD_LQ039Q2DS01_16BPP | BCR_LCD_POWER_ON),NOMASK, gInPowerHandler)) {
			RETAILMSG(1,(TEXT("DispVideoSetup BCR set up failed\r\n")));
		}
                  msWait(300);
	}
	DispVideoSetup();
}

void DispPowerOff(BOOL gInPowerHandler)
{
	CopyFrameBuffer(gInPowerHandler);
	LCDOff(v_pLcdRegs);	
	if (bVideoLCD || bVideoTV) {
		if (nDisplayType==LQ039Q2DS01) {
			if (!set_BCRVal(NOMASK,(BCR_LCD_POWER_OFF), gInPowerHandler))  //init BCR Register
   		         		RETAILMSG(1,(TEXT("DispVideoSetup BCR set up failed\r\n")));
		}

	}
#ifdef USING_SA1101
	if (bVideoVGA) {
		v_pPLLRegs->skpcr[0].VCLKEn=0;
		v_pPLLRegs->skpcr[0].DCLKEn=0;
		v_pVGARegs->Ctrl[0].vgaEn=0;	//turn off the VGA
	}
#endif
	gSleepModeFlag = TRUE;
}

void DispDrvrInitialize(void)
{
	unsigned fbSize;
	PVOID fbVirtrualAddr;

	gSleepModeFlag = FALSE;
	gInPowerHandler = FALSE;
	DispDrvr_cyScreen = 0;
	DispDrvr_cxScreen = 0;
	// Set DispDrvrPhysicalFrameBuffer to NULL - to establish "dirty-rect" driver
	DispDrvrPhysicalFrameBuffer = (void *)(NULL);
	//DispGetRegistryData(&DispDrvr_cxScreen,&DispDrvr_cyScreen);
	DispGetRegistryData();
	DispDrvr_cdwStride = DispDrvr_cxScreen/4*bpp/8;
//	fbSize = DispDrvr_cyScreen * DispDrvr_cdwStride*bpp/8;
//    OutputDebugString (TEXT("Initializing Display 0\r\n"));

//#ifndef USING_SA11X1
	v_pDriverGlobals = VirtualAllocCopy(DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE,TEXT("PDCardInitServices : v_pDriverGlobals"),(PVOID)DRIVER_GLOBALS_PHYSICAL_MEMORY_START);
	if (!v_pDriverGlobals) goto error_return;
//#endif   

#ifdef USING_SA1101
	if (bVideoVGA) {
		v_pPLLRegs = (struct SK_SC_PLLRegisterBlock	*)VirtualAllocCopy(SK_SC_PLL_SPACE,TEXT("DispDrvrInitialize : v_pPLLRegs"),(PVOID)(SK_SC_PLL_BA));
		if (!v_pPLLRegs) goto error_return;
		v_pSMCRegs = (struct SK_SMCRegisterBlock	*)VirtualAllocCopy(SK_SMC_SPACE,TEXT("DispDrvrInitialize : v_pSMCRegs"),(PVOID)(SK_SMC_BA));
		if (!v_pSMCRegs) goto error_return;
		v_pVMCRegs = (struct SK_VMCRegisterBlock	*)VirtualAllocCopy(SK_VMC_SPACE,TEXT("DispDrvrInitialize : v_pVMCRegs"),(PVOID)(SK_VMC_BA));
		if (!v_pVMCRegs) goto error_return;
		v_pVGARegs = (struct SK_VGARegisterBlock	*)VirtualAllocCopy(SK_VGA_SPACE,TEXT("DispDrvrInitialize : v_pVGARegs"),(PVOID)(SK_VGA_BA));
		if (!v_pVGARegs) goto error_return;
		v_pVgaPalette = (volatile int				*)VirtualAllocCopy(VGA_PALETTE_SIZE,TEXT("DispDrvrInitialize : v_pVgaPalette"),(PVOID)(VGA_PALETTE_BASE_VIRTUAL));
		if (!v_pVgaPalette) goto error_return;
	}
#endif
	if (bVideoLCD || bVideoTV) {
                                    v_pLcdRegs = (struct lcdregs *)VirtualAllocCopy(0x1000,TEXT("DispDrvrInitialize : v_pLcdRegs"),(PVOID)(LCD_BASE_VIRTUAL));
		if (!v_pLcdRegs) goto error_return;
		v_pGPIORegs = (struct gpioreg *)VirtualAllocCopy(0x1000,TEXT("DispDrvrInitialize : v_pGPIORegs"),(PVOID)(GPIO_BASE_VIRTUAL));
		if (!v_pGPIORegs) goto error_return;
                                    v_pPPCRegs = (struct ppcreg *)VirtualAllocCopy(0x1000,TEXT("DispDrvrInitialize : v_pPPCRegs"),(PVOID)(PPC_BASE_VIRTUAL));
		if (!v_pPPCRegs) goto error_return;
		if (bVideoTV) {
			fbSize=NTSC_DISPLAY_MAX_X*(NTSC_DISPLAY_MAX_Y + NTSC_DISPLAY_OVERSCANS*2)*NTSC_BYTES_PER_PIXEL;
			fbVirtrualAddr=(PVOID)TV_VIRTUAL_FRAME_BASE;
			NTSCFrameBuffer=(volatile struct TVFrameBuffer *)
				VirtualAllocCopy(fbSize,TEXT("DispDrvrInitialize : NTSCFrameBuffer"),fbVirtrualAddr);
			if (!NTSCFrameBuffer) goto error_return;
		} else {
			fbVirtrualAddr=(PVOID)LCD_VIRTUAL_FRAME_BASE;
			lcdFrameBuffer=(volatile struct FrameBuffer *)
				VirtualAllocCopy(0x2000,TEXT("DispDrvrInitialize : lcdFrameBuffer"),fbVirtrualAddr);
			if (!lcdFrameBuffer) goto error_return;
		}
	}

	fbSize = DispDrvr_cyScreen * DispDrvr_cxScreen*bpp/8;
                  gFrameBuffer = (PBYTE)VirtualAllocCopy(fbSize,TEXT("gFrameBuffer"),(PVOID)(FRAME_BUFFER_VIRTUAL-(0x6e0*(bpp/8-1))));
	if (!gFrameBuffer) goto error_return;
	gBlankFrameBuffer = (PBYTE) VirtualAlloc(0, fbSize,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
	if (!gFrameBuffer) goto error_return;
	//RETAILMSG(1,(TEXT("DispDrvrInitialize gFrameBuffer=0x%x, PA=0x%x, fbSize 0x%x\r\n"),gFrameBuffer,FRAME_BUFFER_VIRTUAL,fbSize));
	//RETAILMSG(1,(TEXT("DispDrvrInitialize gBlankFrameBuffer\r\n")));
	

	InitializeCriticalSection(&gDisplayMutex);
	// Initialize Cursor
	gDrawCursorFlag = FALSE;
	gCursorRect.left = (DispDrvr_cxScreen - CURSOR_XSIZE) >> 1;
	gCursorRect.right = gCursorRect.left + CURSOR_XSIZE;
	gCursorRect.top = (DispDrvr_cyScreen - CURSOR_YSIZE) >> 1;
	gCursorRect.bottom = gCursorRect.top + CURSOR_YSIZE;
	gxHot = gyHot = 0;
	memset ((BYTE *)gCursorMask, 0xFF, sizeof(gCursorMask));
	DispPowerOn(FALSE);
//RETAILMSG(1,(TEXT("DispDrvrInitialize Complete\r\n")));
return;
    
error_return:
#ifndef USING_SA11X1
	if (v_pDriverGlobals) VirtualFree((PVOID)v_pDriverGlobals,0,MEM_RELEASE);
		v_pDriverGlobals= NULL;
#endif
	
	if (bVideoLCD || bVideoTV) {
		if (v_pLcdRegs) VirtualFree((PVOID)v_pLcdRegs,0,MEM_RELEASE);
		v_pLcdRegs = NULL;
		if (v_pGPIORegs) VirtualFree((PVOID)v_pGPIORegs,0,MEM_RELEASE);
		v_pGPIORegs = NULL;
		if (bVideoTV) {
			if (NTSCFrameBuffer) VirtualFree((PVOID)NTSCFrameBuffer,0,MEM_RELEASE);
			NTSCFrameBuffer = NULL;
		} else {
			if (lcdFrameBuffer) VirtualFree((PVOID)lcdFrameBuffer,0,MEM_RELEASE);
			lcdFrameBuffer = NULL;
		}
	}
#ifdef USING_SA1101
   if (bVideoVGA) {
		if (v_pVgaPalette) VirtualFree((PVOID)v_pVgaPalette,0,MEM_RELEASE);
		v_pVgaPalette = NULL;
		if (v_pVGARegs) VirtualFree((PVOID)v_pVGARegs,0,MEM_RELEASE);
		v_pVGARegs = NULL;
		if (v_pSMCRegs) VirtualFree((PVOID)v_pSMCRegs,0,MEM_RELEASE);
		v_pSMCRegs = NULL;
		if (v_pVMCRegs) VirtualFree((PVOID)v_pVMCRegs,0,MEM_RELEASE);
		v_pVMCRegs = NULL;
		if (v_pPLLRegs) VirtualFree((PVOID)v_pPLLRegs,0,MEM_RELEASE);
		v_pPLLRegs = NULL;
   }
#endif
}


extern volatile struct lcdregs *gLCDreg;
extern unsigned gVoutPitch,gVoutLines,gOverscans;
extern void LCDClearStatusReg();
extern void LCDOn(volatile struct lcdregs *pLCDregs);
extern void InitTVOut(unsigned vStandard,volatile struct gpioreg *pGPIOs,volatile struct lcdregs *pLCDreg,char *fbPhysical);
extern unsigned TVGetOddFieldOffset(unsigned bufWidth,unsigned bufHeight,unsigned frameSeparation);

void LcdSetup(unsigned vStandard,volatile struct gpioreg *pGPIOs,
			  volatile struct lcdregs *pLCDregs,char *fbPhysical)
{
	gVoutPitch=vStandard == NTSC_SQR ? NTSC_DISPLAY_MAX_X     : PAL_DISPLAY_MAX_X;
	gVoutLines=vStandard == NTSC_SQR ? NTSC_DISPLAY_MAX_Y     : PAL_DISPLAY_MAX_Y;
	gOverscans=vStandard == NTSC_SQR ? NTSC_DISPLAY_OVERSCANS : PAL_DISPLAY_OVERSCANS;

	LcdSetupGPIOs(pGPIOs);

	gLCDreg = pLCDregs;
	WRITE_BITFIELD(struct lccr0Bits,&gLCDreg->lccr0,len,0);
	WRITE_BITFIELD(struct lccr0Bits,&gLCDreg->lccr0,cms,0);
	WRITE_BITFIELD(struct lccr0Bits,&gLCDreg->lccr0,sds,0);
	WRITE_BITFIELD(struct lccr0Bits,&gLCDreg->lccr0,bam,1);
	WRITE_BITFIELD(struct lccr0Bits,&gLCDreg->lccr0,ldm,1);
	WRITE_BITFIELD(struct lccr0Bits,&gLCDreg->lccr0,erm,1);
	WRITE_BITFIELD(struct lccr0Bits,&gLCDreg->lccr0,pas,1);
	WRITE_BITFIELD(struct lccr0Bits,&gLCDreg->lccr0,ble,0);
	WRITE_BITFIELD(struct lccr0Bits,&gLCDreg->lccr0,dpd,0);
	WRITE_BITFIELD(struct lccr0Bits,&gLCDreg->lccr0,pdd,0);

	gLCDreg->dbar1=(UINT)fbPhysical;
	WRITE_BITFIELD(struct lccr2Bits,&gLCDreg->lccr2,efw,0x0);
	WRITE_BITFIELD(struct lccr3Bits,&gLCDreg->lccr3,acb,0);
	WRITE_BITFIELD(struct lccr3Bits,&gLCDreg->lccr3,api,0);
	WRITE_BITFIELD(struct lccr3Bits,&gLCDreg->lccr3,vsp,0);
	WRITE_BITFIELD(struct lccr3Bits,&gLCDreg->lccr3,hsp,0);
	WRITE_BITFIELD(struct lccr3Bits,&gLCDreg->lccr3,pcp,0);
	WRITE_BITFIELD(struct lccr3Bits,&gLCDreg->lccr3,oep,0);
#ifdef TOBEFIXED
	gLCDreg->lccr3.vsp=1;
	gLCDreg->lccr3.hsp=1;
	gLCDreg->lccr3.pcp=1;
	gLCDreg->lccr3.oep=0;
#endif
	if (nDisplayType==LQ039Q2DS01) {       // SA-1110 Handheld Ref board Sharp TTF 320x240
		WRITE_BITFIELD(struct lccr2Bits,&gLCDreg->lccr2,vsw,0x1);
		WRITE_BITFIELD(struct lccr1Bits,&gLCDreg->lccr1,hsw,0x3e);
		WRITE_BITFIELD(struct lccr1Bits,&gLCDreg->lccr1,elw,0x12);
		WRITE_BITFIELD(struct lccr1Bits,&gLCDreg->lccr1,blw,0x39);
	}
	else if (nDisplayType==LQ64D343) {     // SA-1100 Multidmedia board Sharp TTF 640x480
		gLCDreg->lccr2.vsw=0x0;
		gLCDreg->lccr1.hsw=0x3e;
		gLCDreg->lccr1.elw=0x12;
		gLCDreg->lccr1.blw=0x39;
	}
	else if (nDisplayType==LM8V311) {	// SA-1110 Eval Board Sharp Passive 640x480
		gLCDreg->lccr2.vsw=0x0;
		gLCDreg->lccr1.hsw=0x3e;
		gLCDreg->lccr1.elw=0x12;
		gLCDreg->lccr1.blw=0x39;
	}
	else if (nDisplayType==KCS3224ASTT) {	// SA-11X0 Eval Board Kyocera Passive 320x240
		gLCDreg->lccr2.vsw=0x0;
		gLCDreg->lccr1.hsw=0x02;
		gLCDreg->lccr1.elw=0x1e;
		gLCDreg->lccr1.blw=0x1e;
	}
	if (vStandard==NTSC_SQR) {
		gLCDreg->lccr1.ppl=gVoutPitch-1;
		gLCDreg->lccr2.lpp=gVoutLines+gOverscans;
		gLCDreg->lccr2.bfw=0x14;
		gLCDreg->lccr3.pcd=LCDSetControlReg3(CCF_CLK_SCALE_TO_148Mhz);
	} else if (vStandard==LCD_640x480) {
		gLCDreg->lccr1.ppl=0x270;
		gLCDreg->lccr2.lpp=0x1F6;
		gLCDreg->lccr2.bfw=0x1D;
		gLCDreg->lccr3.pcd=0x3;
	} else if (vStandard==LCD_320x240) {
		WRITE_BITFIELD(struct lccr1Bits,&gLCDreg->lccr1,ppl,0x130);
		WRITE_BITFIELD(struct lccr2Bits,&gLCDreg->lccr2,lpp,0x0ef);
		WRITE_BITFIELD(struct lccr2Bits,&gLCDreg->lccr2,bfw,0x3);
		WRITE_BITFIELD(struct lccr3Bits,&gLCDreg->lccr3,pcd,0xC);
	}
	LCDClearStatusReg();
	LCDOn(gLCDreg);  // turn lcd on
}


void DispVideoSetup()
{
  if (bVideoLCD) {
//    SETUP_LCD_REGS(v_pGPIORegs,v_pLcdRegs,LCD_PHYSICAL_FRAME_BASE);
//RETAILMSG(1,(TEXT("DispVideoSetup Setting up LCD for LCD \r\n")));
      if (nDisplayType==LQ039Q2DS01) {		// SA-1110 Handheld Ref design Sharp TFT 320x240 display
  	     LcdSetup(LCD_320x240,v_pGPIORegs,v_pLcdRegs,(char *)LCD_PHYSICAL_FRAME_BASE);
	  }
  } else if (bVideoTV) {
	RETAILMSG(1,(TEXT("DispVideoSetup Setting up LCD for NTSC\r\n")));
    InitTVOut(NTSC_SQR,v_pGPIORegs,v_pLcdRegs,(char *)TV_PHYSICAL_FRAME_BASE);
	TVFieldSeparation=TVGetOddFieldOffset(NTSC_DISPLAY_MAX_X,NTSC_DISPLAY_MAX_Y,NTSC_DISPLAY_OVERSCANS);
  }
#ifdef USING_SA1101
  if (bVideoVGA) {
	RETAILMSG(1,(TEXT("DispVideoSetup Setting up VGA\r\n")));
    DispVGAenable();
  }
#endif
}

#define VIDEO_REG_PATH	TEXT("Drivers\\Display\\SA_LCD")
#define VIDEO_ROW_RES	TEXT("CxScreen")
#define VIDEO_COL_RES	TEXT("CyScreen")
#define PIXEL_DEPTH		TEXT("Bpp")
#define VIDEO_TO_LCD	TEXT("LCD")
#define VIDEO_TO_VGA	TEXT("VGA")
#define VIDEO_TO_TV		TEXT("NTSC")

//BOOL DispGetRegistryData(unsigned *x,unsigned *y)
BOOL DispGetRegistryData()
{
    LONG    regError;
    HKEY    hKey;
    DWORD   dwDataSize;

	bVideoTV=0;
	bVideoLCD=0;
	bVideoVGA=0;
	bpp=0;

    //DEBUGMSG(ZONE_INIT,(TEXT("Try to open Drivers\\Display\\Citizen\r\n")));
    regError = RegOpenKeyEx(HKEY_LOCAL_MACHINE,VIDEO_REG_PATH,0,KEY_ALL_ACCESS,&hKey);
    if (regError != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_INIT | ZONE_ERROR,(VIDEO_REG_PATH));
   		DEBUGMSG(ZONE_INIT,(TEXT("Failed opening\\Display\\Citizen\r\n")));
        return (FALSE);        
    }
    dwDataSize = sizeof(DWORD);
    regError = RegQueryValueEx(hKey,VIDEO_ROW_RES,NULL,NULL,(LPBYTE)&DispDrvr_cxScreen,&dwDataSize);
    if (regError != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_INIT | ZONE_ERROR,(TEXT("Failed to get display x value, Error 0x%X\r\n"),regError));
        return (FALSE);
    }
    regError = RegQueryValueEx(hKey,VIDEO_COL_RES,NULL,NULL,(LPBYTE)&DispDrvr_cyScreen,&dwDataSize);
    if (regError != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_INIT | ZONE_ERROR,(TEXT("Failed to get display y value, Error 0x%X\r\n"),regError));
        return (FALSE);
    }
	regError=RegQueryValueEx(hKey,PIXEL_DEPTH,NULL,NULL,(LPBYTE)&bpp,&dwDataSize);
    if (regError != ERROR_SUCCESS) {
        bpp=0;
    }
    regError=RegQueryValueEx(hKey,VIDEO_TO_VGA,NULL,NULL,(LPBYTE)&bVideoVGA,&dwDataSize);
    if (regError != ERROR_SUCCESS) {
        bVideoVGA=0;
    }
    regError=RegQueryValueEx(hKey,VIDEO_TO_LCD,NULL,NULL,(LPBYTE)&bVideoLCD,&dwDataSize);
    if (regError != ERROR_SUCCESS) {
        bVideoLCD=0;
    }
    regError=RegQueryValueEx(hKey,VIDEO_TO_TV,NULL,NULL,(LPBYTE)&bVideoTV,&dwDataSize);
    if (regError != ERROR_SUCCESS) {
        bVideoTV=0;
    }
    RegCloseKey (hKey);
    //RETAILMSG(1, (TEXT("Done getting Registry values Bpp: 0x%x CxScreen: 0x%x CyScreen: 0x%x\r\n"), bpp, DispDrvr_cxScreen, DispDrvr_cyScreen));
    bVideoVGA=0;
    bVideoTV=0;
    nDisplayType=LQ039Q2DS01;
	bLandscapeDisplay=DispDrvr_cxScreen > DispDrvr_cyScreen;
    return (TRUE); 
}

⌨️ 快捷键说明

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