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 + -
显示快捷键?