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

📄 s3c2440disp.cpp

📁 该2440 BSP是由三星公司提供的wince5.0的BSP移植到到wince6.0下的
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			}

			if (m_CursorRect.top <= rectl.bottom && m_CursorRect.bottom >= rectl.top &&
				m_CursorRect.left <= rectl.right && m_CursorRect.right >= rectl.left)
			{
				CursorOff();
				m_CursorForcedOff = TRUE;
			}
		}

		// check for source overlap with cursor and turn off cursor if overlaps
		if (blitParameters->pSrc == m_pPrimarySurface)	// only care if source is main display surface
		{
			if (blitParameters->prclSrc != NULL)		// make sure there is a valid prclSrc
			{
				rectl = *blitParameters->prclSrc;		// if so, use it
			}
			else
			{
				rectl = m_CursorRect;					// if not, use the CUrsor rect - this forces the cursor to be turned off in this case
			}
			if (m_CursorRect.top < rectl.bottom && m_CursorRect.bottom > rectl.top &&
				m_CursorRect.left < rectl.right && m_CursorRect.right > rectl.left)
			{
				CursorOff();
				m_CursorForcedOff = TRUE;
			}
		}
	}


	// see if there are any optimized software blits available
	EmulatedBltSelect02(blitParameters);
	EmulatedBltSelect08(blitParameters);
	EmulatedBltSelect16(blitParameters);

	RETAILMSG(DBGLCD1, (TEXT("--S3C2440DISP::BltPrepare\r\n")));

	return S_OK;
}

SCODE	S3C2440DISP::BltComplete(GPEBltParms *blitParameters)
{
	RETAILMSG(DBGLCD1, (TEXT("++S3C2440DISP::BltComplete\r\n")));

	// see if cursor was forced off because of overlap with source or destination and turn back on
	if (m_CursorForcedOff)
	{
		m_CursorForcedOff = FALSE;
		CursorOn();
	}

	//DispPerfEnd(0);
	
	RETAILMSG(DBGLCD1, (TEXT("--S3C2440DISP::BltComplete\r\n")));
	return S_OK;
}

INT		S3C2440DISP::InVBlank(void)
{
	static	BOOL	value = FALSE;
	RETAILMSG(DBGLCD, (TEXT("S3C2440DISP::InVBlank\r\n")));
	value = !value;
	return value;
}

SCODE	S3C2440DISP::SetPalette(const PALETTEENTRY *source, USHORT firstEntry, USHORT numEntries)
{
	RETAILMSG(DBGLCD, (TEXT("S3C2440DISP::SetPalette\r\n")));

	if (firstEntry < 0 || firstEntry + numEntries > 256 || source == NULL)
	{
		return	E_INVALIDARG;
	}

	return	S_OK;
}


VIDEO_POWER_STATE
PmToVideoPowerState(CEDEVICE_POWER_STATE pmDx)
{
	VIDEO_POWER_STATE vps;
	RETAILMSG(DBGLCD,(_T("++PmToVideoPowerState\r\n")));

	switch(pmDx) {
	case D0:        // turn the display on
		vps = VideoPowerOn;
		break;

	case D1:        // if asked for a state we don't support, go to the next lower one
	case D2:
	case D3:
	case D4:
		vps = VideoPowerOff;
		break;

	default:
		RETAILMSG(DBGLCD , (L"PmToVideoPowerState: mapping unknown PM state %d to VideoPowerOn\r\n", pmDx));
		vps = VideoPowerOn;
		break;
	}

	return vps;
}

// this routine maps video power states to PM power states.
CEDEVICE_POWER_STATE
VideoToPmPowerState(VIDEO_POWER_STATE vps)
{
	CEDEVICE_POWER_STATE pmDx;
	RETAILMSG(DBGLCD,(_T("++VideoToPmPowerState\r\n")));

	switch(vps)
	{
	case VideoPowerOn:
		pmDx = D0;
		break;

	case VideoPowerStandBy:
		pmDx = D1;
		break;

	case VideoPowerSuspend:
		pmDx = (CEDEVICE_POWER_STATE)D2;
		break;

	case VideoPowerOff:
		pmDx = (CEDEVICE_POWER_STATE)D4;
		break;

	default:
		pmDx = D0;
		RETAILMSG(DBGLCD, (L"VideoToPmPowerState: mapping unknown video state %d to pm state %d\r\n",
		         vps, pmDx));
		break;
	}

	return pmDx;
}

#define ESC_SUCCESS             0x00000001
#define ESC_FAILED              0xFFFFFFFF
#define ESC_NOT_SUPPORTED       0x00000000
ULONG  S3C2440DISP::DrvEscape(
                        SURFOBJ *pso,
                        ULONG    iEsc,
                        ULONG    cjIn,
                        PVOID    pvIn,
                        ULONG    cjOut,
                        PVOID    pvOut)
{	
	
    ULONG Result = 0;
	
    LPWSTR pszFname = L"S3C2440DISP::DrvEscape";

	RETAILMSG(DBGLCD1,(_T("++DrvEscape\r\n")));
	
    switch (iEsc)
    {
	case QUERYESCSUPPORT:
		if (sizeof (DWORD) == cjIn)
		{
			DWORD SupportChk;
			SupportChk = *(DWORD *)pvIn;
			
			if ((SupportChk == QUERYESCSUPPORT)          ||
			    (SupportChk == GETGXINFO)				 ||
				(SupportChk == GETPOWERMANAGEMENT)       ||
				(SupportChk == SETPOWERMANAGEMENT)       ||
				(SupportChk == IOCTL_POWER_CAPABILITIES) ||
				(SupportChk == IOCTL_POWER_QUERY)        ||
				(SupportChk == IOCTL_POWER_SET)          ||
				(SupportChk == IOCTL_POWER_GET))
			{
				Result = ESC_SUCCESS;
			}
			else
			{
				Result = ESC_NOT_SUPPORTED;
			}
		}
		else
		{
			SetLastError(ERROR_INVALID_PARAMETER);
			Result = ESC_FAILED;
		}
        break;
#ifdef ROTATE
	case DRVESC_GETSCREENROTATION:
		*(int *)pvOut = ((DMDO_0 | DMDO_90 | DMDO_180 | DMDO_270) << 8) | ((BYTE)m_iRotate);
        	Result =  DISP_CHANGE_SUCCESSFUL;
		break;
		
	case DRVESC_SETSCREENROTATION:
		if ((cjIn == DMDO_0) ||(cjIn == DMDO_90) ||(cjIn == DMDO_180) ||(cjIn == DMDO_270))
            	{
                	return DynRotate(cjIn);
            	}
        	Result = DISP_CHANGE_BADMODE;
		break;
#endif 		
    
    
	case GETGXINFO:
		    Result = GetGameXInfo(iEsc, cjIn, pvIn, cjOut, pvOut);
		    if (Result != ESC_SUCCESS)
            {
                // Shouldn't get here if everything was ok.
                SetLastError(ERROR_INVALID_PARAMETER);
                Result = ESC_FAILED;
            }
			break;
        case SETPOWERMANAGEMENT:
            if ((cjIn >= sizeof (VIDEO_POWER_MANAGEMENT)) && (pvIn != NULL))
            {
                PVIDEO_POWER_MANAGEMENT pvpm = (PVIDEO_POWER_MANAGEMENT)pvIn;
				
                if (pvpm->Length >= sizeof (VIDEO_POWER_MANAGEMENT))
                {
                    switch (pvpm->PowerState)
                    {
					case VideoPowerStandBy:
					case VideoPowerOn:
						SetDisplayPower(VideoPowerOn);
						Result = ESC_SUCCESS;
                        break;
						
					case VideoPowerOff:
					case VideoPowerSuspend:
						SetDisplayPower(VideoPowerOff);
						Result = ESC_SUCCESS;
                        break;
                    }
                }
            }
			
            if (Result != ESC_SUCCESS)
            {
                // Shouldn't get here if everything was ok.
                SetLastError(ERROR_INVALID_PARAMETER);
                Result = ESC_FAILED;
            }
			break;
			
        case GETPOWERMANAGEMENT:
			RETAILMSG(DBGLCD, (L"%s::GETPOWERMANAGEMENT\n", pszFname));
            if ((cjOut >= sizeof (VIDEO_POWER_MANAGEMENT)) && (pvOut != NULL))
            {
                PVIDEO_POWER_MANAGEMENT pvpm = (PVIDEO_POWER_MANAGEMENT)pvOut;
				
                pvpm->Length = sizeof (VIDEO_POWER_MANAGEMENT);
                pvpm->DPMSVersion = 0;
				
                pvpm->PowerState = m_VideoPowerState;
				
                Result = ESC_SUCCESS;
            }
            else
            {
                // Shouldn't get here if everything was ok.
                SetLastError(ERROR_INVALID_PARAMETER);
                Result = ESC_FAILED;
            }
			break;
			
        case IOCTL_POWER_CAPABILITIES:
            // tell the power manager about ourselves
            RETAILMSG(DBGLCD, (L"%s: IOCTL_POWER_CAPABILITIES\r\n", pszFname));
            if (pvOut != NULL && cjOut == sizeof(POWER_CAPABILITIES))
            {
                __try
                {
                    PPOWER_CAPABILITIES ppc = (PPOWER_CAPABILITIES) pvOut;
                    memset(ppc, 0, sizeof(*ppc));
                    ppc->DeviceDx = 0x11;	// support D0 and D4
                    Result = ESC_SUCCESS;
                }
                __except(EXCEPTION_EXECUTE_HANDLER)
                {
                    RETAILMSG(DBGLCD, (L"%s: exception in ioctl1\r\n"));
                }
            }
            break;
			
        case IOCTL_POWER_QUERY:
            if(pvOut != NULL && cjOut == sizeof(CEDEVICE_POWER_STATE))
            {
                // return a good status on any valid query, since we are always ready to
                // change power states.
                __try
                {
                    CEDEVICE_POWER_STATE NewDx = *(PCEDEVICE_POWER_STATE) pvOut;
                    if(VALID_DX(NewDx))
                    {
                        // this is a valid Dx state so return a good status
                        Result = ESC_SUCCESS;
                    }
                    RETAILMSG(DBGLCD, (L"%s: IOCTL_POWER_QUERY %u %s\r\n", pszFname, 
						NewDx, Result == ESC_SUCCESS ? L"succeeded" : L"failed"));
                }
                __except(EXCEPTION_EXECUTE_HANDLER)
                {
                    RETAILMSG(DBGLCD, (L"%s: exception in ioctl2\r\n"));
                }
            }
            break;
			
        case IOCTL_POWER_SET:
            if(pvOut != NULL && cjOut == sizeof(CEDEVICE_POWER_STATE))
            {
                __try
                {
                    CEDEVICE_POWER_STATE NewDx = *(PCEDEVICE_POWER_STATE) pvOut;
                    CEDEVICE_POWER_STATE CurrentDx;
                    if(VALID_DX(NewDx))
                    {
                        VIDEO_POWER_STATE ulPowerState = PmToVideoPowerState(NewDx);

                        SetDisplayPower(ulPowerState);

                        CurrentDx = VideoToPmPowerState((VIDEO_POWER_STATE)m_VideoPowerState);

                        Result = ESC_SUCCESS;
                        RETAILMSG(DBGLCD, (L"%s: IOCTL_POWER_SET %u: passing back %u\r\n", pszFname,
							NewDx, CurrentDx));
                    }
                    else
                    {
                        RETAILMSG(DBGLCD, 
							(L"%s: IOCTL_POWER_SET: invalid state request %u\r\n", pszFname, NewDx));
                    }
                }
                __except(EXCEPTION_EXECUTE_HANDLER)
                {
                    RETAILMSG(DBGLCD, (L"%s: exception in ioctl3\r\n"));
                }
            }
            break;
			
        case IOCTL_POWER_GET:
            if(pvOut != NULL && cjOut == sizeof(CEDEVICE_POWER_STATE))
            {
                __try
                {
                    CEDEVICE_POWER_STATE CurrentDx = D0;//VideoToPmPowerState((VIDEO_POWER_STATE)m_VideoPowerState);
                    *(PCEDEVICE_POWER_STATE) pvOut = D0; //CurrentDx;
                    Result = ESC_SUCCESS;
                    RETAILMSG(DBGLCD, (L"%s: IOCTL_POWER_GET: passing back %u\r\n", pszFname, 
						CurrentDx));
                }
                __except(EXCEPTION_EXECUTE_HANDLER)
                {
                    RETAILMSG(DBGLCD, (L"%s: exception in ioctl4\r\n"));
                }
            }
            break;
			
    }
	RETAILMSG(DBGLCD1,(_T("--DrvEscape\r\n")));
    return Result;
}

//#endif //CLEARTYPE

#undef ESC_NOT_SUPPORTED
#undef ESC_FAILED
#undef ESC_SUCCESS

void S3C2440DISP::SetDisplayPower(ULONG PowerState)
{
    	static BYTE * pVideoMemory = NULL;
	

    	WORD *ptr;

	RETAILMSG(DBGLCD,(_T("++SetDisplayPower\r\n")));

    // If we're already in the appropriate state, just return 
    if (m_VideoPowerState == PowerState)
    {
        return;
    }

    if (PowerState == VideoPowerOff)
    {
        m_VideoPowerState = VideoPowerOff;
		
        m_CursorDisabled = TRUE;
        CursorOff();
		
        // Save video memory
        if (NULL == pVideoMemory)
        {
            pVideoMemory = new BYTE [m_FrameBufferSize];
        }
		
        if (NULL != pVideoMemory)
        {
            memcpy(pVideoMemory, m_pPrimarySurface->Buffer(), m_FrameBufferSize);
        }
		
        // Blank the screen
        memset ((void*)m_pPrimarySurface->Buffer(), 0x0, m_FrameBufferSize);
		
        // Swap the buffer in the primary surface with that of our off screen buffer.
        if (NULL != pVideoMemory)
        {
            BYTE * pTempBuffer = (BYTE*)m_pPrimarySurface->Buffer();

            m_pPrimarySurface->Init(m_nScreenWidth, m_nScreenHeight, pVideoMemory, m_cbScanLineLength, m_pMode->format);

		  DynRotate(m_iRotate);
		  
            pVideoMemory = pTempBuffer;
        }
		
        // Let the setting take effect before disabling the controller
        Sleep(100);
		
       // disable LCD controller
	RETAILMSG(DBGLCD, (TEXT("SetDisplayPower: disable LCD controller \r\n")));
		
       // Set Board Control Register (BCR) for Sharp LCD mode
       //set_BCRVal (NOMASK, BCR_LCD_LQ039Q2DS01_16BPP | BCR_LCD_POWER_OFF | BCR_BACKLIGHT_OFF, INPOWERHANDLER);
		
	//Added by APR ++
	
		#ifdef SMARTFON
		v_s2440CLKPWR->CLKCON &= ~(1<<5);
		RETAILMSG(1,(TEXT("S3C2440DISP::SetDisplayPower Powered Down.\n")));
		#endif
		//APR --
    }
    else
    {
		//Added by APR ++ Turn the clock to LCD on
		#ifdef SMARTFON
		v_s2440CLKPWR->CLKCON |= (1<<5);
		RETAILMSG(1,(TEXT("S3C2440DISP::SetDisplayPower Powered Up.\n")));
		#endif
		//APR --
	
        m_VideoPowerState = VideoPowerOn;

        // init "palette" area - just has some flags for 16bpp active display mode
        ptr = (WORD*)m_VirtualFrameBuffer;
        ptr[0] = 0x2000;

        for(int index = 1; index < 16; index++)
        {
            ptr[index] = 0x00000000;
        }

        // clear rest of frame buffer out
        for(index = 0; index < 320*240; index++)
        {
            if(index < 3200)
            {
                ptr[index + 16] = 0xf800;
            }

⌨️ 快捷键说明

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